tohokuaikiのチラシの裏

技術的ネタとか。

令和7年にMTAをゼロから立てて、SSLを使ったPOP3やSMTP認証もやってみる

今朝何気にこの記事を見て「そういえば、MTAって随分とゼロから立ててないな…」と思った。いつもとりあえずlocalhostで動くPHPからメール送信できるだけのPostfixしか構築やってないからね。

qiita.com

ということで、MTAを立ててPOP3・送信用のSMTPクライアントにもできるようなサーバを作ってみることにした。

要件

  • Linuxで。
  • サーバ名は、mail.mtasetupR7.example.jp で使うメールアドレスは、itoh@mtasetupR7.example.jp
  • 今時のSecureな感じ。
  • Linuxのアカウントとは別の仮想的なPOP3/SMTPアカウントを作って送受信できること。
  • 日本語のスパム判定ソフトも入れてみたい。

これくらいかな…

図にするとこんな感じである。

メール送受信の理解

サーバの調達と構築

アカウント持ってるのでさくらのクラウドで一番安いヤツを調達。1日借りても126円。1時間12年の見積もり。

今日は缶コーヒーを買わないことにする。

プラン/1Core-1GBの、Ubuntu Server 24.04.1 LTS 64bitでハードディスクは20GB、名前をmtaにして構築。

これで十分でしょう。個人的な好みではDebianがいいかなーって思ったけど、あえて違うディストリビューションを選ぶのもまたよいでしょう。

DNSの設定

取得したIPアドレスをmxレコードにする。DNSは本筋じゃないので、この1行だけでお手軽に、Value-Domainの設定だとこんな感じ。

a mail 163.43.224.252
mx mail 10

nslookupで確認

~$ nslookup
> set type=mx
> mtasetupR7.example.jp
Server:         10.255.255.254
Address:        10.255.255.254#53

Non-authoritative answer:
mtasetupR7.example.jp       mail exchanger = 10 mail.mtasetupR7.example.jp.

Authoritative answers can be found from:
> set type=a
> mail.mtasetupR7.example.jp
Server:         10.255.255.254
Address:        10.255.255.254#53

Non-authoritative answer:
Name:   mail.mtasetupR7.example.jp
Address: 163.43.224.252

とりあえずPostfixを入れる

Ubuntu24 ServerってPostfixがデフォルトらしいけど、素のままではMTA入ってないんだ…。

rootになってとりあえずUpdate

apt update && apt upgrade -y

hostnameも設定しておく

hostnamectl set-hostname mail.mtasetupR7.example.jp

Postfixのインストール

apt install -y postfix

Configurationは

項目 設定値
General mail configuration type Internet Site
System mail name mail.mtasetupR7.example.jp

自分用にmailコマンドとemacsを入れておく

apt install -y mailutils emacs

Postfixのインストールと設定

Ubuntu(ってかDebian)ってなんか随分とmain.cfが少なくなってんだな。 とりあえず、postconf コマンドで現在の内容確認しつつやる。

main.cfで自分のホスト名とドメイン名、受信ドメインを設定する。

postconfだと、

mydestination = $myhostname, mail.mtasetupR7.example.jp, mta, localhost.localdomain, localhost
mydomain = localdomain
myhostname = mta.localdomain
myorigin = /etc/mailname

になってる。/etc/hostname の内容は mail.mtasetupR7.example.jp

mydestinaitonにmtaが入ってるのは、さくらのクラウドで構築した時の名前かな。

こんな感じに変更

mydestination = $myhostname, $mydomain, localhost
myhostname = mail.mtasetupR7.example.jp
mydomain = mtasetupR7.example.jp
myorigin = $mydomain

myoriginって何かと思ったけど、ローカルからmailコマンドでメールする時に自動で@以降に付くドメインなのね。忘れてるわー。多分1週間後にも忘れてる…

ネットワーク設定でipv6はよくわかってないのでパス。まぁ、あと30年はipv4は無くならないでしょう。

inet_protocols = ipv4

ここで postconf -n してwarningとか出てないかチェック。

ポートを開ける

使うTCPポートは以下の通り。

プロトコル ポート番号 説明
SMTP 25 外部からのメール受信
SMTPS 465 SMTP over SSL(必要に応じて)
Submission 587 クライアントからのメール送信(推奨)
IMAP 143 クライアントがIMAPでメール受信
IMAPS 993 IMAP over SSL(推奨)
POP3 110 クライアントがPOP3でメール受信
POP3S 995 POP3 over SSL(推奨)

ながらくDebianを継ぎ足して使っているので、iptables -Lとかやってるんだけどイマドキはfirewall-cmdとか使うんだな。Ubuntuだとufwらしい。ちなみに、Debian12だとnftablesが推奨らしい。いやはやなんでディストリビューションごとにコマンド違うねーん。まあ、違うからディストリビューションなんだけどさ…

ufw allow 22/tcp 
ufw allow 25/tcp 
ufw allow 587/tcp
ufw allow 993/tcp
ufw allow 995/tcp
ufw allow 80/tcp 
ufw allow 443/tcp

sshが切られるとかなんので起動する前に ufw show added でチェックする。先ほどのコマンドと同じものが出てくる。

ufw enable

で、ufw statusすると状態が確認できる。

80と443番はSSL証明書のLet's Encryptを利用する際に使用する。

ufw status numbered

で、番号確認して

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 25/tcp                     ALLOW IN    Anywhere
[ 3] 587/tcp                    ALLOW IN    Anywhere
[ 4] 993/tcp                    ALLOW IN    Anywhere
[ 5] 995/tcp                    ALLOW IN    Anywhere
[ 6] 80/tcp                     ALLOW IN    Anywhere
[ 7] 443/tcp                    DENY IN     Anywhere
[ 8] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 9] 25/tcp (v6)                ALLOW IN    Anywhere (v6)
[10] 587/tcp (v6)               ALLOW IN    Anywhere (v6)
[11] 993/tcp (v6)               ALLOW IN    Anywhere (v6)
[12] 995/tcp (v6)               ALLOW IN    Anywhere (v6)
[13] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[14] 443/tcp (v6)               DENY IN     Anywhere (v6)

なので、

ufw delete 6

とかして複数指定できないのでチマチマと消していく。

メールチェック

この時点でメールを受信できているか確認すると問題なくGmailから受信できていた。

バーチャルアカウントの設定

Ubuntuのアカウントと連動させないでバーチャルメールボックスにする。 まぁ、アカウントのメールボックスでもいいんだけど、メールとしてしか使用しないならそれでもいいじゃんと。

バーチャルアカウント用アカウントの作成

新しい古新聞みたいな言い回し…アカウント名はなんでもいいけどvmailユーザーにします。

sudo groupadd vmail
sudo useradd -r -g vmail -m -d /var/mail -s /sbin/nologin vmail
  • -r: システムユーザーとして作成
  • -g vmail: vmail グループに所属
  • -m: ホームディレクトリを作成
  • -d /var/mail: メールボックスが保存されるディレクト
  • -s /sbin/nologin: ログインしないので不許可にしておく

メールボックス周りの設定

このドメイン用のメールディレクトリを作成して、所有権をvmailにしておく。

mkdir -p /var/mail/vhosts/mtasetupR7.example.jp
chown -R vmail:vmail /var/mail/vhosts/mtasetupR7.example.jp
chmod -R 700 /var/mail/vhosts/mtasetupR7.example.jp

main.cfの設定

# どのドメインがバーチャルメールボックスを使うかを明記
virtual_mailbox_domains = mtasetupR7.example.jp
# メールボックスのルートディレクトリ
virtual_mailbox_base = /var/mail/vhosts
# バーチャルメールボックスの設定ファイル
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox

バーチャルメールボックスのユーザーごとのディレクトリ設定

先ほどの /etc/postfix/virtual_mailboxにメールアドレスごとにディレクトリを指定する。ディレクトリのbaseになるのは virtual_mailbox_base の値。

itoh@mtasetupR7.example.jp   mtasetupR7.example.jp/itoh/

この時、ディレクトリ指定として末尾の/を忘れるとmbox形式になるので、Maildir形式にしたい場合は注意が必要。

先にディレクトリを掘っておいてvmailユーザーオーナーにする。

mkdir -p /var/mail/vhosts/mtasetupR7.example.jp/itoh

設定ファイルを記述したらpostmapコマンドでBerkeley DB (BDB) 形式に変換する。

postmap /etc/postfix/virtual_mailbox

以下のpostmapコマンドでメールアドレスに対応するディレクトをチェックできる。

postmap -q "itoh@mtasetupR7.example.jp" hash:/etc/postfix/virtual_mailbox

いったんここまででPostfixをrestartしてチェック。

 systemctl restart postfix

同じドメインをmydestination と virtual_mailbox_domains の両方に設定してはいけない

送信テストしたら、User unknownでエラーメールがが返ってきた。サーバのエラーログを見ると、

 warning: do not list domain mtasetupR7.example.jp in BOTH mydestination and virtual_mailbox_domains

ということで、mydestinationからは ochi2poingpont.org を削除。

またエラーログ出てた…ので対応。

warning: recipient itoh@mtasetupR7.example.jp: not found in virtual_uid_maps

main.cfで保存するメールのOS上のオーナーとグループを指定しないといけないらしい。なんで?

idコマンドでuidを見つける。

id vmail
uid=999(vmail) gid=1001(vmail) groups=1001(vmail)

ここまででメール送信テストすると受信できてバーチャルメールボックスの所定のディレクトリに入っていた。

TLS/SSL環境を整える

証明書、自前のオレオレ証明書でもいいんだけど、まぁちゃんとやるならLet's Encryptで取得しても大差ないかな…と。

サーバに使われる証明書はなんや?って話

証明書は送受信になるから複数のケースで使われる。

  • 自分から相手のメールサーバの25番ポートにSMTP送信する時にSTARTTLSで使用する時…HELO/EHLOホスト名で行ってもよさそうなもんだけど、これは行わない。送信側の証明書はチェックされない。SPFDKIMによるチェックを受信側が行う必要がある。ちなみに、HELO/EHLOホスト名は、Receivedヘッダに表示される。Received: from e234-1.smtp-out.ap-northeast-1.amazonses.com とか。
  • 相手のメールサーバから自分の25番ポートにSTARTTLSを使って配送されてきた時…自分のmydestinationやvirtual_mailbox_domainsにあるドメインで問い合わせてくるサーバに対しては、ドメイン→mxレコードで指定されたサーバ名の証明書が使われる。
  • メールクライアントソフト(Thunderbirdなど)からSMTP/POP3認証される時…メールクライアントソフト(Thunderbirdなど)が証明書を確認する時は、メールクライアントソフトのサーバ設定で指定された接続先サーバ名の証明書が使われる。

で、メールクライアントソフトから接続される場合は、どのメールを出しているかだけのチェックなので複数ドメインのMTAとして稼働している場合は、なんか適当なホスト名を付けて証明書を取得するのがよいだろう。 たとえば、valud-domainのCoreサーバなんかは、接続先メールサーバはどのドメインとっても同じコアサーバ(m34.coreserver.jpとか)である。ただし、受信する時にはそうはいかない。

ということで、必要な証明書は、mxレコードに記載しているホスト名

$ nslookup
> set type=mx
> mtasetupR7.example.jp
Server:         10.255.255.254
Address:        10.255.255.254#53

Non-authoritative answer:
mtasetupR7.example.jp       mail exchanger = 10 mail.mtasetupR7.example.jp.

なので、mail.mtasetupR7.example.jp.をウェブサーバをこのサーバに立ててLet's Encryptの証明書を取得する。

Let's Encryptで証明書取得

apt install -y certbot
certbot certonly --standalone

であとは英語の内容に従って進むだけ。…あれ?Apache要らないの?ChatGPTに聞いたら、「Certbotが一時的に自分自身でウェブサーバの役割を果たし、証明書を発行します。」ってことらしい。すげーね。

こんな感じでした。自前証明書より楽かも。

# certbot certonly --standalone
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel):
Invalid email address: .


If you really want to skip this, you can run the client with
--register-unsafely-without-email but you will then be unable to receive notice
about impending expiration or revocation of your certificates or problems with
your Certbot installation that will lead to failure to renew.

Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): ********@********.******

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.5-February-24-2025.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): mail.mtasetupR7.example.jp
Requesting a certificate for mail.mtasetupR7.example.jp

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem
This certificate expires on 2025-06-23.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

証明書の更新

あとは、/etc/cron.d/certbot にて既に登録してあるので自動更新される…はず。

クライアントソフト(Thunderbird)でメール受信するために

Thunderbird Portableを持ってきてインストールしておく。

Dovecot のインストールと設定

apt install dovecot-pop3d dovecot-core

設定値は doveconf コマンドで確認できる。-Pオプションでssl_keyの設定値も確認できる。

証明書をLet's Encryptで取得したもので指定

ssl_cert = </etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem

サーバー上に複数のホストがあり、同一のIPアドレスを使っている場合に、local_nameディレクティブを使った設定ができるようだ。

local_name example1.org {
    ssl_cert = </etc/pki/dovecot/certs/example1.org.crt
    ssl_key = </etc/pki/dovecot/private/example1.org.key
}
local_name example2.org {
    ssl_cert = </etc/pki/dovecot/certs/example2.org.crt
    ssl_key = </etc/pki/dovecot/private/example2.org.key
}

…が、今回はやらない。ここは何もしない。

あと、使うのはIPv4だけする。

listen = *

POP3の認証設定

このあたりの設定は、こちらの記事を参考にしている。

# パスワードをcram-md5で暗号化したもので設定する。
auth_mechanisms = cram-md5
# システムで使っているPAM認証はコメントアウトして無効化
# !include auth-system.conf.ext
# 有効化
!include auth-passwdfile.conf.ext
# 有効化
!include auth-static.conf.ext

バーチャルメールボックスにアクセスできるパスワード設定を行う。

args = scheme=CRYPTを args = scheme=CRAM-MD5 に変更。

passdb {
  driver = passwd-file
  args = scheme=CRAM-MD5 username_format=%u /etc/dovecot/users
}
#userdb {
# ... このセクションは全部無効化し、auth-static.conf.ext の設定を活かす
#
#}

uid,gitは先ほど作成したLinuxユーザーのvmailと同じになるようにして、メールの入っているディレクトリは、/var/mail/vhostsになるようにする。%dはドメイン名%nはユーザー名

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%u
}

最後にメールの保管されているディレクトリの設定で、Maildir形式でスプール先のディレクトリを先ほどと同様に指定する。

mail_location =  maildir:/var/mail/vhosts/%d/%n

dovecot独自のユーザー情報の作成

パスワードをCRAM-MD5で設定したので、それで作成する。

doveadm pw -s CRAM-MD5

とすると、ハッシュ化したパスワードを作ってくれる。

{CRAM-MD5}f5696175cd91366a37790asef93f3jlf3f3767b0da65d1a85bad8757dbd42

ユーザー情報は、 /etc/dovecot/conf.d/auth-passwdfile.conf.ext で設定した通り、/etc/dovecot/usersに記す。

itoh@mtasetupR7.example.jp:{CRAM-MD5}f5696175cd91366a37790asef93f3jlf3f3767b0da65d1a85bad8757dbd42

で、 systemctl restart dovecot 再起動。

ここまででThunderbirdから確認

こんな感じで設定。

Thunderbirdのアカウント追加はメールアドレスとさっきCRAM-MD5で設定したパスワードを入力すればうまくやってくれた。

Thunderbirdがうまくやってくれた設定はこんな感じ。

クライアントソフト(Thunderbird)でメール送信するために

SMTP認証をしなければならない。なんか、15年前にやった時は死ぬほど面倒だったな…あれー、その時の記事ってどこいったかな…自前サーバだったから無くなったか。

SASLによる認証とは?

SMTP認証を行う際に使用されるSASL (Simple Authentication and Security Layer) とは、メールやその他のネットワークプロトコルで認証機能を提供するためのフレームワーク

Postfixでは、SMTP認証を有効にするために SASL を利用する。次の2つの実装がある。

・Cyrus SASL: libsasl2 ライブラリを使用する実装
Dovecot SASL: DovecotIMAP サーバー)が提供する SASL 認証機能

SASL の認証方法としては以下がある。
・PLAIN: ユーザー名とパスワードを Base64エンコードして送信(暗号化なしでは危険)
・LOGIN: PLAIN とほぼ同じ(非推奨)
・CRAM-MD5: MD5 ハッシュを用いたチャレンジレスポンス認証
・DIGEST-MD5: CRAM-MD5 の強化版(現在は非推奨)
・SCRAM-SHA-1 / SCRAM-SHA-256: より安全なチャレンジレスポンス認証
・OAuth / OAUTHBEARER: OAuth 2.0 トークンを利用した認証

PostfixSMTP認証をSASLで実現

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous,noplaintext
smtpd_sasl_local_domain = $myhostname

smtpd_sasl_security_optionsは以下の意味のオプション値なので,区切りで複数並べられる。

  • noplaintext: 平文パスワードを使う認証方法を許可しません。
  • noactive: non-dictionary active 攻撃に脆弱な認証方法を許可しません。
  • nodictionary: passive dictionary 攻撃に脆弱な認証方法を許可しません。
  • noanonymous: 匿名ログインを許可しません。

smtpd_sasl_local_domainはSASLの認証の際にユーザー名だけが送られてきたら、@以下を子のドメインで補完するという設定。設定しなくてもいいんじゃないかな。

DovecotのID/PASSを使ってSMTP認証をしたい。

せっかくDovecotでID/PASS設定をしたので、それをSMTP認証でも使い回したいじゃないですか。

デフォルトだと、smtpd_sasl_type = cyrus のため、saslpasswd2 コマンドを使ってID/PASS設定DBを作ってそれをSMTP認証用として使うことになる。とても面倒になる。

Dovecotの認証サービスを起動させる

/etc/dovecot/conf.d/10-master.confservice auth { unix_listener /var/spool/postfix/private/auth{セクションを変更する。

service auth {
    unix_listener /var/spool/postfix/private/auth{
        mode = 0666
    }
}

systemctl restart dovecotで再起動すると、/var/spool/postfix/private/auth のUnix Socketができている。

ここで、

    mode = 0666
    user = postfix
    group = postfix

という解説もあったが、特にrootのUnix Socketでも問題なかった。

PostfixSMTP認証(SASL)設定をもう一度。

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

を追加する。smtpd_sasl_path は先ほどのDovecotUnix Socketパス。これはPostfixchrootしたディレクトリからの相対パスである。 chrootパスは、postconf |grep queue_directoryを実行することで確認できる。

systemctl restart postfixPostfixの再起動。

SMTP認証の接続を確認

swaksというメールテストができるコマンドがある。メールサーバ内からだと --server localhostにしてやる

swaks --auth \
      --auth-user itoh@mtasetupR7.example.jp \
      --auth-password ************* \
      --server mail.mtasetupR7.example.jp \
      --to recipient@test.example.com

すると、以下のようにメール送信が成功したと出る。

=== Trying mail.mtasetupR7.example.jp:25...
=== Connected to mail.mtasetupR7.example.jp.
<-  220 mail.mtasetupR7.example.jp ESMTP Postfix (Ubuntu)
 -> EHLO DESKTOP-BR8SCJA.
<-  250-mail.mtasetupR7.example.jp
<-  250-PIPELINING
<-  250-SIZE 10240000
<-  250-VRFY
<-  250-ETRN
<-  250-STARTTLS
<-  250-AUTH CRAM-MD5
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250-SMTPUTF8
<-  250 CHUNKING
 -> AUTH CRAM-MD5
<-  334 PDA5ODkyMTQyMDc0NDYzMzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBvbmcub3JnPg==
 -> aXRvaEBvY2hxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxjljY2EwMWJjNA==
<-  235 2.7.0 Authentication successful
 -> MAIL FROM:<t-ito@DESKTOP-BR8SCJA.>
<-  250 2.1.0 Ok
 -> RCPT TO:<recipient@example.com>
<-  250 2.1.5 Ok
 -> DATA
<-  354 End data with <CR><LF>.<CR><LF>
 -> Date: Wed, 26 Mar 2025 11:49:55 +0900
 -> To: recipient@example.com
 -> From: t-ito@DESKTOP-BR8SCJA.
 -> Subject: test Wed, 26 Mar 2025 11:49:55 +0900
 -> Message-Id: <20250326114955.002667@DESKTOP-BR8SCJA.>
 -> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
 ->
 -> This is a test mailing
 ->
 ->
 -> .
<-  250 2.0.0 Ok: queued as 327686AFB1
 -> QUIT
<-  221 2.0.0 Bye

ちなみに、dovecotプラグインは不要らしい。

postconf -APostfixプラグインとしてcyrusしか出てこないことがある。(というかデフォルトでは出ないらしい)が使えた。

STMP認証はSubmissionポートの587だけにしたいし、TLS/SSL必須にしたい。

先ほどの swaksのログを見ると、

=== Trying mail.mtasetupR7.example.jp:25...

と25番ポートでSMTP認証が成功してしまっている。25番はサーバ間のメール配送だけにしてSMTP認証は587番ポートだけにしてしまいたい。 さらに、TLS/SSLが必須にしたい。

Postfixのmaster.cf設定で暗号化されていない通信でのSMTP認証を禁止

smtp-o smtpd_sasl_auth_enable=noを付けてSMTP認証しないようにする。

submissionを有効にして、以下のオプションを付ける

  • -o smtpd_sasl_auth_enable=yesSMTP認証を可能
  • -o smtpd_tls_auth_only = yesSMTP認証はTLS/SSL必須
  • -o smtpd_tls_security_level=encryptSMTPクライアントは全てTLS/SSL必須
  • -o syslog_name=postfix/submissionでログに残る名前をsubmissionと分かるようにする。
smtp      inet  n       -       y       -       -       smtpd
  -o smtpd_sasl_auth_enable=no

submission inet n       -       y       -       -       smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_security_level=encrypt
  -o syslog_name=postfix/submission
  -o smtpd_tls_auth_only = yes
  -o smtpd_tls_cert_file=/etc/letsencrypt/live/mail.mtasetupR7.example.jp/fullchain.pem
  -o smtpd_tls_key_file=/etc/letsencrypt/live/mail.mtasetupR7.example.jp/privkey.pem

なんか送信時にAuthエラー出た。…と思ったらクライアントでSSL使ってなかったわ。

swaksコマンドで --port 587付けて送信したらエラーが出た。

*** Host did not advertise authentication

  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_auth_only=yes

この2つのオプションを無効にしたら問題なくいった。ってことは、swaksがTLS/SSLでないってことやん…

swaksのテストのし直し

swaksでTLS/SSLを使うには、--tlsオプションが必要。ってことで

swaks --auth --tls\
      --auth-user itoh@mtasetupR7.example.jp \
      --auth-password ************* \
      --server mail.mtasetupR7.example.jp \
      --to recipient@test.example.com

としたら問題なくできた。

逆に、TLSを使ってないとエラーになるっていうことも確認できた。

Thunderbirdのメール送信で手間取ってしまったが、なんかパスワードの認証方式でキャッシュが残ってる感じ…よくわからなかったがパスワードリセットをしたり送信サーバの再設定などしてみたら通るようになった。

ちなみにThunderbirdの設定値はこんな感じ。

項目
Description: test
Server Name: mail.mtasetupR7.example.jp
Port: 587
User Name: itoh@mtasetupR7.example.jp
Authentication method: Normal password
Connection Security: STARTTLS

スパム対策(送信)のためにDKIMとDMARCの設定をする

以前書いたこのエントリ「今更ながら、自前サーバーにDKIMを導入したのでメモ(Debian11+Postfix +openDKIM) - tohokuaikiのチラシの裏」をそのままやってみる。

今回、やり方を変えて、OpenDKIM側はUnix Socketを作ることにした。

Socket                  local:/run/opendkim/opendkim.sock

それに合わせてPostfix

smtpd_milters = local:/run/opendkim/opendkim.sock

とした。すると、/var/log/mail.log に以下のエラーが出る。

2025-03-26T16:53:57.829800+09:00 mail postfix/submission/smtpd[9236]: warning: connect to Milter service local:/run/opendkim/opendkim.sock: No such file or directory

# ls -l /run/opendkim/opendkim.sock
srwxrwx--- 1 opendkim opendkim 0 Mar 26 16:26 /run/opendkim/opendkim.sock

あるじゃん…

でもopendkimグループにpostfixが所属してないからダメなんだね。

usermod -a -G opendkim postfix

…上手くいかない…inetにしたら上手くいくんだけどなー。あれー。と思ったら、Postfixchrootしていたからだった。

chrootしたPostfixに合わせてOpenDKIMのSocketを作る方法

Postfixchrootディレクトリは

# postconf |grep queue_directory
queue_directory = /var/spool/postfix

なので、さっきの設定を変える。

Socket                  local:/var/spool/postfix/opendkim/opendkim.sock

それに合わせてPostfix

smtpd_milters = local:/opendkim/opendkim.sock

とする。パスの指定はchrootディレクトリから。

そして、Socketを作れるように

chown postfix:opendkim /var/spool/postfix/opendkim
chmod 775  /var/spool/postfix/opendkim

としておく。

/var/spool/postfix/opendkim/opendkim.sock は、オーナー opendkim:opendkimで作られるが、postfixユーザーはopendkimグループに入っているのでsocketの読み込みもできる。

DMARCを設定する

SPFメーラー関係ないのでここでの設定方法は割愛する。簡単だし。

で、GmailSPFDKIMもPASSしてるのに

From ヘッダー Takashi ITOH itoh@mtasetupR7.example.jpDKIM ドメイン mtasetupR7.example.jp と一致しません。この From ヘッダーの ID は「なりすまし」の可能性があるため、このメールには注意してください

と出る。DMARCを設定したら問題なくなった。Value-DomainDNS設定だと以下の通り。

txt _dmarc v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@mtasetupR7.example.jp

スパム対策(受信)のために

Rspamd とかのスパム判定ツールを入れたかったけど、それはまたの機会に…