OP25B対策Part1 Linuxルータでポート変換(非推奨)での別解決策として書いたOP25B対策Part2 メールサーバを構築し別メールサーバに全転送【sendmail編】のPostfix編です。
CentOS6でOP25B対策の送信専用メールサーバをたてようかと思ったんですが、CentOS6ではpostfixがデフォルトのSMTPサーバになったようなので、今回はpostfixで挑戦して見ました。
ということで、Postfixの設定です。
設定ファイルは /etc/postfix/main.cf になります。
sendmailとは違い、よりUnixライクな設定の記述になっています。
Viエディタで設定をしていきます。
# vi /etc/postfix/main.cf
ホスト名、ドメイン名
ホスト名というかFQDNSを指定します。適当で構わないようです。
myhostname = mailsv.hoge.3ryu
ドメイン名を指定します。デフォルトでは、$myhostname から最初の要素をひいたものになるので、指定しなくていいかもしれません。
mydomain = hoge.3ryu
mailコマンド等送信元ドメインを指定しない場合に、ドメイン部分を何にするか決める設定です。
デフォルトは、myhostname の値が使われるようです。
myorigin = $myhostname
自身宛かどうか
宛先メールアドレスのドメイン名が以下の設定合うなら自身宛と判断し、保存します。
sendmailで言うところの /etc/mail/local-host-names と同じ設定です。
メール受け入れ設定
送られてきたメールを受け入れるか否かのアクセス制御を行います。
デフォルトは、localhost となっており、postfixがあるサーバ自身からのメールしか受け付けません。
以下のように localhost を all にすることで、すべてのホストからの受信を受け入れるようにします。
inet_interfaces = all
細かい転送制限は、次の項目で設定します。
転送制限設定
送られてきたメールを転送するかどうかのアクセス制御を行います。
デフォルトは、値が subnet になっており、このメールサーバと同じIPサブネット内のSMTPクライアントからのメールを転送するようです。
sendamilの、/etc/mail/access.db と同じ意味ですね。
mynetworks_style = subnet (デフォルト: サブネットワークを許可)
mynetworks_style = host (ローカルマシンのみを許可)
mynetworks_style = class (ローカルマシンと同じIPクラスA/B/Cに属するクライアントからのアクセスを許可。あまり好ましくない)
上記 mynetworks_style の設定よりも細かい設定をしたい場合は、mynetworks にて設定します。
("mynetworks"の設定をすると、"mynetworks_style" の設定そのものが無効になってしまう)
mynetworks = 127.0.0.0/8 (ローカルマシンのみを許可)
mynetworks = 127.0.0.0/8 168.100.189.2/32 (ローカルマシンと168.100.189.2の端末のみ許可)
mynetworks = 127.0.0.0/8 192.168.1.0/24 (ローカルマシンと192.168.1.0/24の端末のみ許可).
(区切りは、空白 カンマ が使える)
mynetworksは外部ファイルを指定することもできるようなので、送信元になるサブネットが多い場合は、外部ファイルで指定したほうがいいかもしれません。
転送丸投げ先設定
デフォルトではsendmailと同じように、Postfixはメールの宛先のMTAに直接配送しようとします。
今回は、プロバイダのメールサーバを経由させたいので、そのメールサーバに丸投げするようにします。
sendmailの define(`SMART_HOST', `[丸投げ先サーバ名') と同じ設定です。
relayhost = [am.wakwak.com]:587
sendmailと同じように転送先メールサーバ名に [ ] をつけるとDNS MX検索は行いません。通常は[]でくくっておきます。
また、ポート名もここで指定できるようです。(ポート名を明示しなければ 25 になります)
SMTP認証設定
上記の設定で、プロバイダSMTPサーバに丸投げするわけですが、たいていはSMTP認証が必要なので、ここで認証をするという設定してやります。
/etc/postfix/main.cf ファイルの最終行へ以下を追加
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
smtp_sasl_security_options = noanonymous
#↓認証方式を設定。プロバイダのSMTPサーバがどの認証に対応してるかはtelnetで確認。
smtp_sasl_mechanism_filter = DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN
これで、main.cfの設定は終わりです。
/etc/postfix/authinfo に認証情報を設定します。
# echo [SMTPサーバー名]:587 ユーザー名:パスワード > /etc/postfix/authinfo
# chmod 640 /etc/postfix/authinfo ←root以外参照できないようにパーミッション変更
# postmap /etc/postfix/authinfo ←authinfo.dbが作成される
(セキュリティのためauthinfoは root しかアクセスできないようパーミション変更することが望ましいかもしれません。)
main.cf を編集したら、postfixを再読み込みします。
/etc/rc.d/init.d/postfix reload
さて、これで届くはずと思いきや、届きません。
キューを見ると以下のようになっています。
# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
AF109A0536 939 Tue Dec 6 13:09:38 hoge@hoge.com
(SASL authentication failed; cannot authenticate to server am.wakwak.com[211.9.230.130]: no mechanism available)
-- 1 Kbytes in 1 Request.
サーバとのSMTP認証のメカニズムがあっていないようです。
結構悩んだんですが、Labs Zsrv Net - Postfixで、GMAIL経由でメールを送る(OP25B対策)、「Postfix」の設定で、ヒントが。。
結局認証種類別のcyrus-saslモジュールが入ってなかったことが原因でした。
当初以下の2つしか入っていませんでした。
cyrus-sasl-2.1.23-8.el6.i686
cyrus-sasl-lib-2.1.23-8.el6.i686
plainと、md5用のモジュールをインストールします。
# yum install cyrus-sasl-plain
これで、postfixを service postfix restart したらちゃんと送れるようになりました。
やはり、sendmailよりかは設定しやすいですね。
参考:
Postfix 基本設定 公式ドキュメントの日本語訳です。まずは一読する価値アリです。
◇Postfixについて◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆ sendmailの時もお世話になりました。非常にわかりやすく説明されています。
Postfix から Gmail 経由でメールを送る linux.matchy.net: ~Linuxで遊ぼう!~
Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth) - maruko2 Note.
OP25B対策(Outbound Port 25 Blocking対策)