【Postfix/CentOS】NW検証用簡易メール送信サーバを構築する【3分で完成】

インフラサーバ

ネットワーク検証でのメール送信サーバの必要性

ネットワーク構築対応において、ファイアウォールポリシーや ACL でパケットフィルタリングをしている場合、必要な通信が許可されるかを検証する必要があります。

内部ネットワークにメール送信サーバ(SMTP サーバ)がある環境で、許可対象として SMTP(メール送信)がある場合、実際にメールを送信して成功するかを確認する必要があります。

そのためには検証用の SMTP サーバが必要になります。

検証環境のイメージとしては以下の図のような感じです。

以下では、検証用の SMTP サーバの構築方法について記載します。

なお、構築する SMTP サーバの設計方針は以下とします。

  • ユーザ認証は行わない
  • 外部メールサーバへのリレーは行わない
  • メール受信は考慮しない
  • サービスポートとして 25 の他、587 (サブミッションポート) でも受け付けるようにする

あくまで NW 検証用として構築するため、セキュリティについては一切考慮しません。

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 箇所です。

  1. mynetworks
  2. inet_interfaces
  3. 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 箇所です。

  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

Subject Body の内容に半角スペースを含める場合は上のコマンド例の様に内容を””で囲ってください。

Subject や Body の内容に全角文字を入れると受信側で文字化けします。全角文字を入れたい場合は、コマンドオプションに -Encoding UTF8 を追加してください。

Send-MailMessage コマンドを実行した結果、メール送信に成功した場合は PowerShell 上には何もメッセージが表示されずにプロンプトが返ってきます。

この方法で Gmail を宛先にメール送信すると Gmail 側では恐らく 100% 迷惑メールと判断されるため、受信側で受信確認をする場合は迷惑メールフォルダを確認してください。

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 側で作成したアプリパスワードを使用する必要があるため注意してください。

アプリパスワードの作成方法については以下のページが参考になりました。

PostfixからGmail経由でメールを送信するための設定メモ
Linuxサーバーからメールを送信したい場合に、よく標準でインストールされているメールサーバーソフトのPostfixから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 に記載したメールアドレスが表示されます。

参考資料

Send-MailMessage
PostfixからGmail経由でメールを送信するための設定メモ
Linuxサーバーからメールを送信したい場合に、よく標準でインストールされているメールサーバーソフトのPostfixからGmailを経由させて(これを「リレー」といいます)メールを送信するのが手軽で便利です。Gmailを経由させるには認証が


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