PR

postfixで不要なメールを消し去る方法

スポンサーリンク

はじめに

メールサーバを運用していると、避けて通れないのが迷惑メール(スパム)の問題です。
ユーザに届く前に不要なメールを“消し去る”ことができれば、セキュリティ・運用負荷ともに大きく改善します。

本記事では、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特定宛先の完全破棄

👉 実務のベストプラクティス

  1. まずSMTPレベルで拒否
  2. それでも残るものを条件でフィルタ
  3. 最後に /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/nullDISCARD は非常に強力
  • その代わり「取り戻せない」

👉 “削除”ではなく“抹消”に近い動作です

まとめ

Postfixで不要メールを消す方法は複数ありますが、重要なのは以下の考え方です。

  • できるだけ早い段階で拒否する
  • 内容チェックは補助的に使う
  • DISCARDは慎重に使う

これらを意識することで、安全かつ効率的なメール運用が可能になります。

また、/dev/null を使うことで、Postfixは「受け取ったメールを確実に消し去る」ことが可能です。
ただし強力な分リスクもあるため、他の拒否設定と組み合わせて慎重に運用しましょう。

誤って消したメールは基本的に復元できません。
そのため、本番環境では段階的に設定を適用し、ログ確認と検証を徹底することが重要です。

今回はここまです。最後までお読み頂きありがとうございました。