これで構築されるもの
完全なシングルドメインメールサーバー: トランスポートに Postfix、IMAP とローカル配信に Dovecot、フィルタリングと DKIM 署名に rspamd、そして大手受信事業者がメールを受信トレイに入れるか誰も開かないフォルダに振り分けるかを決定する3つの DNS レコード。送信も受信も認証もでき、オープンリレーではありません。
独自メールサーバーの運営は流行らないアドバイスであり、それにはそれなりの理由があります。難しいのはソフトウェアではなく、到達性です。DNS を間違えると、世界で最も注意深く設定された Postfix でもメッセージは虚空に向かって送信されます。
始める前に
- R-8 以上。フィルタリングは CPU バウンドであり、rspamd はスパム波の間に与えられたすべてのコアを喜んで使用します。
- DNS を管理できるドメインと、伝播に対する忍耐。
- インスタンスアドレスの逆引き DNS をメールホスト名に設定します。パネルから編集可能で、必須です。受信側は解決できない送信者を拒否します。
- サポートへのチケット1つで、インスタンスの送信ポート 25 が開いているかどうかを尋ねます。構築する前に尋ねてください。構築した後ではなく。
- 全体を通して
mail.example.com。独自のものに置き換えてください。
1. ホスト名と DNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -y証明書の手順で A レコードが必要であり、署名の手順でキーを配置する場所が必要なため、これらのレコードを今公開してください。表の値は各レコードが何をするかであり、貼り付ける内容ではありません。
| レコード | 名前 | 内容 |
|---|---|---|
| A / AAAA | mail | パネルからのインスタンスアドレス |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s |
| PTR | インスタンスアドレス | mail.example.com — パネルで設定 |
SPF レコードは次のことを示します: 私の MX ホストがメールを送信し、それ以外はすべて偽造です。ソフトフェイルではなくハードフェイルを使用します。~all は受信側に独自の判断を促し、その判断は寛大なものではないためです。DMARC は p=none で始まり、あなたに代わって何かが拒否される前に1週間レポートを収集します。
2. 証明書
apt install -y certbot
certbot certonly --standalone -d mail.example.comポート80でリッスンしているものはまだないため、スタンドアロンモードが最も簡単な方法です。更新フックは最後に、デーモンが存在してリロードできるようになったときに追加します。
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-server次に、トランスポート設定を設定します。以下のすべての行は意図的です。postconf はそれらをその場に書き込むため、編集者を間違えることはありません:
postconf -e "myhostname = mail.example.com"
postconf -e "mydestination = localhost"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "inet_interfaces = all"
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem"
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtp_tls_security_level = dane"
postconf -e "smtpd_tls_mandatory_protocols = >=TLSv1.2"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_recipient_domain reject_unauth_destination"
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
postconf -e "virtual_mailbox_domains = example.com"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
postconf -e "milter_default_action = accept"最も重要な行は smtpd_relay_restrictions です。reject_unauth_destination で終わり、これによりインターネット全体があなたのマシンを使用してメールを送信するのを防ぎます。オープンリレーは数時間でブラックリストに登録され、さらに利用規約違反にもなります。
サブミッションポートを有効にして、自分のクライアントが送信できるようにし、認証を必須にし、匿名アクセスは禁止します:
postconf -M submission/inet="submission inet n - y - - smtpd"
postconf -P "submission/inet/syslog_name=postfix/submission"
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"4. Dovecot
単一のシステムユーザー配下の Maildir にメールボックスを置くと、この構築は小さく保たれます。ユーザーとストレージを作成します:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 -d /var/vmail -m vmail
install -d -o vmail -g vmail -m 700 /var/vmail/example.com/etc/dovecot/conf.d/99-local.conf を書きます:
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
auth_mechanisms = plain login
disable_plaintext_auth = yes
passdb {
driver = passwd-file
args = scheme=ARGON2ID username_format=%u /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}メールボックスを作成します。コマンドは2回プロンプトを表示し、パスワード自体ではなくハッシュを書き込みます:
echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users5. rspamd と DKIM
署名キーを生成し、公開鍵を公開します:
install -d -o _rspamd -g _rspamd -m 750 /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -b 2048 -d example.com -k /var/lib/rspamd/dkim/example.com.mail.key
chown _rspamd:_rspamd /var/lib/rspamd/dkim/example.com.mail.key
chmod 400 /var/lib/rspamd/dkim/example.com.mail.keyそのコマンドは DNS レコードを標準出力に出力します。mail._domainkey.example.com の TXT レコードとして、印刷されたとおりに、引用符で囲まれたセグメントを DNS プロバイダーが期待する方法で結合して公開します。次に、rspamd にキーの場所を /etc/rspamd/local.d/dkim_signing.conf で伝えます:
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;ミルターをバインドし、Web インターフェースのパスワードを設定します:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pw結果のハッシュを /etc/rspamd/local.d/worker-controller.inc に password = "..." として貼り付けます。ポート 11334 を外部に公開するのではなく、SSH トンネル経由でインターフェースに到達します。
6. すべてを起動
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failed新しい証明書が両方のデーモンに届くように更新フックを追加します:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh検証する
3つのテスト。最初はローカル、2番目は重要なもの、3番目はブラックリストに載らないようにするものです。
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"次に、新しいサーバーから大手ウェブメールプロバイダーで保持しているメールボックスにメッセージを送信し、受信したメッセージを開いて生のヘッダーを読みます。探しているのは1行です:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.com3回成功したら完了です。dkim=none は rspamd が署名していないことを意味するため、rspamadm configdump dkim_signing を確認してください。spf=fail はほとんどの場合、SPF レコードが v4 MX アドレスのみをカバーしているのに、メッセージが IPv6 経由で送信されたことを意味します。
最後に、リレーではないことを証明します。他のマシンから接続し、所有していない2つのドメイン間でメールを送信してみます:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.com正しい結果は、受信者段階での拒否です: 554 5.7.1 Relay access denied。それ以外の場合は、当日中に悪用されるマシンを設定したことになります。停止して手順3を読み直してください。
その後
DMARC を p=none のまま1週間置き、集約レポートを読みます。自分のサーバーだけが自分のメールに署名していることが示されたら、p=quarantine に移動し、2週間後に p=reject に移動します。その間に /var/vmail のオフノードバックアップを追加してください。メールはユーザーが二重のコピーを持っていない唯一のものであり、バックアップアドオンはインスタンスとは異なるサイトに書き込むためです。