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ファイルの設定のみとなりますので、記述を確認→送信テストで正解を見つけていくようにしましょう。