FreeBSD13.2: Gmail宛メールが送信者認証で拒絶される&対策

いつからか定かではないのですが、Gmail 宛のメールがブロックされるようになっていました。

こんな感じ。

   ----- The following addresses had permanent fatal errors -----
<user.1234@gmail.com>
    (reason: 550-5.7.26 This mail has been blocked because the sender is unauthenticated.)

   ----- Transcript of session follows -----
... while talking to gmail-smtp-in.l.google.com.:
>>> DATA
<<< 550-5.7.26 This mail has been blocked because the sender is unauthenticated.
<<< 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM.
<<< 550-5.7.26 
<<< 550-5.7.26  Authentication results:
<<< 550-5.7.26  DKIM = did not pass
<<< 550-5.7.26  SPF [www.lifewithunix.jp] with ip: [116.58.172.107] = did not pass
<<< 550-5.7.26 
<<< 550-5.7.26  For instructions on setting up authentication, go to
<<< 550 5.7.26  https://support.google.com/mail/answer/81126#authentication r3-20020a63ce43000000b005dc12137745si3771596pgi.151 - gsmtp
554 5.0.0 Service unavailable

不達メールは結構な数 届くので、メールフィルターで直接ゴミ箱に送るようにしていたから気付くのが遅くなってしまいました。

Gmailアドレス宛にメッセージ送信する場合、Webメールを使ったり、メールプロバイダー側のメールサーバーを使う場合は(プロバイダーが対応してくれるので)気にする必要はありませんが、自宅サーバーを使っている場合は自分で対処する必要があります。

ブロックされたメールのヘッダーに、Gmail に送るには SPF か DKMI sender authenticate が必要だと書いてあるので、自分のメールサーバーをどちらかに対応させればいいのでしょうが、まずはこれら送信者認証の仕様も違いも分からない!

でもまあ、毎日繰り返し届く昨今の迷惑メール、フィッシングメッセージ事情を考えると、特にGmail は迷惑メール発信・受信とも温床になっているため送信者認証導入は必要でしょう。最近は携帯電話キャリアメールがオプションになって、スマートフォンでメールを使いたかったらGmail って傾向もありますからねぇ。Gmail.com 宛にメールを送りたい場合は、送信者側でも認証システム導入に協力するしかないのでしょう。

SMTP電子メールは、1960年代の古き良き時代、技術者同士、ドメインがフラットだった頃の研究機関-大学内のメッセージ交換から始まったので、SMTPには認証の概念なし。切手を貼る郵便を電子化しただけなので、郵便で出来ることは、電子メールでもできてしまう。郵便の場合はコストが掛かるから大量送信が行われないだけで、偽郵便物、差出人詐称郵便は今でも簡単にできてしまう。というか代理発送が出来なきゃ郵便業務委託なんてできませんから、行政なんかは困ることになる。

Gmailの対応をきっかけに、ようやく本格的に電子メールの送信者認証が実装されることになるのかな?
良いことだとは思うものの、新たに機能を実装させる側としては、ドキュメントが欲しいところ。

調べてみてわかったのは、

  1. 電子メールを送信すると、メール受信サーバーは、送信元アドレスをDNSに尋ねる。
  2. DNSが受信メールサーバーの問いに答える。
  3. ホスト情報がDNSが返した値と一致していたら受信。一致していなければブロック。

という流れのようです。
分からないのは、SMTPプロトコルの、どのコマンド実行時に、どの情報を参照する認証が行われるのか?という点。HELO コマンド時?MAIL FROM: 時?ここら辺のドキュメントは見つからないのよね。

なのでいろいろ試してみました。

ISPのメールアドレス宛に届く、メルカリからメールヘッダーを覗いてみると、こんな感じ。

Authentication-Results	:	nifty.com; spf=pass
   smtp.mailfrom=bounce-2024041413-000132649cd8@srs6583.cuenote.jp;
   sender-id=pass header.From=no-reply@mercari.jp; dkim=pass
   header.i=@mercari.jp; dkim-adsp=pass header.from=no-reply@mercari.jp
DKIM-Signature	:	v=1; a=rsa-sha256; c=relaxed/simple; d=mercari.jp;
   s=m001; t=1713069172; x=1713673972;
   bh=MMS6cwX7zZMOUrTzUITkY/1Q0bf/6HJwF6UA9lSMLN0=;
   h=Date:Subject:From:To;
   b=Ahj3gTzPnrqxoACLn7iM0P/zeznZykYEQ4kph9rxaRdXoEumkMc0hoc9bMfl
   aBRZC7eFMK9Upth1aVhy6buK2cBNZUbGOPw1QjWeuOylNDO5pg+pcrli3Nsza
   uF/ki5gWxPOLLH/ywY6h9UjJo3VnzdSbwxOSUoKZ3gU66CvSVk=

青文字のヘッダー行「Authentication-Results」は、メール受信時にプロバイダーのメールサーバーが付加する情報。
赤文字のヘッダー行「DKIM-Signature」は、SMTPメール送信サーバーが付加する情報。

上例の、メルカリからのメールは SPF, DKIM ともに対応しているようです。
いろいろ検索してみると、FreeBSDで DKIMを導入するにはOSにDKIM用のパッケージを入れないといけない事がわかりました。
それに対し、SPF はDNSに情報を追加するだけで良さそう。(本当か?)
DNSは乗っ取られない、という前提なんでしょう。確かにDNSはダウンすることがあっても、乗っ取ることは難しい。

把握できたこと:

SPF: DNSへの情報登録だけで運用できる。
DKIM: 公開鍵方式を利用して、メールヘッダー中とDNSに登録された鍵で認証。
という感じなのかな。

問題はDNSへの情報登録。昨年の途中まではDNSを自分で運用していたので、設定は自由にできました。しかし、現時点ではDNSはプロバイダーにおまかせしたので、DNSに自由にレコードを登録することは出来ない。また、自前に戻さないといけないの?
私が利用しているのは、インターリンクというプロバイダーで、メール送信者認証に対する対応はどうなっているのかと調べてみたら、
https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=634
にちゃんと書かれていました。「おまかせDNSまたは無料DNSは、SPF、DKIM、DMARCのレコードの登録に対応しております。」って。インターリンク最高!

恐らく、受信元メールサーバーは、送信サーバーから SMTPポートに接続され HELO が届く時点で、送信元IPアドレスがわかる。そして、MAIL FROM コマンドで、送信者のホスト名もわかる。
MAIL FROM のドメインかホスト情報を元に、DNSに逆引きしに行って、TXT フィールドに定義された情報が、メールヘッダーのものと一致するかどうかを確認するんでしょう。私にはそう読み取れた。

私のサーバーは、
ドメイン名:lifewithunix.jp
メールサーバー名:tokyo.lifewithunix.jp
IPアドレス:116.58.172.107
なので、サンプルを見ながら、DNS に、「@ TXT ”v=spf1 ip4:116.58.172.107 ~all”」と、登録。

テストで、シェルから、「date | mail -s “test” user.1234@gmail.com」と送ってみたら、不達で戻ってきました。ガク。

よくよく考えてみると、メールサーバーからUnixコマンドで直接メールを送ると、TXTレコードに登録した「@」行に対応するホスト名@lifewithunix.jp からじゃなく、ホスト名を含めた @tokyo.lifewithunix.jp からのメールになるので、認証されないわけだ。パソコンから、tokyo.lifewithunix.jp を SMTPサーバーとして送信した場合は、@lifewithunix.jp からのメールになるんですけどね。

プロバイダーのDNSに、更に「tokyo  TXT ”v=spf1 ip4:116.58.172.107 ~all”」という行を追加登録。

この後でテストしたら、不達で戻ってくることはありませんでした。Unixホストから直送する場合は、これでOK。パソコンのメールソフトから、自宅サーバーを踏み台にしての送信テストもOK。
SPFに関して調べた時、TXT の書式には複数あって、「a:」で記述する方法もあるとのこと。

「@ TXT “v=spf1 a:tokyo.lifewithunix.jp ~all”」

も、追加しておきました。

登録内容は、FreeBSD の host コマンドで確認可能。書式は、

host -t TXT <調べたいメールサーバー> <問い合わせを行うDNS>

やってみると、

# host -t TXT tokyo.lifewithunix.jp gdns1.interlink.or.jp
Using domain server:
Name: gdns1.interlink.or.jp
Address: 203.141.128.80#53
Aliases: 

tokyo.lifewithunix.jp descriptive text "v=spf1 ip4:116.58.172.107 ~all"

ちゃんと、登録されていました。gmail に到着したメールのヘッダー見てみると、多分、こっちの tokyo.lifewithunix.jp のTXTレコードで動いているような感じ。

SPF は、難解な sendmail.cf など sendmail パッケージ側を触る必要が無かったので、やる事がわかってしまえば設定箇所がDNSだけと少なく、楽でした。

SPFを使って、迷惑メール受信を回避するのはまた別の話。

コメントを残す