自宅で常時稼働させているサーバで,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を起動し,アカウント設定から,メールアカウントを追加しました.途中,接続確認ができるウィンドウが出ますが,サーバのホスト名のところを,IMAP・SMTPともsvのIPアドレスに変更してから,「再テスト」を行うと,うまくいきました.
とはいえ,起動してもウェルカムメールが来ているわけでなく,しかもここまでの設定だと,メールを書いてもサーバが受け取ってくれません.一つ一つ,対応していきました.
(最終更新:2013-04-07 朝.Dovecotを入れるコマンドを修正しました.)