postfixでOutbound Port 25 Blocking(OP25B) 対策 -自宅サーバ編-

自宅サーバ(CentOS 7.2)でメールサーバを構築する際に、プロバイダがOutbound Port 25 Blocking(OP25B)を行っている場合に対応方法です。

Outbound Port 25 Blocking(OP25B)について

Outbound Port 25 Blocking(OP25B)とは、プロバイダーが迷惑メールを減らすために行ってる対策の1つです。

迷惑メールの大多数はプロバイダーのメールサーバは使用されず、ユーザのメールサーバから直接送信されるという特徴があります。

そのため、プロバイダーのメールサーバを使用せずにユーザから直接送信されるメールをブロックすることで、迷惑メールを減らそうという対策内容になります。

op25b_image

簡単に言うと、外向けの25番ポート(smtp)宛通信がブロックされるということです。

Outobound Port 25 Blocking(OP25B)対応方法

では、どのようにすれば自宅サーバからメールを送信することが出来るのかというと、下記のどちらかの方法でメールを送信を行うことができるようになります。(どちらの場合もSMTP認証が必要)

  • サブミッションポート(587番ポート)を使用
  • SMTP over SSL/TLS (465番ポート)を使用

※プロバイダによっては固定IPオプションで固定IP契約をすると、OB25Pの影響を受けないというところもあります。

これは、プロバイダーのSMTPサーバが用意しているサブミッションポート(認証機能付きの送信専用ポート)を使用することで、自宅サーバからもメールを送信することが可能となります。

今回は「postfix」での設定方法について説明していきます。

サブミッションポート(587番ポート)を使用する場合

自宅サーバから、プロバイダ等が提供しているSMTPサーバのサブミッションポートを使用する場合についての設定方法を説明していきます。

Cyrus SASLライブラリインストール

サブミッションポートを使用する場合には「ID」と「パスワード」による認証(smtp auth)が必要になります。

「postfix」からリレー先のsmtpサーバに「ID」と「パスワード」の認証情報をやり取りをするためには「Cyrus SASLライブラリ」が必要なので、インストールを行っていきます。

# yum install cyrus-sasl cyrus-sasl-plain

postfix設定

プロバイダーのメールサーバで提供しているサブミッションポートと連携できるように、「/etc/postfix/main.cf」を設定していきます。

# cd /etc/postfix
# cp -p main.cf main.cf_yyyymmdd
# vi main.cf

※postfixの基本的な設定は完了していることが前提です。
※基本的な設定についてはこちらのページで説明しています。

リレー設定

コメントで無効化されている「relayhost」の項目を編集して、メールをリレー(転送)するsmtpサーバを設定します。

smtpサーバはプロバイダ等で指定されているサーバを設定し、ポート番号はサブミッションポートである「587」番を設定します。

relayhost = [smtpサーバ]:587

※[]で囲むことでMXレコードを検索しないようになります。

SMTP認証と暗号化設定

リレー先のsmtpサーバのサブミッションポートを使用するに必要な、認証を行うための設定をします。

編集中の「main.cf」最下段に追記してください。

# SMTP認証設定
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_pass
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain,login

# 暗号化設定
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
SMTP認証設定
設定項目 設定
smtp auth SASL認証有効化 smtp_sasl_auth_enable = yes
SASL認証ファイル指定 smtp_sasl_password_maps = hash:認証ファイル
認証設定のセキュリティオプション指定 smtp_sasl_tls_security_options = noanonymous
認証方法の指定 smtp_sasl_mechanism_filter = plain,login

smtp auth SASL認証有効化

リレー先smtpサーバでのSMTP AUTH認証に対応できるように、SASL認証を有効化します。

SMTP認証情報ファイルを指定

SASL認証に必要な情報(smtpサーバ:ポート番号 ユーザID:パスワード)を記述してあるファイルを指定します。
このファイルは自分で作成する必要があるため、好きな名前でファイルを作成してかまいません。

作成した認証情報のファイルはhash化する必要があります。(作成方法は後述で説明します)

認証設定のセキュリティオプションを指定

anonymous(匿名)ユーザでのログインを許可しない設定とします。

デフォルトの設定は「noanonymous,noplaintext」なのですが、プロバイダが用意しているSMTPサーバでは「plain」(暗号化なし)での認証が有効化されていることが多いため、「noplaintext」を記述しないことで「plain」(暗号化なし)での認証を許可しています。

認証方法の指定

プロバイダで用意されているsmtpサーバの場合、一般的に「plain」と「login」方式が有効となっている場合が多いため、両方の方式を指定します。

接続先のsmtpサーバで「CRAM-MD5」「DIGEST-MD5」などの認証方式が使用できるのであれば、そちらも指定することができます。

対応している認証方式の確認方法

相手のsmtpサーバで対応している認証を方式を確認するためには、「telnet」でサブミッションポートに接続してから「EHLO 相手先SMTPサーバ名」コマンドを実行することで確認することができます。

下記はOCNのSMTPサーバで確認した際のログになります。

$ telnet smtp.ocn.ne.jp 587
Trying 153.149.232.193...
Connected to smtp.ocn.ne.jp.
Escape character is '^]'.
220 ocn.ne.jp ESMTP mail service ready
EHLO smtp.ocn.ne.jp    ## EHLOコマンドを実行
250-smtp.ocn.ne.jp
250-SIZE 10485760
250-AUTH PLAIN LOGIN  ## 対応している認証方式が表示される
250-AUTH=PLAIN LOGIN
250-STARTTLS
250 ENHANCEDSTATUSCODES
quit                ##「quit」コマンドで切断
221 2.0.0 Bye
Connection closed by foreign host.
通信暗号化設定
設定項目 設定
TLS暗号化使用 smtp_tls_security_level = may
TLS暗号化のログ出力設定 smtp_tls_loglevel = 1

TLS暗号化使用

「smtp_tls_security_level = may」を設定することで、相手先のsmtpサーバが「TLS」に対応してれば暗号化で通信を行い、対応していない場合は暗号化なしの平文で通信をおこないます。

「postfix 2.1」以前は「smtp_use_tls = yes」を使用していたが「postfix 2.2」以降は「smtp_tls_security_level」の使用が推奨されています。

暗号化設定のログ出力設定

ログのレベルを「0」~「4」の5段階で指定することができます。

指定できるログレベルの詳細は下記の通りとなり、ログ出力を行いたくない場合は「0」を指定します。

ログレベル詳細
  • 0 TLS関するログ記録を無効
  • 1 TLSハンドシェイクと証明書情報をログに出力
  • 2 TLSネゴシエーションの間のレベルをログに出力
  • 3 TLSネゴシエーションプロセスの16進数とASCIIダンプをログに出力
  • 4 STARTTLS以降の通信の16進数と完全なASCIIダンプをログに出力

認証情報ファイルの作成方法

「/etc/postfix/main.cf」のSMTP認証項目「smtp_sasl_password_maps = hash:ファイル名」で指定した、認証情報が記述されたファイルの作成方法です。

今回は「/etc/postfix/smtp_pass」というファイルを作成して、そこに認証情報を設定してからhashDB化していきます。

認証情報ファイルの作成

# vi /etc/postfix/smtp_pass
設定書式

SMTP AUTHに認証に必要な情報は下記の書式で設定します。

[相手先smtpサーバ]:587 ユーザID:パスワード

相手先smtpサーバの記述は「/etc/postfix/main.cf」の「relayhost」で設定した内容と合わせてください。

プロバイダのSMTPサーバを使用する場合は、「ユーザID」「パスワード」はメールアドレスとメールを受信する際のパスワードの場合が一般的だと思いますが、念のためにプロバイダのサイト等で確認しておいてください。

パーミッションの変更

作成したファイルには「ユーザID」と「パスワード」記述されているので、他のユーザに見られないようパーミッションを「600」に変更します。

# chmod 600 smtp_pass

認証ファイルのhash化

作成したファイルを「postmap」コマンドを使用してhash化します。

# postmap /etc/postfix/smtp_pass

「postmap」コマンドでhash化させると、「ファイル名.db」というファイルが作成されます。

# ls -la smtp_pass*
-rw------- 1 root root    55 11月 19 16:04 smtp_pass
-rw------- 1 root root 12288 11月 22 18:08 smtp_pass.db

「postfix」はこのファイルを読み込む形となります。

設定反映

「/etc/postfix/main.cf」の編集と認証情報ファイル(smtp_pass.db)の作成が完了しましたら、「postfix」を再起動させて設定を反映させます。

# systemctl restart postfix

動作試験試験

実際にメールを送信して動作確認をしてください。

無事メールが送信出来たら作業完了です。

※今回の「postfix」に行った設定は、プロバイダ等のsmtpサーバのサブミッションポートにメールをリレーする設定ですので、メーラーでsmtpサーバを指定する場合は「25」番ポートを使用してください。

コメント

  1. Probmkr より:

    証明書が期限切れです。

    • tamohiko より:

      Probmkr さん

      ご指摘ありがとうございます。
      期限切れ把握していなかったので助かりました。

  2. 藤原隆 より:

    tamohiko さん

    たびたびのコメントありがとうございます。
    >OP25B対策のリレー先として「eo net」を指定した場合はメールの送受信ができるが、「gmail」や「yahoo」を指定するとエラーで自宅サーバからメールが送信できないという認識で間違いないでしょうか?

    その通りです。
    但し「eo net」はメール送受信はできるが…
    については、リレー先を指定してなかった時の結果かもしれません。しかも
    eoメールに届くまでにかなり時間がかかった気がします。少し混乱しています。

    今日もう一度テスト送信してみた時の、/var/log/maillogの結果を下記に記します。少し長文ですが。

    Sep 30 14:46:07 web1 postfix/smtp[8153]: connect to smtpauth.eonet.ne.jp[2001:ce8:0:603::12]:587: Network is unreachable

    Sep 30 14:46:07 web1 postfix/smtp[8153]: warning: SASL authentication failure: No worthy mechs found

    Sep 30 14:46:07 web1 postfix/smtp[8153]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=2.3, delays=2.1/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    Sep 30 14:46:08 web1 postfix/smtp[8153]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=2.3, delays=2.1/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    Sep 30 14:46:08 web1 postfix/smtp[8153]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=2.3, delays=2.1/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    Sep 30 14:55:50 web1 postfix/qmgr[8130]: A15705F4F0: from=, size=757, nrcpt=3 (queue active)
    Sep 30 14:55:50 web1 postfix/smtp[8186]: connect to smtpauth.eonet.ne.jp[2001:ce8:0:603::12]:587: Network is unreachable
    Sep 30 14:55:50 web1 postfix/smtp[8186]: warning: SASL authentication failure: No worthy mechs found
    Sep 30 14:55:50 web1 postfix/smtp[8186]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=585, delays=585/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    Sep 30 14:55:50 web1 postfix/smtp[8186]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=585, delays=585/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticae to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    Sep 30 14:55:50 web1 postfix/smtp[8186]: A15705F4F0: to=, relay=smtpauth.eonet.ne.jp[203.140.81.12]:587, delay=585, delays=585/0.07/0.11/0, dsn=4.7.0, status=deferred (SASL authentication failed; cannot authenticate to server smtpauth.eonet.ne.jp[203.140.81.12]: no mechanism available)

    • tamohiko より:

      藤原さん

      ログの方ありがとうございます。
      内容確認させていただきました。

      (1) Network in unreahable

      > Sep 30 14:46:07 web1 postfix/smtp[8153]: connect to smtpauth.eonet.ne.jp[2001:ce8:0:603::12]:587: Network is unreachable

      このエラーは「postfix」がIPv6を使ってメールを送信しようとしたが、IPv6のネットワーク設定が出来ていないために「Network is unreachable」となり、通信が出来ないために発生しているエラーですね。

      IPv6を使用しないのであれば、「/etc/postfix/main.cf」の「inet_protocols」の設定で、ipv4だけを使用するように設定を変更すれば上記のエラーは発生しないようになると思います。

      【変更前】 inet_protocols = all
      【変更後】 inet_protocols = ipv4

      (2) SASL authentication failure: No worthy mechs found

      > Sep 30 14:46:07 web1 postfix/smtp[8153]: warning: SASL authentication failure: No worthy mechs found

      このエラーはSASLのアプリが無くて認証に失敗している場合によく見るエラーなので、下記のsasl関連のパッケージがインストールされているか確認してみてください。

      ・cyrus-sasl
      ・cyrus-sasl-plain

      確認は下記のコマンドで行えます。

      # rpm -qa | grep sasl

      あとは、「/etc/postfix/main.cf」で「smtp_sasl_mechanism_filter」の設定に間違いがないかを確認してみてください。

      【main.cf 設定例】
      smtp_sasl_mechanism_filter = plain,login

      設定変更後はpostfixを再起動するなりして、設定の反映を忘れずに行ってください。

      もし、これでも「No worthy mechs found」が出るようでしたら、「cyrus-sasl-md5」を追加でインストールして、「main.cf」の「smtp_sasl_mechanism_filter」設定に「cram-md5」を追加して試してみてください。

      【main.cf 設定例】
      smtp_sasl_mechanism_filter = cram-md5,plain,login

      (3) gmailやyahooメールの問題について

      ご提示いただいたログでは「gmail」や「yahoo」へメールリレー時のログが無いため、メールが送信できない原因につきましては判断することができませんでした。

      • 藤原隆 より:

        tamohikoさんへ

        暫くこのページを覗いてなかったので、テスト&結果報告が遅くなりました。
        教えていただいたことを対処の結果、すべて問題は解決できました。
        ありがとうございました。

        結果は以下の通りです。
        ①プロトコルは、IPV4に限定し、エラーは出ていません。
        ②メールの送信は、yahooメール、Gメールを含めて全て受信できました。
         sasl関連のパッケージは全てインストールされていました。
         eo-netを調べた結果cram-md5にも対応していましたので、
         cyrus-sasl-md5をインストールし、smtp_sasl_mechanism_filterに
         追記しました。

        スマホを4Gモードにして送受信テストし、/var/log/maillogを確認するようにしてテストしたのでOKと思います。

        なお、追加ですがメールソフトの送信ポートを587にすると同一LAN内では
        受信できますが、家のLAN外では受信できません。
        記事にあったようにポートは25にして送受信可能でした。

      • tamohiko より:

        藤原さん

        結果についてコメントありがとうございます。

        とりあえず、問題は解決できたようで何よりです。
        また、何か疑問点等ありましたらお気軽にコメントねがいますね。

  3. 藤原隆 より:

    記事を参考に何とかプロバイダからのメールと自分のサーバーメール(CentOS6.9)との送受信ができるようになりました。
    が、ネット契約をしていないISPのWebメール(例えば、Yahoo、Googleなど)
    とはどうしたらいいのでしょうか?
    認証ファイルに併記する形で良いのでしょうか?

    • tamohiko より:

      藤原さん

      コメントありがとうございます。
      また、お返事が遅くなってしまい申し訳ありません。

      > が、ネット契約をしていないISPのWebメール(例えば、Yahoo、Googleなど)とはどうしたらいいのでしょうか?
      > 認証ファイルに併記する形で良いのでしょうか?

      例えば、google(gmail)のsmtpサーバをrelayhostとして指定するのであれば、認証ファイルにはgmailのアカウント情報だけを設定してあげればよいと思います。

      • 藤原隆 より:

        tamohikoさん

        返事ありがとうございます。
        質問の仕方が、悪かったかと思います。
        現在プロバイダ(eo net)で入手したメールと自分のサーバーのメールとの送受信はできています。
        それ以外に、g-mail、yahoo mailなどともメールのやり取りがしたいのですが、
         g-mail、yahoo mail(自宅外のWiFi)→→自分のサーバーのメール は、 
          メール届きます。
         逆方向の自分のサーバーのメールからのメールが届きません。

        /var/log/maillog を見ると、送信はしているようですが、timed out とか
        unrechable とかで、届かないようなのですが、これを解決する方法が知りたかったのですが……

        よろしくお願いします。

      • tamohiko より:

        藤原さん

        ご質問の内容について確認させてください。

        OP25B対策のリレー先として「eo net」を指定した場合はメールの送受信ができるが、「gmail」や「yahoo」を指定するとエラーで自宅サーバからメールが送信できないという認識で間違いないでしょうか?

        > /var/log/maillog を見ると、送信はしているようですが、timed out とか
        > unrechable とかで、届かないようなのですが、これを解決する方法が知りたかったのですが……

        正確なエラーログをお教えいただければ、もう少し詳しい状況が分かると思いますので、問題のない範囲の内容でかまいませんので正確なログを教えていただけますでしょうか。

        お手数をおかけしますが、よろしくお願いいたします。

        【2017.09.24 追記】
        gmailを使用する場合は、「gmail」の設定で「安全性の低いアプリの許可」を有効にする必要があるみたいです。

        参考URL https://support.google.com/mail/answer/78754

        「安全性の低いアプリの許可」設定は下記のURLから行うことができます。
        https://myaccount.google.com/lesssecureapps

タイトルとURLをコピーしました