Postfixのsmtpクライアント設定 | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

GWに突入するちょっと前の休日、4/29(昭和の日)に秋葉原へ行ってパーツを買込んできました。
※秋葉原うさぎ神社とかのオープン日で、巫女さんにコスプレしたおねいさんがチラシを配っていました。

Core2Duo E7400 2.8GHz
ZOTAC nForce 610i-ITX
WDC WD10EADS 1TB
DDR2-800 2GBx2


今回はMini-ITXというとても小さなマザーボードです。
ハードウェアの話はさておき、このPCにWindows XP homeをインストールし、仮想化用にVMwareを入れてみました。
VMware Server Version 2.0.1 Build 156745
ここに、ゲストOSとしてDebian GNU Linux 5.0 lennyをインストールしました。

このlennyの役割は、自宅内のDHCPサーバ&ダイナミックDNS、sambaサーバを動かしてバックアップ用ファイルサーバ、そして送信専用のメールサーバです。
メインのメールサーバはVPSサーバをレンタルして外部においてあるのですが、ちょっと大きい添付ファイルを送付するにはレスポンスが悪いので、ローカルにメールサーバを設置してみました。

lennyのインストール、postfixの設定… と、順調に進みますが問題はプロバイダーが実施しているアウトバウンド25番ポートブロックです。 メールクライアントであれば、サブミッションポートの指定とSMTP認証の設定をすれば終わりですが、postfixのようなMTAではどうするのでしょうか?

まずは、この辺を参考にゴニョゴニョしてみます。

【前提条件】
○自宅のサーバは、動的IPアドレスを割り当てられるので固定IPではない。
○インバウンドのメール受信は無し。
○あくまで送信専用の設定で、実際の配送はグローバルにあるMTAが行う。
 (つまり、スマートホストへ送るだけ)
○グローバルにある主メールサーバの設定は…
  ・postfix 2.3系
  ・25, 587 open, smtp auth & TLS ready

【設定後の動作】
○自宅サーバより、グローバルにあるメールサーバの587(サブミッションポート)に接続し、TLSで経路を暗号化した後、Plain text(平文)によるsmtp認証を行い、メールを転送する。


まずは、smtp認証を行うためのIDとパスワードの設定をします。
/etc/postfix/sasl_passwd というファイルを作成し、内容は…
[hoge.sample.com]:587     hogehoge:hogepass
hoge.sample.comが主メールサーバで、hogehogeがsmtp認証で使うIDで、hogepassがパスワードです。
サーバ名は[ ]で括ってください。括らないとpostfixが自動的にmxレコードを調べてそのサーバ名に置き換えます。 逆な言い方をすると、もし複数のMXレコードが存在し、そこに記載されているサーバどれに接続しても大丈夫であれば、わざと[ ]を使わない設定もありです。 その場合は、mxの優先順位も考慮されますし、もし上位のサーバに接続できない場合には次の優先順位のサーバへ…という、冗長性も確保できます。

ファイルが出来上がったら、postmap /etc/postfix/sasl_passwd で、dbファイルを作成してください。

次にmain.cfの設定変更です。以下の設定を追加してください。
relayhost                  = [hoge.sample.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

postfix reload して、動作確認です。この状態ではTLSを使ってないので平文で認証してメールを転送しますが、ちゃんと動作するか確認します。 もちろん、ローカルだけに配送するならsmtp認証は必要ありません。 つまり、relayhostの設定だけで動作します。

この設定で問題が出なければ、次にTLSによる経路の暗号化です。
lennyであれば、デフォルトで最低限のTLSの設定はできていて、以下の設定がmain.cfに書かれています。
(etchの方は参考にしてみて下さい)
# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

ここで新しいモジュールの追加が必要です。
aptitude install libsasl2-modules
これがないと、
warning: SASL authentication failure: No worthy mechs found
なんていうエラーがログに出ます。

次に、TLSで通信するための設定ですが、極めて簡単です。
smtp_use_tls                    = yes
smtp_tls_loglevel = 1

を書くだけです≧∇≦
ログレベルを1にすると、認証を行った経緯がログに記載されます。
※もちろん、動作確認が終わったら消してしまってOKです。

これで、TLSを使い経路を暗号化してメール転送が出来ます。

【おまけ】
グローバルにある主メールサーバの設定で、
smtpd_tls_received_header = yes
という記述をmain.cfに書いておくと…
メールのヘッダーに、
	(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
(No client certificate requested)
なんて表示が残ります。