自宅で自前のメールサーバーを動かしてメールを送信するのは、現在ではあまり推奨されていません。
よほどの対策をしないとスパムメールの餌食となってしまうからです。
しかし、転送はしないし内部からだけ送信するなら・・・という理由で簡単なメールサーバーを構築した方もいるでしょう。しかし、メールの本家とも言うべきGmailに送信してみると拒否されてしまう。
たとえ届いたとしても迷惑メール扱いされてしまっている。こんな状況が多いのではないでしょうか?
Gmailに正しく受け取ってもらうにはどうする??
正しく受け取ってもらうには、いくつかのことをしなければなりませんが、届いていないなら以下のことを実行する必要があると思われます。
前提としてPostfix Dovecotを使ったLinux環境下のメールサーバーの話としてのお話です。
1.DKIM認証を設定する
DKIM(Domain Keys Identified Mail)とはメールの送信元が秘密鍵で電子署名を行って、受診側が
DNSに登録された公開鍵の情報を使って正しい署名かどうかの確認をする方法。
受信側は、送信元情報が成りすましされていないかどうかを判別することができます。
Opendkimのインストール
$ sudo apt update
$ sudo apt install opendkim opendkim-tools
鍵ペアの作成
/etc/dkimkeysホルダにmailという鍵ペアを1024ビット長で作成します
-d xxxx.xxxx.jp は自分のサイトのドメイン名です
$ sudo opendkim-genkey -b 1024 -D /etc/dkimkeys -d xxxx.xxxx.jp -s mail
出来た鍵のパーミッションと所有者情報を変更
$ sudo chown opendkim:opendkim /etc/dkimkeys/mail.private
$ sudo chown opendkim:opendkim /etc/dkimkeys/mail.txt
OpenDKIMの環境設定をする
まずは環境ファイルのバックアップを取っておく
$ sudo cp -p /etc/opendkim.conf /etc/opendkim.conf_$(date +%Y%m%d-%H%M%S)
OpenDKIMの設定ファイルopendkim.confを編集する (nano等で開く)
$ sudo nano /etc/opendkim.conf
以下の様に修正し保存
Mode sv
Domain xxxx.xxx.jp
Selector mail
KeyFile /etc/dkimkeys/mail.private
Socket inet:8891@localhost
OpenDKIMを再起動
$ sudo systemctl restart opendkim
作成した公開キー情報をDDNSのドメイン情報に追加する
$ sudo cat /etc/dkimkeys/mail.txt
以下の様に表示される
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIGfMA0GCSqGSIb3...ここは長い文字列続く...lLwSN8VCt7cO26uxDRJfrKANbTVC250GvSlYum9djE/hz" ) ;
----- DKIM key mail for xxxx.xxx.jp
これらをDDNSのドメイン情報に追加設定する。(ご利用のDDNSサービスにて設定してください)
Hostname* Type* Content
mail._domainkey TXT v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSI・・・ ・・・lLwSN8VCt7cO26uxDRJfrKANbTVC250GvSlYum9djE/hz
DKIMの設定のテスト方法
以下入力で opendkim-testkey: key OK と出れば設定は成功
$ sudo opendkim-testkey -d xxxx.xxx.jp -s mail -vvv
Postfixの設定を変更します
$ sudo nano /etc/postfix/main.cf
以下の設定を追加します。
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
閉じて再起動
$ sudo systemctl restart postfix
最終確認事項
①受信側のメールヘッダーを確認してDKIMの認証がpassしていることを確認する。
②メールログによる確認をする
/var/log/mail.logを確認
DKIM-Signature field addedがあれば署名が行われています。
2.SPFを設定
SPFとは、電子メールの送信元の偽装(なりすまし)を防ぐために、送信元のサーバが正しいかどうかを確認するための仕組みです。未設定の場合は迷惑メールと判定されやすくなります。
DNSにレコードを一行設定を追加するだけ
例
IN TXT "v=spf1 +ip4:メールサーバのIPアドレス -all"
MYDNS.JPではもう自動で設定されているので追加は不要です。ナイス!!
3.DMARCの設定
DMARCとは、メールの送信元のなりすましをしていないかの確認するための方法のひとつ。
迷惑メール対策のSPFとDKIMの認証結果を使い、SPFおよびDKIMで認証されたドメインがメールのFromヘッダーと同じかどうかを確認し、同じ場合は認証成功となる。
①DMARCのレコードをDNSへ設定
基本は
ドメイン TTL クラス タイプ データ
_dmarc 3600 IN TXT "v=DMARC1; p=ポリシー; rua=mailto:メールアドレス"
となってます。
MYDNS.JPの場合は
Hostname* Type* Content Target ID
_dmarc TXT v=DMARC1; p=quarantine;rua=mailto:xxxx@xxxxx.mydns.jp
で登録OK
p= は none(何もしない)、quarantine(隔離)、reject(拒絶)の3つから指定
ただしp=noneは意味がないのでquarantine以上にします。
設定が必須ではないオプションのタグについての説明
タグ 設定値 説明
rua メールアドレス DMARCレポートメール送信先を設定
複数指定する場合は「,」で区切る
設定しない場合はレポートメールは送信されない
ruf メールアドレス DMARC認証失敗レポートの宛先メールアドレス
複数指定する場合は「,」で区切る
設定しない場合はレポートメールは送信されない
sp none
quarantine
reject サブドメインの動作ポリシー
指定していな場合はpタグで設定した動作ポリシーが適用される
pct 1~100 DMARCのポリシー対象となるメールの割合を指定
指定していない場合は100(全て適用)となる
adkim r,s DKIM 認証識別子アライメントモード(DKIM署名チェックの厳格さ)
r(relaxed mode ドメイン部分一致)
s(strict mode ドメイン完全一致)
省略時はsが設定される
aspf r,s SPF 認証識別子のアライメントモード
(SPF署名チェックの厳格さ)
r(relaxed mode ドメイン部分一致)
s(strict mode ドメイン完全一致)
省略時はsが設定される
ri 秒単位指定 DMARCレポートを要求する間隔
指定していない場合は86400(1日)が設定される
1日1回はレポートを要求する必要がある
rf afrf DMARCの認証失敗レポートの形式を指定
指定していない場合はafrfとなる
※2024.01.29時点ではafrfのみ
fo d,s,1,0 DMARCの認証失敗レポートの要求基準
d: DKIMの認証が失敗
s: SPFの認証が失敗
1: DKIM,SPFのどちらかが失敗
0: すべての認証が失敗
DMARCレコードが登録されたかどうかの確認方法
$ dig _dmarc.ドメイン名 TXT
4.PostfixにSPFチェック機能(policyd-spf)を追加
postfix-policyd-spf-pythonをインストール
$ sudo apt update
$ sudo apt install postfix-policyd-spf-python
設定ファイルである/etc/postfix-policyd-spf-python/policyd-spf.confを編集
$ cd /etc/postfix-policyd-spf-python/
$ sudo cp -p policyd-spf.conf policyd-spf.conf_$(date +%Y%m%d-%H%M%S)
$ sudo nano policyd-spf.conf
変更前
HELO_reject = Fail
Mail_From_reject = Fail
変更後
HELO_reject = False
Mail_From_reject = False
Postfixに設定反映
$ sudo nano /etc/postfix/master.cf
master.cfの最後に下記の内容を追加します。
# Policyd-sfp Setting
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
$ sudo nano /etc/postfix/main.cf
smtpd_relay_restrictionsn=に
check_policy_service unix:private/policyd-spf を追加し
policyd-spf_time_limit を追加
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
check_helo_access hash:/etc/postfix/helo_access
reject_unknown_helo_hostname
check_policy_service unix:private/policyd-spf
policyd-spf_time_limit = 3600
保存したらpostfix再起動
$ sudo systemctl restart postfix
5.OpenDMARCを連携させて、メール受信でDMARCの認証を行えるようにする
これは、Gmailに対する対策ではないが、せっかくDMARCを扱えるようになったので、自分のメールサーバーでの受信でも同様に使えるようにするための設定です。
opendmarcをインストール
$ sudo apt install opendmarc
インストールしている最中にデータベースを設定するかの問い合わせがあった場合はnoを入力
OpenDMARCの設定ファイルである/etc/opendmarc.confを編集
$ sudo cp -p /etc/opendmarc.conf /etc/opendmarc.conf_$(date +%Y%m%d-%H%M%S)
$ sudo nano /etc/opendmarc.conf
# 認証結果をメールヘッダーに記述する際に使用する名前
# AuthservID name (変更前)
AuthservID OpenDMARC
# DMARC検証で認証失敗したメールを拒否しない。レポートのみ生成する。
RejectFailures false (変更前 そのまま)
# ポリシーがreject(p=reject)の場合、リジェクトするするようにするには
RejectFailures true
# ソケットをinetへ変更 (DKIMでもinetを使用しているのであわせています)
# Socket local:/run/opendmarc/opendmarc.sock (変更前)
Socket inet:8893@127.0.0.1
# 信頼できるAuthservIDsとしてメールサーバのホスト名を設定
# Postfixのmain.cfで設定してあるmyhostnameと一致させる必要がある
# TrustedAuthservIDs HOSTNAME(変更前)
TrustedAuthservIDs メールサーバ名
## 追加で新規作成した設定
# DMARCの認証を行わないホストの設定
IgnoreHosts /etc/opendmarc/ignore.hosts
# 認証されたクライアントからのメールはDMARC検証をスキップする。
IgnoreAuthenticatedClients true
# メールヘッダのSPF検証結果を無視します(後述の自前のSPF検証をするため)
SPFIgnoreResults true
# SPFの結果がヘッダーにない場合SPFチェックを行う
SPFSelfValidate true
# SMTP AUTHで認証済みのクライアントからのメールはDMARCのチェックを無視する
IgnoreAuthenticatedClients true
# RFC5322に準拠していないメールヘッダーのを拒否
RequiredHeaders true
ignore.hostsファイルを作成
/etc/opendmarcディレクトリを作成し所有者をopendmarcに設定してから、ignore.hostsファイルを作成していきます。
$ sudo mkdir /etc/opendmarc/
$ sudo chown -R opendmarc:opendmarc /etc/opendmarc
$ sudo nano /etc/opendmarc/ignore.hosts
DMARCの認証を行わないホストとして、ローカルホスト(自分自身)を記述しておきます。
localhost
127.0.0.1
::1
opendmarcを再起動
$ sudo systemctl restart opendmarc
PostfixとOpemDMARCを連携させる
/etc/postfix/main.cfに設定追加
sudo nano /etc/postfix/main.cf
DKIMの設定としてinet:127.0.0.1:8891がすでに記述されてるので、その後に設定を追記
smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:8893
Postfixを再起動
<参考>
たとえばPostfix 設定のcheckがしたくて
$ sudo postfix check
とやってエラーが出ても、一度リスタートしましょう
$ sudo systemctl restart postfix
とするとエラーは消えますので、さっさとリスタートしましょう。
動作テスト
実際にGmailからのメールで確認
受信したメールのヘッダーを見てみると
Authentication-Results:OpenDMARC; dmarc=pass (p=none dis=none) header.from=gmail.com
この様にpassになっていればOKです。
あとがき
以上、たくさんの設定を追加してやっとGmailがメールを受け取ってくれるようになるのですから大変です。でもやらなければ届かないので頑張って設定しましょう。
きっとまた時間が経てば他にも必要な設定が必要になってくるのでしょうね。
今はLineなどの使用が増え、メール自体があまり使われなくなって来ています。
ジャンクメール、詐欺メール、成りすましが多すぎることが原因でしょうけれど、そろそろメールに代わる新しい安全な連絡方法が出てきて欲しいと思いませんか?