自前のメールサーバコンテナから送信したメールがGmailで迷惑メールフィルタリングされないよう設定する方法
先日構築したメールサーバ用コンテナでメール送信時、GmailやYahooメールだと迷惑メールフィルタリングされた。これを何とかしてみたい。調べたところ逆引き / SPF / DKIM / DMARC設定が必要になりそう。以下に対応方法をメモ。
前提
- 送信用アドレスはmail.ドメインとなる。例としてtest_user@mail.test.comの形
- VPSはKagoya、ドメインとDNSはムームードメイン
環境について
VPS
今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。
- 接続ポート -> 22
- ユーザ名 -> root
- パスワード or 秘密鍵 -> インスタンス作成時に選択したもの
ホスト(VPS)側
- AlmaLinux 8.10 (Cerulean Leopard)
コンテナ側
- podman version 4.9.4-rhel
対応方法
逆引き設定
公式案内の通りに逆引き設定を行う。設定するドメインはmailを抜いて「test.com」になる。
逆引き設定とは
ドメイン -> IPアドレスが正引き、IPアドレス -> ドメインが逆引き。第三者が「私はtest.comですと」と嘘をつくことはできるが、IPアドレスの所持者は嘘をつけない(所持者じゃないと正引き設定できない)ため、受信側からするとチェック対象になる。
Web ARENA Indigo VPSの場合
安い方のVPSだと公式案内の通り逆引き設定不可。Proの方だとできるみたい。
DKIM設定
サーバにSSH接続し、以下コマンドで設定を行う。
# (必要に応じて)epalレポジトリの追加 dnf -y install epel-release # OpenDKIMとツールのインストール dnf -y install opendkim opendkim-tools # 自動起動設定 systemctl enable opendkim # 自動起動設定確認(enabledならOK) systemctl is-enabled opendkim # OpenDKIM用ディレクトリの作成 mkdir -p /etc/opendkim/keys/test.com # 作成したディレクトリに移動 cd /etc/opendkim/keys/test.com # 秘密鍵と公開鍵の生成 opendkim-genkey -s default -d test.com # OpenDKIMが読み込めるよう所有者の変更 chown -R opendkim:opendkim /etc/opendkim/keys/
また、各種設定ファイルを編集する。
# OpenDKIMのメインファイルを開く vi /etc/opendkim.conf ### 以下を追記もしくは編集 # Postfixからメール署名を受け付けるための設定 Socket inet:8891@0.0.0.0 # 署名専用として設定 Mode s # 鍵の保存場所 KeyTable /etc/opendkim/KeyTable # どのメールアドレスにどの鍵を使うかの割り当てルールの場所 SigningTable refile:/etc/opendkim/SigningTable # 署名するドメイン、IPのリスト InternalHosts 127.0.0.1, 10.89.30.0/24, test.com, mail.test.com ### 鍵の保存リストファイルを開く vi /etc/opendkim/KeyTable ### 以下を追記もしくは編集 # 特定のドメインの鍵の保存場所を記述 default._domainkey.test.com test.com:default:/etc/opendkim/keys/test.com/default.private ### どのメールアドレスにどの鍵を使うかの割り当てルールの設定ファイルを開く vi /etc/opendkim/SigningTable ### 以下を追記もしくは編集 # ルールの指定。ワイルドカート指定のためinfo / no-reply@test.com 等、ドメインがあっていればOK *@test.com default._domainkey.test.com *@mail.test.com default._domainkey.test.com
各種設定ファイルの編集が完了後、以下で設定内容を反映。また、ファイアウォールも解放しておく。
# OpenDKIM再起動 systemctl restart opendkim # 10.89.30.0/24(docker-compose.ymlで指定していたweb-db-netネットワークのIP帯)のファイアウォールを開放 firewall-cmd --zone=trusted --add-source=10.89.30.0/24 --permanent # ファイアウォールを再起動 firewall-cmd --reload
DKIM設定とは
秘密鍵と公開鍵を用いたWebサーバのSSL証明書のようなもの。送信時に秘密鍵を使ってメールヘッダーに署名 -> 受信側はDNSから公開鍵を取ってきて、メールヘッダーの署名が解読できるか試す -> 解読されれば改ざんされていないものとして証明できるというもの。
Postfix設定
main.cfを以下の通り追記。
# 動作互換性バージョン compatibility_level = 2 # ホスト名とドメインの設定 myhostname = test.com mydomain = test.com myorigin = $myhostname # 全てのインターフェイスからの接続を許可 inet_interfaces = all # IPv4のみ許可 inet_protocols = ipv4 # 指定したドメイン宛てに受信した場合、転送せずサーバ内に保存 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # メール保存先 home_mailbox = Maildir/ # コンテナネットワークからの送信を無条件許可(テスト環境でコンテナ以外から送信したい場合は当該環境のIPアドレスを追記) mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 # 転送設定やデータベースを無効にしエラー回避 alias_maps = alias_database = # ==================================================================== # 以下を追記 # ==================================================================== # このpostfixから送信するメールは同サーバが発信源(外部からの転送メールではない)= DKIM署名をさせるための指定 milter_macro_daemon_name = ORIGINATING # Webサーバ用コンテナ等、外部からSMTP経由で届いた送信メールに対してDKIM署名をさせるための指定 smtpd_milters = inet:10.89.30.1:8891 # サーバー内部のコマンドから届いた送信メールに対してDKIM署名をさせるための指定 non_smtpd_milters = inet:10.89.30.1:8891 # TLS暗号化設定 smtp_tls_security_level = may smtp_tls_loglevel = 1
DNS設定(DMARC設定も)
事前にOpenDKIMの公開鍵を以下で取得しておく。
cat /etc/opendkim/keys/test.com/default.txt
次に以下のDNS設定を行う(ムームーDNSでの設定項目名)。
| サブドメイン | 種別 | 内容 | 優先度 |
|---|---|---|---|
| MX | test.com | 10 | |
| TXT | v=spf1 ip4:【サーバのIP(コンテナのIPではない)】 -all | ||
| A | 【サーバのIP(コンテナのIPではない)】 | ||
| TXT | v=spf1 ip4:【サーバのIP(コンテナのIPではない)】 -all | ||
| default._domainkey | TXT | 【OpenDKIMの公開鍵。以降は例】v=DKIM1; k=rsa; p=xxxxxxxxxxx | |
| _dmarc | TXT | v=DMARC1; p=none; |
DMARCとは
SPF / DKIMで認証に失敗した場合、メールの扱いを以下の通り指定。
- none -> 受信側に判断を委ねる
- quarantine -> 迷惑メールフィルタリング
- reject -> 削除
動作確認
先日メモしたメール送信プログラムから送信し、以下の用のSPF / DKIM / DMARCがPASSになっていればOK。
所感
迷惑メール扱いにならずにメールを送信できるようになり満足。
ただ、メールサーバーの踏み台のリスク、メール到達率の懸念等を考えた際にメールサーバを本番で構築・運用したいかと言われると微妙。
本番運用だと送信はSendgrid等の外部SMTPサーバ、受信はレンタルサーバーもしくはGoogle Workspace等で対応するのが無難なのかも。
尚、docker-mailserverを導入すれば今回対応したDKIM設定(鍵作成等も含めて)とかも含めてもっと簡単にメールサーバ用コンテナを構築できるらしい。こちらも試してみたいところ。
関連記事
-
-
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...
-
-
PHPからMySQLに接続する際「getaddrinfo for xxxxxx failed」エラーの対応方法
Podmanコンテナ環境で直前まではPHP→MySQL接続できていたのに「pod ...
-
-
Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法
Podmanコンテナ環境にWordPressを導入したい。何も考えずにWP関連の ...
-
-
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
Cockpitにはcockpit-podmanというPodman(Dockerの ...
-
-
PodmanでPython用コンテナを作成しデータベース用コンテナに接続する方法
PodmanでPython用コンテナを作成しデータベース(MariaDB)用コン ...
