はじめに
メールサーバを運用していると、避けて通れないのが迷惑メール(スパム)の問題です。
ユーザに届く前に不要なメールを“消し去る”ことができれば、セキュリティ・運用負荷ともに大きく改善します。
本記事では、Postfixで不要なメールを遮断・破棄する具体的な方法を、実務目線で解説します。
不要メール対策の基本方針
まず大事なのは、「どのタイミングで落とすか」です。
| レイヤー | 内容 | 推奨度 |
|---|---|---|
| SMTP接続時 | IPやドメインで拒否 | ★★★★★ |
| 受信時 | ヘッダ・本文チェック | ★★★★☆ |
| 受信後 | ローカル配送で削除 | ★★☆☆☆ |
👉 結論:できるだけ早い段階で拒否するのがベスト
理由は以下の通りです:
- サーバ負荷が減る
- キューに溜まらない
- ユーザに届かない
方法①:smtpd_recipient_restrictionsで拒否(最重要)
最も基本かつ強力な方法です。
設定ファイル
/etc/postfix/main.cf
記述例
smtpd_recipient_restrictions =
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_rbl_client zen.spamhaus.org,
permit
解説
reject_unknown_sender_domain:存在しないドメインを拒否- reject_unknown_recipient_domain:宛先ドメインのDNSが存在しない(名前解決できない)メールを拒否
reject_rbl_client:ブラックリスト(DNSBL)で拒否
👉 ポイント
ここで弾けるメールが一番コスパ良いです。
方法②:特定IP・ドメインをブラックリスト化
ファイル作成
/etc/postfix/blacklist
記述例
192.168.1.100 REJECT
bad-dassyi.com REJECT
設定追加
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/blacklist
反映
postmap /etc/postfix/blacklist
systemctl restart postfix
👉 使いどころ
- ブラックリストに掲載されている明らかに悪質な送信元
- 同じ送信元から繰り返し来るスパム
方法③:header_checksで件名や送信元で削除
内容ベースで削除する方法です。
ファイル作成
/etc/postfix/header_checks
記述例
/^Subject:.*無料.*/ DISCARD
/^From:.*spam@example.com/ REJECT
設定
header_checks = regexp:/etc/postfix/header_checks
👉 DISCARDのポイント
- エラーを返さず“静かに破棄”
- スパマーに検知されにくい
方法⑤:/dev/null へ配送して不要メールを消し去る
「受信自体はさせるが、最終的に破棄したい」という場合に有効なのが、/dev/null へ配送する方法です。
👉 用途例
- 特定アドレス宛のメールをすべて破棄したい
- テスト用アドレスを無効化したい
- 一部の迷惑メールだけ静かに消したい
■ 方法①:aliases を使って /dev/null に転送
設定ファイル
/etc/aliases
記述例
spamuser: /dev/null
test: /dev/null
反映
newaliases
systemctl restart postfix
👉 動作
spamuser宛のメール → /dev/null → 完全破棄- エラーは返さない(静かに消える)
■ 方法②:virtual_alias_maps でドメイン単位制御
バーチャルドメイン環境の場合はこちらが便利です。
ファイル作成
/etc/postfix/virtual
記述例
spam@example.com /dev/null
*@example.com /dev/null
設定
virtual_alias_maps = hash:/etc/postfix/virtual
反映
postmap /etc/postfix/virtual
systemctl restart postfix
👉 ポイント
- ドメイン単位で一括廃棄が可能
- 退役ドメインの対策に有効
■ 方法③:transport_maps を使う(応用)
配送先そのものを /dev/null に向ける方法です。
ファイル作成
/etc/postfix/transport
記述例
example.com discard:
設定
transport_maps = hash:/etc/postfix/transport
反映
postmap /etc/postfix/transport
systemctl restart postfix
👉 補足
discard:トランスポートは内部的に /dev/null と同様の動き- よりPostfixらしい実装
■ /dev/null を使うメリット・デメリット
メリット
- 完全に破棄される(ユーザに届かない)
- エラーを返さないため攻撃者に気付かれにくい
- 設定がシンプル
デメリット
- ログ以外に痕跡が残らない
- 誤設定すると重要メールも消える
■ 他の方法との使い分け(重要)
| 方法 | 推奨用途 |
|---|---|
| smtpd制限 | 基本(最優先) |
| blacklist | 明確な拒否対象 |
| header_checks | 条件付き削除 |
| /dev/null | 特定宛先の完全破棄 |
👉 実務のベストプラクティス
- まずSMTPレベルで拒否
- それでも残るものを条件でフィルタ
- 最後に
/dev/nullで個別制御
■ 運用ポイント
- 最初はテスト環境で検証する
- いきなり本番で
/dev/nullは危険 - ログ監視は必ず行う
DISCARD / REJECT / HOLD の違い
| アクション | 動作 |
|---|---|
| REJECT | 受信時に拒否(送信側に通知) |
| DISCARD | 受信して捨てる(通知なし) |
| HOLD | キューに保留 |
👉 実務での使い分け
- 基本:REJECT
- スパム対策:DISCARD
- 調査:HOLD
運用で気を付けるポイント
① 誤検知対策
- 正規メールが消えると事故になる
- 最初はREJECTでログ確認がおすすめ
② ログ確認
/var/log/maillog
③ 段階的に適用
いきなりDISCARDは危険
→ 最初はログ確認 → 問題なければ本適用
■ FAQ:誤って消したメールは復元できる?
結論から言うと、基本的に復元はできません。
■ なぜ復元できないのか?
本記事で紹介した以下の方法は、いずれもメールを「完全に破棄」する動作になります。
DISCARD/dev/nullへの配送discard:トランスポート
これらは、メールを保存せずにそのまま捨てるため、サーバ上にデータが一切残りません。
👉 そのため、後から復元することは不可能です。
■ 例外的に復元できる可能性があるケース
以下の場合に限り、復元できる可能性があります。
① HOLDしている場合
HOLD
→ メールキューに残るため確認・再配送が可能
② 外部バックアップがある場合
- メールサーバのバックアップ
- ストレージスナップショット
③ 受信側に届いている場合
- 別サーバに転送されていたケースなど
■ 誤削除を防ぐためのベストプラクティス
① 最初はREJECTで様子を見る
いきなりDISCARDは避ける
② ログを必ず確認する
/var/log/maillog
③ テスト用アドレスで検証
本番適用前に動作確認
④ 一時的にHOLDを使う
/pattern/ HOLD
→ 問題なければDISCARDへ移行
■ 実務的な結論
/dev/nullやDISCARDは非常に強力- その代わり「取り戻せない」
👉 “削除”ではなく“抹消”に近い動作です
まとめ
Postfixで不要メールを消す方法は複数ありますが、重要なのは以下の考え方です。
- できるだけ早い段階で拒否する
- 内容チェックは補助的に使う
- DISCARDは慎重に使う
これらを意識することで、安全かつ効率的なメール運用が可能になります。
また、/dev/null を使うことで、Postfixは「受け取ったメールを確実に消し去る」ことが可能です。
ただし強力な分リスクもあるため、他の拒否設定と組み合わせて慎重に運用しましょう。
誤って消したメールは基本的に復元できません。
そのため、本番環境では段階的に設定を適用し、ログ確認と検証を徹底することが重要です。
今回はここまです。最後までお読み頂きありがとうございました。