Postfix の OP25B 対策

うちで使っているプロバイダは制限が緩い所で、これまでメール送信についてなにも対策されていなかったのですが、ついに時代の流れか、 Outbound Port 25 Blocking が始まることになり、Postfix+mailmanで運用していたメーリングリストがうまく動かなくなりました。

情報を探して、以下の設定を /etc/postfix/main.cf に加えてみるも、うまく行かず。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
smtp_sasl_security_options = noanonymous

通信状態を tcpdump で見ると、リレー先であるプロバイダのSMTPサーバに対して DIGEST-MD5 方式で認証を行おうとして失敗しているのが分かりました。

telnetでプロバイダのSMTPサーバで利用可能な認証方式を確認すると、GSSAPI、DIGEST-MD5、CRAM-MD5、LOGIN、PLAIN の5つです。

220 MTA ESMTP
EHLO localhost
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 10240000
250-DSN
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP

PLAIN認証ならどうかと思い、ruby で試してみました。

require 'net/smtp'

smtp = Net::SMTP.new("smtp.example.com", 587)
smtp.set_debug_output($stderr)
smtp.start("localhost", "user", "password", :plain)
smtp.finish
$ ruby smtpauthtest.rb
opening connection to smtp.example.com...
-> "220 MTA ESMTP\r\n"
<- "EHLO localhost\r\n"
-> "250-smtp.example.com Hello xxxxx.ne.jp , pleased to meet you\r\n"
-> "250-ENHANCEDSTATUSCODES\r\n"
-> "250-PIPELINING\r\n"
-> "250-8BITMIME\r\n"
-> "250-SIZE 10240000\r\n"
-> "250-DSN\r\n"
-> "250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN\r\n"
-> "250-DELIVERBY\r\n"
-> "250 HELP\r\n"
<- "AUTH PLAIN xxxxxxxxxxxxxxxxxx==\r\n"
-> "235 2.0.0 OK Authenticated\r\n"
<- "QUIT\r\n"
-> "221 2.0.0 smtp.example.com closing connection\r\n"

PLAIN認証は成功しています。なお、'net/smtp'ライブラリでは、PLAIN,LOGIN,CRAM-MD5が利用可能ですが、PLAIN,LOGINで認証成功、CRAM-MD5は認証失敗となりました。

ともかく、DIGEST-MD5ではなくPLAIN認証を使用すればうまくいきそうだと分かったんですが、調べてみたところ Postfix 2.2 以降なら smtp_sasl_mechanism_filter というパラメータで認証方式を限定できるようなのですが、これまで使っていた Debian sarge に入っている Postfix 2.1.x での設定方法はよく分かりませんでした。

結局、サーバをsargeから、Postfix 2.3.x が使われている etch にアップグレードして、以下の設定を main.cf に追加することで、PLAIN認証が使用されるようになりました。

smtp_sasl_mechanism_filter = plain, login

でもちょっとすっきりしないかな?できればDIGEST-MD5認証を使いたいし。