ネットワーク検証でのメール送信サーバの必要性
ネットワーク構築対応において、ファイアウォールポリシーや ACL でパケットフィルタリングをしている場合、必要な通信が許可されるかを検証する必要があります。
内部ネットワークにメール送信サーバ(SMTP サーバ)がある環境で、許可対象として SMTP(メール送信)がある場合、実際にメールを送信して成功するかを確認する必要があります。
そのためには検証用の SMTP サーバが必要になります。
検証環境のイメージとしては以下の図のような感じです。

以下では、検証用の SMTP サーバの構築方法について記載します。
なお、構築する SMTP サーバの設計方針は以下とします。
- ユーザ認証は行わない
- 外部メールサーバへのリレーは行わない
- メール受信は考慮しない
- サービスポートとして 25 の他、587 (サブミッションポート) でも受け付けるようにする
SMTP サーバの構築(Postfix/CentOS)
ここでは Postfix を使用して SMTP サーバを構築します。
環境
- CentOS Stream 8
- postfix-3.5.8-4
Postfix のインストール
まずは CentOS Stream 8 で以下コマンドを実行して Postfix をインストールします。
dnf -y install postfix
設定ファイル main.cf の編集
Postfix の設定ファイルの一つである /etc/postfix/main.cf
を編集します。
編集する前にオリジナルをコピーしておきましょう。
cd /etc/postfix
cp -p main.cf main.cf_org
コピーできたら、vi で main.cf を開き編集していきます。
vi main.cf
main.cf の編集箇所は以下の 3 箇所です。
mynetworks
inet_interfaces
inet_protocols
mynetworks の設定
mynetworks
ではメール送信を許可するクライアントの IP アドレスを指定します。
デフォルトでは以下のようにコメントアウトされた記載のみがあります。
※Postfix バージョンにより異なる可能性があります
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
以下のように mynetworks の値としてメール送信を許可したいクライアントの IP アドレス(セグメント)を指定して追記します。値を複数指定する場合は、半角スペースかカンマで区切ります。
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks = 192.168.75.0/24 10.1.20.0/24
inet_interfaces の設定
inet_interfaces
ではメールを受け付けるインターフェースの IP アドレスを指定します。
デフォルトでは以下のように localhost
が設定されています。つまり、自身初のメールのみ受け付けるということです。
※Postfix バージョンにより異なる可能性があります
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
以下のように設定して、すべてのインターフェースでメールを受け付けるようにします。
inet_interfaces = all
の行の頭の#
を削除し、コメントアウトを解除inet_interfaces = localhost
の行の頭に#
を追加してコメントアウトする
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
inet_protocols の設定
inet_protocols
では、IPv4 と IPv6 の有効/無効設定を行います。
デフォルトでは以下のように、all と設定されていて IPv4 と IPv6 の両方が有効となっています。
inet_protocols = all
all だと IPv6 が優先されて上手く動作しないことがあるため、以下のように ipv4
と設定して IPv4 のみ有効とします。
inet_protocols = ipv4
main.cf の構文チェック
以下コマンドで main.cf の構文チェックを実施できます。
postfix check
[root@MAIL-SV postfix]# postfix check
[root@MAIL-SV postfix]#
上の実行例のように出力が何もなければ構文エラーは無いということになります。
設定ファイル master.cf の編集
続いて Postfix の設定ファイルの一つである /etc/postfix/master.cf
を編集します。
こちらも編集する前にオリジナルをコピーしておきましょう。
cd /etc/postfix
cp -p master.cf master.cf_org
コピーできたら、vi で master.cf を開き編集していきます。
vi master.cf
master.cf の編集箇所は以下の 1 箇所です。
- サブミッションポートの開放設定
サブミッションポート開放の設定
サブミッションポート 587 はデフォルトで閉じているため、これを開放する設定を行います。
master.cf の中身を見ると以下の記載があります。
#submission inet n - n - - smtpd
...
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
#submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
...
この submission の行のコメントアウトを解除します。
...
#dnsblog unix - - n - 0 dnsblog
#tlsproxy unix - - n - 0 tlsproxy
submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
...
postfix の再起動
以上の設定ができたら、postfix サービスを再起動して設定変更を反映させます。
# systemctl restart postfix
必要に応じて自動起動設定もしておきます。
# systemctl enable postfix
これで Postfix の設定は完了です。
サブミッションポート開放状況の確認
ss -natup | grep master
[root@MAIL-SV postfix]# ss -natup | grep master
tcp LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=2285,fd=16))
tcp LISTEN 0 100 0.0.0.0:587 0.0.0.0:* users:(("master",pid=2285,fd=21))
tcp LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=2285,fd=17))
tcp LISTEN 0 100 [::]:587 [::]:* users:(("master",pid=2285,fd=22))
上の結果からサブミッションポートの 587 が開放されていることが確認できます。
ファイアウォールの停止
クライアントからのメールを拒否しない様ファイアウォールは停止しておきます。
# systemctl disable --now firewalld
- 自動起動設定を無効化すると同時にサービスを停止するコマンドです
クライアントからのメール送信テストの実施方法
検証環境

クライアントからのメール送信方法
メール送信方法はいくつかあると思いますが、Windows 10 の PowerShell コマンドで実施する方法が最も簡単かと思います。
コマンドの基本的な構文は以下の通りです。
Send-MailMessage -To <宛先メールアドレス> -From <送信元メールアドレス> -Subject <タイトル> -Body <本文> -SmtpServer <SMTPサーバIPアドレス> -Port <25か587>
- 送信元メールアドレスとしては実在しない適当なドメインのアドレスを指定します。受信側にて送信元として表示されるアドレスになります
- メールにファイルを添付したい場合は
-Attachments <ファイルパス>
オプションを付与します
コマンド例:
Send-MailMessage -To atesaki@atesaki.com -From soushinmoto@soushinmoto.com -Subject testmail -Body "mail test" -SmtpServer 10.10.10.100 -Port 25
Postfix のログの確認
Postfix のログは /var/log/maillog
に保存されます。必要に応じてログを確認してください。
[root@MAIL-SV postfix]# tail /var/log/maillog
Mar 20 12:40:20 MAIL-SV postfix/smtpd[2467]: connect from unknown[10.1.20.2]
Mar 20 12:40:20 MAIL-SV postfix/smtpd[2467]: discarding EHLO keywords: CHUNKING
Mar 20 12:40:20 MAIL-SV postfix/smtpd[2467]: 8A5312072E5B: client=unknown[10.1.20.2]
Mar 20 12:40:20 MAIL-SV postfix/cleanup[2470]: 8A5312072E5B: message-id=<>
Mar 20 12:40:20 MAIL-SV postfix/qmgr[2287]: 8A5312072E5B: from=<soushinmoto@soushinmoto.com>, size=503, nrcpt=1 (queue active)
Mar 20 12:40:23 MAIL-SV postfix/smtp[2471]: 8A5312072E5B: to=<atesaki@atesaki.com>, relay=hoge-smtp-in.l.hoge.com[xxx.xxx.xxx.xxx]:25, delay=2.6, delays=0.02/0/1.9/0.62, dsn=2.0.0, status=sent (250 2.0.0 OK 1647747634 d23-20020a63d717000000b003824910a3e4si3915366pgg.627 - gsmtp)
Mar 20 12:40:23 MAIL-SV postfix/qmgr[2287]: 8A5312072E5B: removed
Mar 20 12:41:37 MAIL-SV postfix/smtpd[2467]: disconnect from unknown[10.1.20.2] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
外部へのメール送信に関する注意点
インターネット上のメールサーバに対してメールを送信する場合は、上記の方法だとプロバイダの OP25B(Outbound Port 25 Blocking)
によってメールがブロックされる可能性が高いです。
※筆者所持の WIMAX 経由の場合はブロックされませんでしたが。。
OP25B でメールがブロックされる場合は、外部サーバへリレーする設定をするなどの対策が必要となります。設定方法については以下に記載します。
Gmail サーバへリレーする設定方法
OP25B 対策として Gmail の SMTP サーバへリレーする設定をする方法を記載します。
この方法では Gmail アカウントが必要となります。
なお、この記事の上で記載してる SMTP サーバの設定が済んでいることを前提とします。
main.cf の設定
まず、/etc/postfix/main.cf
に対してメールをリレーするための以下設定を追加します。
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = encrypt
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = digest-md5 cram-md login plain
次に、main.cf 内に既存で以下の行が 2 行あるため、それを探してコメントアウトしておきます。
smtp_tls_security_level = may
↓
#smtp_tls_security_level = may
sasl_passwd の作成
上の main.cf の設定で、以下の設定をしましたが、この設定値になっている /etc/postfix/sasl_passwd
を作成します。
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
sasl_passwd
には、以下のようにメールリレーで使用する Gmail アカウントのメールアドレスとパスワードを記載します。
# vi /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 xxxxxxxx@gmail.com:<パスワード>
ここで、パスワードについては通常の Gmail のログイン用パスワードではなく、Gmail 側で作成したアプリパスワードを使用する必要があるため注意してください。
アプリパスワードの作成方法については以下のページが参考になりました。

sasl_passwd を作成できたら、以下コマンドを実行して sasl_passwd をハッシュ化します。
# postmap /etc/postfix/sasl_passwd
SASL 関連パッケージのインストール
メールリレーをする場合は、SASL 関連のパッケージが必要となります。
以下コマンドで必要パッケージをインストールします。
# dnf -y install cyrus-sasl-devel cyrus-sasl-md5 cyrus-sasl-plain
postfix の設定反映(再起動)
最後に postfix を再起動して設定変更を反映させます。
# systemctl restart postfix
以上でメールリレーの設定は完了です。
考慮点
- 上記のメールリレー設定を行った場合、postfix から Gmail サーバへの SMTP 通信時のポート番号は
587
になります - 上記のメールリレー設定を行った場合、メール受信側では送信元のメールアドレスとして
sasl_passwd
に記載したメールアドレスが表示されます。
参考資料
