(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2015年5月1日金曜日

【Postfix 2.6.6 x86_64】リレーの設定について【Linux CentOS 6.5 64bit】

下記の図式が示す構成において、Postfix( localhost )を経由してメール送信した際の考察と、
上位SMTPメールサーバへメールをリレーさせるための設定方法について


[SMTPserver( B.domain.tld )]---[SMTPserver( A.domain.tld )]---[※Postfix(-sendmail)]---[Clientマシン]

※ホスト名を仮に、postfix.local.tld としておき、Clientマシンから名前解決できるようにしておく。


下記情報を踏まえたうえで、さらにSTARTTLSでリレー先SMTPサーバに接続したい場合や、
複数のリレー先を用意しておいて、バックアップとして用いたい場合は、次のページを参照
http://akira-arets.blogspot.jp/2016/02/postfix-relay-starttls.html


■Postfixに、relayhost の設定は行わない場合の動作テスト

その場合は、メールのあて先へ直接届けられる。(main.cfに書かれた下記のコメント参照)
# The relayhost parameter specifies the default host to send mail to
# when no entry is matched in the optional transport(5) table. When
# no relayhost is given, mail is routed directly to the destination.
<実験>
1、Postfixローカルにおいてsendmailコマンドで、someone@A.domain.tld へメールを送ることができた。
(ただし、gooleのgmailのアカウントへ送信すると、spamメールとして扱われた。)

外部のメールサーバ(A.domain.tld)は、「自身が管理するメールボックス宛のメール」を受け取った。


2、ClientマシンからPostfixへSMTPで、root@postfix.local.tld 宛メールを送ることはできた。

Postfix(postfix.local.tld)は、自分が管理しているメールボックス宛メールを受け取った。
/var/spool/mail/root に送達されたメールを確認できた。


3、ClientマシンからPostfixへSMTPで、someone@A.domain.tld 宛メールを送信しようとすると、失敗した。

このとき、次のエラーがPostfixで発生した。
postfix/smtpd[7218]: NOQUEUE: reject:(略)Relay access denied
リレーを要する送信アクセスは初期設定では受け付けないわけだ。



■Postfix( local )に、relayhost の設定を行った

Postfix(10.10.10.10)が上位のメールサーバ(A.domain.tld)へリレーできるように設定を行った。

下記のようにして、Clientマシンが属するネットワークアドレス(192.168.0.0/16)を記述した。
Postfix自身のアドレス(10.10.10.10/32と127.0.0.0/8)もしくはネットワークアドレスも含むようにすること。
(間違えると、Postfixは起動しなくなる。)

# vim main.cf
(略)
mynetworks = 10.10.10.10/32, 127.0.0.0/8, 192.168.0.0/16
(略)
relayhost = A.domain.tld:587 (←サブミッションポートを使用するのでポートを指定した)
(略)

以上、リレーを許可する設定を行った後に、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

すると、ClientマシンのMUAでは、エラーは発生しなかったが、
しかし、Postfixのログ、/var/log/maillog を確認 すると、次のエラーが発生して送信に失敗していた。
Postfixは、relayhostとして設定した A.domain.tld:587 へ接続を試みたが、認証に失敗したようだ。
(host A.domain.tld[xxx.xxx.xxx.xxx] said: 530 AUTH first (#5.5.1)


そこで、 relayhost である A.domain.tld:587 へ接続するための認証情報を設定した。



・認証情報を作成した。

次のようにして認証情報を適当な名前のファイルに挿入した。
# echo "A.domain.tld:587 account:password" > /etc/postfix/relay_password

作成したファイルをハッシュ化した。
# postmap /etc/postfix/relay_password
# ls relay_password.db
relay_password.db

作成したデータベースが正常かを確かめた。
データベースに対して、クエリーを発行し認証情報が記録されているか確認をした。
# postmap -q A.domain.tld:587 /etc/postfix/relay_password
account:password



・main.cf に認証のための設定を追加した。
(エディタでもよいが、ここでは専用のコマンドで設定を行った。)

上記で作成した認証情報データベースを登録した。
# postconf -e smtp_sasl_password_maps=hash:/etc/postfix/relay_password
念のために確認すると、確かに、main.cf に次の設定を見つけられた。
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
# postconf -e smtp_sasl_auth_enable=yes
# postconf -e smtp_sasl_security_options=noanonymous



■上位SMTPサーバへリレーさせる動作テストを行なった

ここまで設定して、service postfix restart を行ってから、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

これで、上位サーバへリレーされるはずだと期待したが、
Postfixにおいて、次のエラーが発生して、送信に失敗した。
(SASL authentication failed; cannot authenticate to server A.domain.tld[xxx.xxx.xxx.xxx]: no mechanism available)
warning: SASL authentication failure: No worthy mechs found

googleで調べると、
上位SMTPサーバの種類によっては、さらにパッケージの導入が必要であるらしいことがわかった。


■プレインで認証するSMTPサーバにリレーするために必要なパッケージをインストールした

PLAINで認証情報が交換されるSMTP上位サーバとの通信のために必要なパッケージを追加した。
# yum install cyrus-sasl-plain

Name        : cyrus-sasl-plain
Arch        : x86_64
Version     : 2.1.23
Release     : 15.el6_6.2
Size        : 31 k
Repo        : updates
Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
License     : BSD
Description : The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
            : PLAIN and LOGIN authentication schemes.

# postconf -e smtp_sasl_mechanism_filter=plain,login


そうして、さらに動作テストを行った。

■結果
ClientのMUAからPostfixへSMTPで送信したメールは、
このPostfixによってさらに上位にあるSMTPサーバーへリレーされて、
冒頭の図式に挙げた、A.domain.tldや、B.domain.tldのメールボックスに到達した。


■結果(Gmaiのメールボックス宛メールの場合)

ただし、gmailのメールボックスに到達したメールはspam判定された。(到達はしていた)
到達したメールのヘッダーには次の二種類のタグがつけられていた。
Received-SPF: none (google.com: 送信元メールアドレス does not designate permitted sender hosts) client-ip=PostfixのグローバルIPv4アドレス
Authentication-Results: mx.google.com;
       spf=none (google.com: 送信元メールアドレス does not designate permitted sender hosts) smtp.mail=送信元メールアドレス

これは、送信メール(のエンベロープ)に指定された送信元メールアドレスに含まれるドメイン  A.domain.tld に対して、
GmailがSPFレコードを検索しようとしたところ、該当するレコードが見つからなかったというエラーである。
上記エラーログには、次のように示されている。
送信元メールアドレス(のドメインA.domain.tld)は、送信用ホストを指定していないという旨である。
送信元メールアドレス does not designate permitted sender hosts

SPFレコードは、メールの送信元ドメインが使用する送信元IPアドレスを予め登録しておくために利用される。
これによって、メールに記載された送信元ドメインと、送信元IPアドレスの関連付けがなされる。
関連付けがSPFレコードによって見つけられなければ、SPAMメールとして判断される場合がある。

回避するには、A.domain.tldにSPFレコードを設定し、
最初に通過したSMTPサーバであるPostfixのグローバルIPv4アドレスを登録する必要があると思われる。



<参考>
・SMTP fallback relay
< https://wiki.zimbra.com/wiki/Smtp_fallback_relay > 2016年2月15日

・Kurztipp: postfix – SASL authentication failure: No worthy mechs found
< http://www.stankowic-development.net/?p=5317 > 2015年5月5日

・SMTP-AUTHを使って上位メールサーバへ転送する
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix25.htm > 2015年5月5日

・上位メールサーバへ一律転送するメールサーバ
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix2.htm > 2015年5月5日

・Outgoing SMTP Authentication
< https://wiki.zimbra.com/wiki/Outgoing_SMTP_Authentication > 2015年5月5日

・Postfix SASL Howto
< http://www.postfix.org/SASL_README.html#client_sasl_policy > 2015年5月5日

・Postfixで、GMAIL経由でメールを送る(OP25B対策)
< http://blog.f13.jp/post/25843286280/postfix-gmail-op25b > 2015年5月5日

・Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)
< http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_%28SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth%29 > 2015年5月5日

・SASL authentication failure: No worthy mechs foundAdd Star
< http://d.hatena.ne.jp/machua/20120301/1330625122 > 2015年5月5日