Linuxでのメールサーバー構築における現実的な課題
ローカル環境では問題なく動いていた通知送信スクリプトをCentOS Stream 9サーバーにデプロイした途端、メールが届かなくなって冷や汗をかいたことはありませんか?さらに悪いことに、送信できても顧客のスパムフォルダに「このメールは暗号化されていません」という赤い警告とともに振り分けられてしまうこともあります。
今年の初め、あるクライアントのためにCentOS Stream 9ベースの監視システム(monitoring)を構築するタスクを引き受けました。ZabbixからPrometheusまで順調でしたが、アラート設定で躓きました。Postfixをインストールしてsystemctl startコマンドを叩けば終わりだと思っていましたが、現実はもっと厳しいものでした。GmailやOutlookなどの大手プロバイダーは現在、非常に厳格です。サーバーにTLS暗号化が不足していたり、DNSレコードが標準から外れていたりすると、99%の確率で門前払いされます。
なぜあなたのメールサーバーは「大手プロバイダー」に拒否されるのか?
/var/log/maillogのログを数晩かけて分析した結果、CentOS Stream 9上のメールサーバーが頻繁にブロックされる主な4つの理由をまとめました:
- 時代遅れのプレーンテキストプロトコル: TLS暗号化なしでメールを送信するのは、内容が丸見えのハガキを送るようなものです。Googleは即座にリスクフラグを立てます。
- 脆弱なSMTP認証: 認証を要求しないサーバーは、簡単に「オープンリレー(Open Relay)」化します。ハッカーにIPを悪用されて世界中にスパムをバラ撒かれ、わずか数時間でIPがブラックリスト入りしてしまいます。
- FirewalldとSELinuxによる障壁: CentOS Stream 9のセキュリティは非常に強固です。サービスが起動していても25、465、587ポートがブロックされていたり、SELinuxがPostfixによる証明書ファイルの読み取りを許可していなかったりすることがあります。
- 不完全なDNS設定: A、MX、SPFなどの重要なレコードが欠落していることは、メールがなりすましと判定される最大の要因です。
どの構築方法を選ぶべきか?
この課題に対し、DevOpsエンジニアは通常、次の3つのアプローチを検討します:
- 外部リレーサービス(SendGrid、Mailgun)の利用: 導入が速く到達率も高いですが、コストがかかります。システムメールを大量(月間5万通など)に送信する場合、費用は馬鹿になりません。
- メールスイート(iRedMail、Zimbra)の利用: 多機能ですが非常にシステムが重いです。RAM 1-2GB程度のVPSでは、これらのインストールはシステムへの拷問に近いものがあります。
- 純粋なPostfix: これこそが技術者にとっての「正解」です。軽量でカスタマイズ性が高く、メールフローを完全に制御できます。
CentOS Stream 9でのTLS対応Postfixの構築
以下は、Mail-Testerで10/10点を獲得するために私が実際に適用した構築手順です。
1. システムの準備
まず、ホスト名をFQDN形式で設定します。ここでは例としてドメインをmail.itfromzero.vnとします。
hostnamectl set-hostname mail.itfromzero.vn
echo "127.0.0.1 mail.itfromzero.vn" >> /etc/hosts
2. PostfixとSASLのインストール
dnfを使用してインストールします。ユーザー認証をスムーズに行うためにcyrus-saslも追加します。
dnf update -y
dnf install postfix cyrus-sasl cyrus-sasl-plain mailx -y
3. main.cf設定の最適化
長大なデフォルトファイルをそのまま使わず、バックアップを取った上でコアパラメータに集中しましょう。以下は最小限ながら非常に効果的な設定です:
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
vi /etc/postfix/main.cf
サーバーの識別情報を定義するために、以下の行を更新します:
myhostname = mail.itfromzero.vn
mydomain = itfromzero.vn
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
4. TLSセキュリティの有効化
メールをスパム扱いにされたくなければ、暗号化は必須です。Let’s Encryptの証明書があれば最適です。注意:postfixユーザーが証明書キーを含むディレクトリの読み取り権限を持っていることを確認してください。
# セキュリティ向上のためのTLS設定
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtp_tls_loglevel = 1
5. ファイアウォールの開放とSELinuxの設定
このステップは非常に重要です。ポートを開放し忘れると、メールは永遠に送信待ち(キュー)に溜まったままになります。
firewall-cmd --permanent --add-service=smtp
firewall-cmd --permanent --add-port={587,465}/tcp
firewall-cmd --reload
SELinuxについて、証明書を独自のディレクトリに保存している場合は、正しいコンテキスト(ラベル)を割り当てる必要があります:
setsebool -P postfix_local_write_mail_spool on
chcon -t cert_t /path/to/your/cert.pem
6. 起動と結果の確認
サービスを有効化し、netstatコマンドで25番ポートが「Listen」状態か確認します。
systemctl enable --now postfix
netstat -plnt | grep :25
テストメールを送信して結果を確認してみましょう:
echo "CentOS 9からのTLSテスト内容" | mail -s "Postfix Test" [email protected]
運用における「血肉となる」経験
CentOS 8からCentOS Stream 9へシステムを移行した際、**逆引きDNS (PTRレコード)**に関する貴重な教訓を得ました。どれだけPostfixの設定が完璧でも、サーバーのIPが正しくドメインmail.itfromzero.vnを逆引きできなければ、Gmailは容赦なく拒否します。
コツとしては、デバッグ中に常にターミナルでtail -f /var/log/maillogを実行しておくことです。認証エラーや接続エラーがすべてここに明確に表示されます。推測に頼らず、ログに語らせましょう。
これらの共有が、最新のLinux版でメールサーバーを構築する際の自信につながれば幸いです。解決の難しいエラーがあれば、ぜひ下のコメント欄に書き込んでください!

