Postfixを使ったメール送信専用中継サーバーの構築

Linux

Postfixによるメールリレーサーバーを構築方法を解説します。

筆者の環境では、Zabbixでネットワーク機器を監視しており、障害を検知するとLolipopのメールサーバーに通知するようにしています。

Zabbixから直接Lolipopサーバーにメールを飛ばしても良いのですが、最近は迷惑メール対策でメールサーバーのセキュリティ要件が変更されることが多いため、ローカル内にPostfixメールリレーサーバーを構築し、Zabbix側の設定を変更をしないようにしています。

システム環境

システム環境、及び、設定値は以下のイメージで解説します。

環境条件

  • 障害通知メールは、Zabbixより自動送信とする
  • メールは自分(info@falconblog.org)から自分(info@falconblog.org)に送信する(ほとんどのメールサーバーは、from:アカウントが存在しないと送信メールを廃棄します)
  • Zabbixは、外部メールサーバー(lolipop: info@falconblog.org)のメールパスワードを知らない
  • Postfixは、ローカルサーバーからのメールのみを中継対象とし、SMNP:ポート25で受信して外部メールサーバー(lolipop社のメールサーバー)SMNP:ポート465/587へリレー中継する
  • メール受信は汎用のWindows端末(Thunderbird等で受信)で行う

OSはProxmox8上にRocky Linux 9を構築しました。

Ubuntu22.04LTSでもpostfixは構築できるようですが、自己証明書を別途入手する必要があります。

全般的に認証を用いるサーバーを組む場合は、CentOS系のほうが楽に構築できます。(Free RADIUSやDHCPdなどもCentOS系のほうが早く組めます。)

Postfix中継メールサーバーの構築手順

事前準備作業(SELinux, Firewallの解除とIPアドレス固定)

CentOS系はSELinuxとFirewallがデフォルトで動作しています。

認証系システムを組む場合は、どこで疎通が遮断されているかわからなくなるため、最初にdisableしてから設定を進めるようにします。

SElinuxとFirewallが要求される環境の場合は、構築後に有効化するほうが良いでしょう。

SELinuxの無効化

/etc/selinux/config ファイルを開き、SELINUX=enforcing を SELINUX=disabled に変更してファイルを保存、再起動します。

sestatus でステータスを確認し、disableになっていることを確認します。

[root@relay postfix]# nano /etc/selinux/config
SELINUX=disabled  ←編集する

[root@relay postfix]# reboot

~再起動後~

[root@relay postfix]# sestatus
SELinux status:                 disabled

Firewallの無効化

続いてFirewallを無効化します。

[root@relay postfix]# systemctl stop firewalld
[root@relay postfix]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:firewalld(1)

systemctl status でinactiveとなっていれば無効化できています。

IPアドレス固定

OSインストール直後は、IPアドレスがDHCPに設定されていますので、nmcliコマンドでIPアドレスを固定します。

nmcli d, nmcli cで起動しているインタフェース名を確認します。

# nmcli d
DEVICE  TYPE      STATE            CONNECTION
ens18   ethernet  接続済み         ens18
lo      loopback  接続済み (外部)  lo
# nmcli c
NAME   UUID                                  TYPE      DEVICE
ens18  739f0dc5-7b66-391d-9d2e-a4cbede8c1d2  ethernet  ens18
lo     c060bae0-8b8c-4787-a6b0-04bf3dcbdeea  loopback  lo

nmcli cでipアドレス設定を行い、DHCP設定を解除します。

# nmcli conn mod ens18 ipv4.addresses 192.168.0.131/24 →IPアドレスの設定
# nmcli conn mod ens18 ipv4.gateway 192.168.0.1      →gatewayの設定
# nmcli conn mod ens18 ipv4.dns 192.168.0.1            →DNSの設定
# nmcli conn mod ens18 ipv4.method manual
# nmcli conn up ens18

ip aコマンドでインタフェース状態を確認します。

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:c3:70:d4 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.0.131/24 brd 192.168.0.255 scope global noprefixroute ens18
       valid_lft forever preferred_lft forever
    inet6 fe80::be24:11ff:fec3:70d4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

OSアップデート

yum updateでOSをアップデートします。

# yum update

OSの事前準備は以上です。

Postfixのインストール

RockyLinuxにpostfixをインストールします。

CentOS系は必要ライブラリがOSに含まれているため、postfixのみで対応できます。

[root@relay postfix]# yum install postfix

main.cfの設定

/etc/postfix/main.cfのオリジナルファイルを保存します。

# cp /etc/postfix/main.cf /etc/postfix/main.cf.org

main.cfをnanoエディタで編集し、システム要件に合うように設定を編集します。

smtp_sasl関連の設定は外部メールサーバーとの認証設定です。

デフォルトでは入っていないため、最後の行に付け加えます。

# nano /etc/postfix/main.cf

~テンプレートに環境設定を投入~
myhostname = relay.falconblog.local
mydomain = faloconblog.local
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination =
mynetworks = 192.168.0.0/24, 127.0.0.0/8
relayhost = [smtp.lolipop.jp]:465

~認証ファイルの設定~
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt

~以降は末尾に追記~
#transport_maps = hash:/etc/postfix/transport  →relayhostを設定した場合は不要
smtp_tls_loglevel = 1
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

~587ポート用の設定~
#smtp_tls_security_level = may    →今回はコメントアウト
~465ポート用の設定~
smtp_tls_security_level = encrypt
smtp_tls_wrappermode = yes

465ポートにリレーするとき

  • smtp_tls_security_level=encrypt
  • smtp_tls_wrappermode=yes

587ポートにリレーするとき

  • smtp_tls_security_level = may

transportの設定

リレー先の設定は、transportファイルに記載することも可能です。

# nano /etc/postfix/main.cf

~以下を最終行を追記~
transport_maps = hash:/etc/postfix/transport

# nano /etc/postfix/transport

~末尾に転送するアドレスを記載する~
falconblog.org      smtp:[smtp.lolipop.jp]:465

transportファイルは、postmapでhash化して有効にしておきます。

# postmap /etc/postfix/transport

アカウント認証(relay_password)の設定

メールサーバーのユーザー名とパスワードはrelay_passwordに記載します。

注記:サーバー名は[ ]で囲う必要があるようです。

# nano /etc/postfix/relay_password

~以下のように設定を記述する~
[smtp.lolipop.jp]:465 (ユーザー名):(パスワード)

アカウント情報を記載していますので、chmodで閲覧権限をルートのみにしてから、hash化します。

# chmod 600 relay_password
# postmap /etc/postfix/relay_password

設定チェックと有効化

postfix checkで設定チェックを行い、エラーがなければpostfixを再起動します。

# postfix check
# systemctl restart postfix

ポート疎通確認

ncコマンドで待ち受けポート番号25の開き状態をチェックします。

# nc 192.168.0.131 25
220 relay.falconblog.local ESMTP Postfix

「Ncat: Connection refused.」となる場合は、設定が間違っているか、ファイアウォールが有効化されています。

main.cfとファイアウォールが停止されていることを確認してください。

以上でpostfixの設定は完了です。

メール中継テスト

中継テストをする前に送信と受信環境を整備します。

筆者の場合は以下の環境を準備しました。

  • 送信アプリ:Zabbixのテスト送信
  • 受信アプリ:Windows10/11のThunderbird

Zabbixの通知設定→メディアタイプで、Emailの設定を有効にして、メディアタイプの設定を入れます。

今回はローカル側から25番ポートで平文送信ですので、セキュリティと認証はなしです。

Emailの「テスト」をクリックすると、テストダイヤログがでるので、送信先アドレスを入力して「テスト」をクリックします。

Thunderbirdを確認し、メールが届いていればテスト成功です。

トラブルシューティング

設定作業がテンプレートの修正のみで構築は簡単なように見えますが、実際はメールサーバーのセキュリティによって設定を修正する必要があり、メール中継はなかなかうまく行きません。

テストがうまくいかない場合は、/var/log/maillogのログを見て、解決していくようにします。

ケース1:ポート465と587では設定が違う

メールサーバーの465ポートにリレーする場合は、"smtp_tls_wrappermode = yes"、"smtp_tls_security_level = encrypt"を設定しないと、status=deferredとなり接続拒否されます。

relay postfix/smtp[7738]: SMTPS wrappermode (TCP port 465) requires setting "smtp_tls_wrappermode = yes", and "smtp_tls_security_level = encrypt" (or stronger)
relay postfix/smtp[7738]: E3CC22041D40: to=<info@falconblog.org>, relay=smtp.lolipop.jp[157.7.107.234]:465, delay=60, delays=0.09/0.04/60/0, dsn=4.4.2, status=deferred (lost connection with smtp.lolipop.jp[157.7.107.234] while receiving the initial server greeting)

587ポートにリレーする場合は、"smtp_tls_security_level = may"を設定します。

relay postfix/smtp[7622]: Trusted TLS connection established to smtp.lolipop.jp[157.7.107.234]:587: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
relay postfix/smtp[7622]: CAC9C2041D40: to=<info@falconblog.org>, relay=smtp.lolipop.jp[157.7.107.234]:587, delay=0.49, delays=0.08/0/0.1/0.3, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 4F9A1140A4C0B)
relay postfix/qmgr[7612]: CAC9C2041D40: removed

ポート465でも正しく設定すれば、status=sentとなり正常送信できます。

relay postfix/smtp[9732]: Trusted TLS connection established to smtp.lolipop.jp[157.7.107.234]:465: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
relay postfix/smtp[9732]: 761AE2041DBA: to=<info@falconblog.org>, relay=smtp.lolipop.jp[157.7.107.234]:465, delay=0.55, delays=0.09/0.04/0.11/0.31, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 1F16F141398D5)
relay postfix/qmgr[9725]: 761AE2041DBA: removed

ケース2:relay_passwordの[ ]記述

relay_passwordファイルに認証情報を記載するのですが、smtpサーバー名は[ ]で閉じないと正常認識されませんでした。

relay postfix/smtp[7576]: 2F17A2041D40: to=<info@falconblog.org>, relay=smtp.lolipop.jp[157.7.107.234]:587, delay=0.18, delays=0.09/0/0.08/0.01, dsn=5.7.1, status=bounced (host smtp.lolipop.jp[157.7.107.234] said: 530 5.7.1 Authentication required (in reply to MAIL FROM command))

この問題で丸1日くらい悩みましたが、lolipopを使っている先輩方が対処法を記載されていたので、解決することができました。

またpostfixのバージョンにより[ ]の要否が変わるという情報もありましたが、現在は[ ]ありで動いているようです。

ケース3:リレー先のホスト設定が間違っている

relay_passwordの記述が間違っていると、リレー接続ではなく、「DNSに登録されていないメールサーバー」として認識されてしまい"No route to host"の処置になります。

relayとして動いてくれない場合は、以下の設定値が一致していることを確認してください。

  • main.cfのrelayhostのポート番号
  • relay_passwordのポート番号
relay postfix/smtp[6945]: connect to mx01.lolipop.jp[157.7.107.233]:25: No route to host
relay postfix/smtp[6945]: 2FB602041D40: to=<info@falconblog.org>, relay=none, delay=0.15, delays=0.08/0.03/0.05/0, dsn=4.4.1, status=deferred (connect to mx01.lolipop.jp[157.7.107.233]:25: No route to host)

postfixは設定が多彩であり、どこに問題があるのかは大変見つけにくいですし、Web上の情報も少なくハマると難儀します。

リレー設定を行う場合は、main.cf、transport 、relay_passwordの3ファイルの設定のみとなりますので、記述を確認→送信テストで正解を見つけていくようにしましょう。