server-memo.net

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

      2016/12/24

自宅サーバ(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」番ポートを使用してください。

SMTP over SSL/TLS(465番ポート)を使用する場合

自宅サーバから、プロバイダ等が提供している「SMTPサーバのSMTP over SSL/TLS(465番ポート)」を使用する場合についての設定方法を説明していきます。

stunnelのインストール

# yum install stunnel

stunnel設定

stunnelの設定ファイルを新規に作成していきます。

# vi /etc/stunnel/stunnel.conf

設定内容

  • accept 待ち受けポート
  • client
  • connect 接続先
[smtps]
accept = 10465
client = yes
connect = smtp.ocn.ne.jp:465

# systemctl start stunnel

stunnel自動起動設定

systemd制御用スクリプト作成

# vi /etc/systemd/system/stunnel.service

設定内容

[Unit]
Description=stunnel daemon
After=syslog.target network.target

[Service]
ExecStart=/bin/stunnel /etc/stunnel/stunnel.conf
ExecStop=kill -9 $(pgrep stunnel)
ExecStatus=pgrep stunnel
Type=forking

[Install]
WantedBy=multi-user.target

自動実行設定

# systemctl enable stunnel
Created symlink from /etc/systemd/system/multi-user.target.wants/stunnel.service to /etc/systemd/system/stunnel.service.

cyrusをインストール

smtp認証を暗号化通信で行う場合はインストールします。

# yum install cyrus-sasl cyrus-sasl-plain

postfix設定

stunnel連携設定とsmtp認証(SMTP Auth)設定

main.cf設定

リレー設定

「stunnel」を経由してメールを送信するため、ロカールホスト(127.0.0.1)の10465番ポートにリレーする設定をします。

relayhost = [127.0.0.1]:10465  リレー先のSMTPサーバを設定

smtp auth設定

smtp_use_tls = yes  TLS暗号化を使用する場合
smtp_sasl_auth_enable = yes   smtpクライアントのSASL認証を有効化
smtp_sasl_password_maps = hash:/etc/postfix/smtp_pass   SMTP認証情報が記述されたファイルを指定
smtp_sasl_tls_security_options = noanonymous  anonymousユーザを禁止
smtp_sasl_security_options = noanonymous 
smtp_sasl_mechanism_filter = plain

認証情報ファイル作成

認証用のユーザとパスワードを設定

/etc/postfix/smtp_pass設定

# cd /etc/postfix/
# vi smtp_pass

設定内容

[127.0.0.1]:10465 ユーザ名:パスワード
パーミッションの変更

「ユーザ名」と「パスワード」が他のユーザに見られてしまうといけないので、パーミッションを「600」に変更します。

# chmod 600 smtp_pass

/etc/postfix/smtp_pass.db作成

# postmap /etc/postfix/smtp_pass

 - postfix