わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

自宅メールサーバ

自宅で常時稼働させているサーバで,Subversionリポジトリコミットされたらメールを送るようにしました.
それに先立ち,メールサーバの配送や受信の設定もしました.手順や,トラブル対応などについて,整理しておきます.

前提

あるダイナミックDNSサービス*1を利用しています.以下では,ドメイン名を「dom.ain」と書きます.また,メールやSubversionのサーバとなるホスト名を「sv」とします.FQDNだと「sv.dom.ain」です.もちろん実態とは異なります.またIPアドレスや日時などは適宜,*でマスキングしています.
サーバはUbuntu 12.10です.回線と直結ではなく,間にブロードバンドルータを入れています.メールの設定前は,ポート番号22 (SSH)のみ,外からのアクセスをサーバに通すようにしていました.
コマンドはすべてrootで実行しています.一般ユーザtakehikom(したがってメールアドレスは「takehikom@dom.ain」)で端末を立ち上げてから,sudo -iを実行しておくことで,「sudo 」を書かないようにしています.またシェル変数eには,テキストエディタのコマンドを指定しています*2

dnsmasq

メールの前に,svのDNS設定をします.以前に他のマシンでやっていましたが,今回は別途,コマンドを実行していきました.

# apt-get install dnsmasq
# /etc/init.d/bind9 stop
# /etc/init.d/dnsmasq start
# update-rc.d -f bind9 remove
# update-rc.d dnsmasq defaults 15

ここで,svが参照するプライマリDNSサーバを127.0.0.1にします.すべてシェルから行うには,例えば[Ubuntu] NetworkManagerを使用しないネットワーク設定 - Life with ITのようなやり方がありますが,私はsvのデスクトップ(GUI)を使いました.画面右上のネットワークアイコン,そして「接続を編集する...」をクリックします.IPv4設定の「DNSサーバー(D)」について,ブロードバンドルータIPアドレスの前に「127.0.0.1,」を書き,保存します.最後にシェルから,「service network-manager restart」を実行します.
あとはdnsmasqで始めるプライベートDNSサーバ - GeekFactoryを見ながら,自分の環境に合うよう編集しました.

# $e /etc/dnsmasq.conf
(変更した箇所のみ)
domain-needed
bogus-priv
local=/dom.ain/
expand-hosts
domain=dom.ain
# $e /etc/hosts
192.168.**.***  sv.dom.ain sv
# service dnsmasq restart

PostfixとSASL

メールサーバ(MTA)には,慣れ親しんでいるPostfixを使用します.Postfix - Community Help Wikiの内容をもとに,自分なりに少し変えてみました.

# apt-get install postfix

画面(CUI)で,いくつか設定をします.メール設定の一般形式には「インターネットサイト」を選び,システムメール名は「sv.dom.ain」としました.

# update-rc.d -f exim4 remove
# service postfix stop
# postconf -e 'home_mailbox = Maildir/'

次はSASL関連のインストールと設定です.

# apt-get install libsasl2-2 sasl2-bin libsasl2-modules
# cat >> /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

証明書を作ります.

# cd /tmp
# touch smtpd.key
# chmod 600 smtpd.key
# openssl genrsa 1024 > smtpd.key
# openssl req -new -key smtpd.key -x509 -days 3650 -out smtpd.crt
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:sv.dom.ain
Email Address []:root@localhost
# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem.with_pass -out cacert.pem -days 3650
Enter PEM pass phrase:(パスフレーズを決めて入力)
Verifying - Enter PEM pass phrase:(パスフレーズを再入力)
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:sv.dom.ain
Email Address []:root@localhost
# openssl rsa -in cakey.pem.with_pass -out cakey.pem
Enter pass phrase for cakey.pem.with_pass:(パスフレーズを入力)
# mv smtpd.key /etc/ssl/private/
# mv smtpd.crt /etc/ssl/certs/
# mv cakey.pem /etc/ssl/private/
# mv cacert.pem /etc/ssl/certs/

上記のうち,cakey.pemは,いったんパスワードつきのものを作って,それから「openssl rsa -in cakey.pem.with_pass -out cakey.pem」によって取り除いています.ここは,より洗練された方法があるように思います.
次は,コマンドを実行して,/etc/postfix/main.cfに設定を加えていきます.

# postconf -e 'smtpd_sasl_local_domain ='
# postconf -e 'smtpd_sasl_auth_enable = yes'
# postconf -e 'smtpd_sasl_security_options = noanonymous'
# postconf -e 'broken_sasl_auth_clients = yes'
# postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
# postconf -e 'smtp_tls_security_level = may'
# postconf -e 'smtpd_tls_security_level = may'
# postconf -e 'smtpd_tls_auth_only = no'
# postconf -e 'smtp_tls_note_starttls_offer = yes'
# postconf -e 'smtpd_tls_key_file = /etc/ssl/private/smtpd.key'
# postconf -e 'smtpd_tls_cert_file = /etc/ssl/certs/smtpd.crt'
# postconf -e 'smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem'
# postconf -e 'smtpd_tls_loglevel = 1'
# postconf -e 'smtpd_tls_received_header = yes'
# postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
# postconf -e 'tls_random_source = dev:/dev/urandom'
# postconf -e 'myhostname = sv.dom.ain'

saslauthdがアクセスするファイルを準備します.

# service saslauthd stop
# $e /etc/default/saslauthd
START=yes
PWDIR="/var/spool/postfix/var/run/saslauthd"
PARAMS="-m ${PWDIR}"
PIDFILE="${PWDIR}/saslauthd.pid"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
# mkdir -p /var/spool/postfix/var/run
# dpkg-statoverride --force --update --add root sasl 755 /var/spool/postfix/var/run/saslauthd

これで準備OKのはず.サービスを起動します.

# service saslauthd start
# service postfix start

ついでに,chroot対応で,次の設定もしています.編集の際,コメントを外すとともに,いくつかの「-」を「n」に変更します.

# $e /etc/postfix/master.cf
smtp      inet  n       -       n       -       -       smtpd
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
# service postfix restart

Dovecot

Postfix + saslauthdは配送を担っており,受け取ったメールを読む方法には関与していません.Dovecotを入れ,IMAPでアクセスできるようにします.

# apt-get install dovecot-postfix dovecot-imapd
# $e /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
# service dovecot restart

Thunderbirdで動作確認

自宅ネットワーク内の常用Windowsマシン(したがってsvとは物理的に別)でThunderbirdを起動し,アカウント設定から,メールアカウントを追加しました.途中,接続確認ができるウィンドウが出ますが,サーバのホスト名のところを,IMAPSMTPともsvのIPアドレスに変更してから,「再テスト」を行うと,うまくいきました.
とはいえ,起動してもウェルカムメールが来ているわけでなく,しかもここまでの設定だと,メールを書いてもサーバが受け取ってくれません.一つ一つ,対応していきました.

(最終更新:2013-04-07 朝.Dovecotを入れるコマンドを修正しました.)

*1:更新は,サーバにddclientを入れています.

*2:例えば,bashで「e=vim