GCE:Postfix+SendGridでメール送信

家のメル鯖をロリポからGCPに移設したのでメモ

まずはCompute Engineでf1-microマシンを立てる。
OSはいつものUbuntu 18.04

セットアップ

まずはPostfix+Dovecotをインストール。

手順はこちらを参考。
Ubuntu 18.04 LTS : Postfix : インストール : Server World
上記サイトの手順を参考にしてPostfix、Dovecot、SSL/TLSの設定までやっておく。

certbotの更新時にサービスを再起動するようにcron設定を変える。
末尾に –deploy-hookオプションを追加。

#/etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "systemctl restart postfix dovecot"

そしてGCPのVPC Firewall設定で、Postfix+Dovecotが動いてるVMのインスタンスに対して使用するポートを穴あけしておく事。
今回の設定だと最低限インバウンドで tcp 25, 465, 995など必要なものをあける。

header_checks設定を有効化

ついでにheader_checksの設定を有効にして怪しい添付ファイル付きのメールをブロックする設定を追加。

# /etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks

そして header_checks ファイルを作成して保存。
ルールに一致したメールは全て DISCARD で破棄。

# /etc/postfix/header_checks
/^X-Mailer:.*PostMaster General/ DISCARD
/name=.*\.scr/ DISCARD
/name=.*\.exe/ DISCARD
/name=\".*\.inf\"/ DISCARD
/name=\".*\.scr\"/ DISCARD
/name=\".*\.pif\"/ DISCARD
/name=\".*\.bat\"/ DISCARD
/name=\".*\.dll\"/ DISCARD
/name=\".*\.vbs\"/ DISCARD
/name=\".*\.reg\"/ DISCARD
/^Return-Path:.*<#.*@.*>/ DISCARD
/^From:.*<#.*@.*>/ DISCARD

header_checksファイルを作成後、postmapでheader_checks.dbを作成。

sudo postmap /etc/postfix/header_checks

SendGridへのリレー設定

GCEはOP25BによってVPCネットワーク外部へのtcp25番接続が出来ない。
外部からGCEインスタンスへのtcp25番接続はVPC Firewall設定を開ければ可能。

というわけでPostfixのrelayhost設定を使ってSendGridの465番ポート経由でメールを送る。

下記を参考にしてSendGridを有効化する。
SendGrid でのメールの送信
リンク先ではtcp2525番を使ってるけど、SSLを使いたいのでtcp465番にした。

# /etc/postfix/main.cf
relayhost = [smtp.sendgrid.net]:465
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
smtp_tls_wrappermode = yes

sasl_passwdは先程のGCPのドキュメントのとおり作成しておく。
そしてpostfix reload で設定をリロード。

DNS設定を変更

忘れずにDNSでVMに対するAレコードと、MXレコードを作成して反映を待つ。

さらに、SendGrid経由だとメールが届かないドメインがちらほら存在するので、SendGridにSPF設定をしておく。

こちらの手順で Sender Authentication をすればOK.
指定されたCNAMEレコードを3件DNSに追加するだけ。
How to set up domain authentication | SendGrid Documentation