勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

自前のメールサーバコンテナから送信したメールがGmailで迷惑メールフィルタリングされないよう設定する方法

  サーバー Podman

先日構築したメールサーバ用コンテナでメール送信時、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
mail A 【サーバのIP(コンテナのIPではない)】
mail 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

  関連記事

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法
Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際 ...

PHPからMySQLに接続する際「getaddrinfo for xxxxxx failed」エラーの対応方法
PHPからMySQLに接続する際「getaddrinfo for xxxxxx failed」エラーの対応方法

Podmanコンテナ環境で直前まではPHP→MySQL接続できていたのに「pod ...

Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法
Podmanコンテナ環境にWordPressを導入の上、パーミッション等の各種設定を行う方法

Podmanコンテナ環境にWordPressを導入したい。何も考えずにWP関連の ...

CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法

Cockpitにはcockpit-podmanというPodman(Dockerの ...

PodmanでPython用コンテナを作成しデータベース用コンテナに接続する方法
PodmanでPython用コンテナを作成しデータベース用コンテナに接続する方法

PodmanでPython用コンテナを作成しデータベース(MariaDB)用コン ...