3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

OP25B対策Part2 メールサーバを構築し別メールサーバに全転送【Postfix編】

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 と同じ設定です。

mydestination = $myhostname, localhost.$mydomain, localhost

メール受け入れ設定

送られてきたメールを受け入れるか否かのアクセス制御を行います。

デフォルトは、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)

hoge@hoge.com

-- 1 Kbytes in 1 Request.

サーバとのSMTP認証のメカニズムがあっていないようです。

結構悩んだんですが、Labs Zsrv Net - Postfixで、GMAIL経由でメールを送る(OP25B対策)「Postfix」の設定で、ヒントが。。

結局認証種類別のcyrus-saslモジュールが入ってなかったことが原因でした。

当初以下の2つしか入っていませんでした。

# rpm -qa | grep cyrus

cyrus-sasl-2.1.23-8.el6.i686

cyrus-sasl-lib-2.1.23-8.el6.i686

plainと、md5用のモジュールをインストールします。

# yum install cyrus-sasl-plain

# yum install cyrus-sasl-md5

これで、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対策)

OP25B(Outbound Port 25 Blocking)対策 - Fedoraで自宅サーバー構築

Postfixの小技

Postfix で、Gmail にメールをリレーする - 私の二次記憶