Postfixから別メールサーバーにSMTP認証してメールを中継送信させるsender_relay

Postfixから別メールサーバーにSMTP認証してメールを中継送信させるsender_relay

はじめに

はじめに

ウェブサーバーは自分でCentOS + Apacheなどをインストールして構築・管理・運用を行っていますが、メール機能を同じサーバーに入れると、添付ファイルのウイスルチェックのためにClamdを入れるとCPUとメモリが大量消費しコストが上がるし、スパムチェックの定義などを日々更新したり、ブラックリストなどの管理も大変なので、メールサーバーは既存のレンタルサーバーを利用しています。

私はコスパが良い『さくらのメールボックス』を利用しています。
年額一括払いしか出来ませんが、年額1048円(税込)で月換算すると87円(税込)と格安です。
格安ですが、ウイルスチェックもあるし迷惑メールフィルタもあるし機能も充実しています。

また、ウェブサイト構築の発注があっても、同時にメールサーバーの構築と運用管理の依頼まではあまり来ないのが現状です。
しかし、ウェブサイトのPHPから問い合わせフォームの受付完了メールや、会員サイトの登録完了メールなどメール送信はけっこう頻繁に発生します。
そのままウェブサーバー内のPostfixからユーザーのメールサーバーに送信してもいいのですが、なりすましメールと勘違いされて拒否される事がよくあります。

なので、ウェブサイトのドメインのメールサーバーが別な場合は、正規のメールサーバーにSMTP認証して、中継送信してもらう方がメール到着率も上がるので、今回Postfixから別メールサーバーにSMTP認証してメールを中継送信させる方法をやりました。

サーバー環境

サーバー環境は下記の通りです。
CentOS 7.5.1804 (Core)
Postfix 3.5.8
ちょっと古い。

main.cfの編集

main.cfの説明

方法としてはsender_dependent_default_transport_mapsとsender_dependent_relayhost_mapsがあるみたいです。
今回は「smtp_sender_dependent_authentication」で送信アドレスごとにSMTP認証を行うか指定します。
「sender_dependent_relayhost_maps」で送信アドレスのドメイン毎に中継先のメールサーバーを指定します。
中継してもらうためのSMTP認証情報を「smtp_sasl_password_maps」で指定してあげます。

main.cfの内容

main.cfの一番下に下記を追記してあげます。


[root@sv01 ~]# vi /etc/postfix/main.cf
# 送信アドレス毎に認証
smtp_sender_dependent_authentication = yes
# 送信アドレスのドメインごとの中継先メールサーバーの設定ファイル
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
# TLSを行うか
smtp_use_tls = yes
# SASL認証をON
smtp_sasl_auth_enable = yes
# SASL認証の認証情報ファイル
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# SMTP側のセキュリティオプション
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
# SMTP側 SASL認証方法
smtp_sasl_mechanism_filter = cram-md5, plain, login

sender_relayの作成

sender_relayの説明

送信ドメイン毎に中継先メールサーバーを振り分けてくれます。
ドメイン名の頭に@を付ける。
メールサーバー名は括弧[]に入れる。
SMTPポート番号をコロンの後に書く。

sender_relayで設定されているドメイン以外は本サーバーから直接相手側メールサーバーに送信されます。

sender_relayの内容

今回は例として送信アドレスを「info@testdomain.com」と「support@demodemo.com」と仮定して書いています。


[root@sv01 ~]# vi /etc/postfix/sender_relay
@testdomain.com   [mail.testdomain.com]:587
@demodemo.com    [smtp.demodemo.com]:587

sender_relayのDBハッシュ化

作成したsender_relayはこのままのテキストファイルだとPostfixさんが読み込めないので、postmapコマンドでDBハッシュ化してあげます。


[root@sv01 ~]# postmap /etc/postfix/sender_relay

コマンド実行後の結果は表示されませんので、lsコマンドでsender_relay.dbが作成されているか確認しましょう。

sender_relayファイルを変更する度に、postmapコマンドで再度DBハッシュ化してあげましょう。

sasl_passwdの作成

sasl_passwdの説明

中継先メールサーバーに送るSMTP認証情報(メール送信のIDパス)を設定します。
送信アドレス毎に1行づつ書いてあげます。

sasl_passwdの内容

本作業をする前に、必ず中継先メールサーバー側で送信アドレスの作成を行って下さいね。


[root@sv01 ~]# vi /etc/postfix/sasl_passwd
[mail.testdomain.com]:587 info@testdomain.com:Mail999Pass
[smtp.demodemo.com]:587 support@demodemo.com:Password

sasl_passwdのDBハッシュ化

sender_relayと同じ様に、postmapコマンドでDBハッシュ化してあげます。


[root@sv01 ~]# postmap /etc/postfix/sasl_passwd

コマンド実行後の結果は表示されませんので、lsコマンドでsasl_passwd.dbが作成されているか確認しましょう。

sender_relayファイルと同じでsasl_passwdも変更する度に、postmapコマンドで再度DBハッシュ化してあげましょう。

postfixの再起動

これまでの設定を反映させるためPostfixを再起動させます。


systemctl restart postfix

確認

うまくできたか確認のため設定したinfo@testdomain.comからToUser@gmail.comにメール送信してみましょう。


[root@sv01 ~]# echo "test" |mail -s "test mail" -r info@testdomain.com ToUser@gmail.com

メールログを見てみましょう。


Mar  3 14:58:10 sv01 postfix/pickup[15934]: E392C6050A: uid=0 from=
Mar  3 14:58:10 sv01 postfix/cleanup[21184]: E392C6050A: message-id=<633058f2.uvMKnWbopuKhUDst%info@testdomain.com>
Mar  3 14:58:10 sv01 postfix/qmgr[11255]: E392C6050A: from=, size=454, nrcpt=1 (queue active)
Mar  3 14:58:11 sv01 postfix/smtp[21187]: Trusted TLS connection established to mail.testdomain.com[111.222.111.222]:587: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Mar  3 14:58:11 sv01 postfix/smtp[21187]: E392C6050A: to=, relay=mail.testdomain.com[111.222.111.222]:587, delay=0.32, delays=0.04/0.03/0.22/0.04, dsn=2.0.0, status=sent (250 2.0.0 2288wBBD010639 Message accepted for delivery)
Mar  3 14:58:11 sv01 postfix/qmgr[11255]: E392C6050A: removed

5行目に「relay=mail.testdomain.com」と外部の中継先メールサーバーに行き「status=sent」と返答がありましたね。

後片付け

sender_relayとsasl_passwdはDBハッシュ化された後は不要なので削除しておいた方がいいかもしれません。
sasl_passwdはメールパスワードが平文で書かれているので、他人がrootでログインして見る可能性があるなら削除しておいた方がいいですね。

参考ページ

下記ページを参考にさせて頂きました。
https://fsck.jp/?p=308
https://qiita.com/softark/items/255c44499cbc247655bc

余談

Postfix+Dovecot導入と合わせてウイルス・セキュリティ対策としてClamdとAmavisdを入れましたが、ClamdとAmavisdがものすごいメモリを食っていて、物理メモリ2GBマシンではキツイ構成です。
メモリ空き容量を見るといつも


[redadmin@sv01 ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1998        1309         280           0         409         512
Swap:          4095        1856        2239

とギリギリな感じで、メール専用サーバーなのでまだhttpdとMySQLはPostfixAdminでしか利用していないですが、ブログやHPを収容して稼働させるには心もとない空き容量です。
何か考えねば・・・。