【完全ガイド】Postfix基本設定 – main.cfの書き方から配送制御まで徹底解説

未分類

本記事はPostfix公式ドキュメント – BASIC_CONFIGURATION_READMEを元に、日本語で解説したものです。


設定ファイルの基本

2つの主要設定ファイル

ファイル 役割
/etc/postfix/main.cf パラメータ設定
/etc/postfix/master.cf サービス(デーモン)定義

両ファイルは root 所有である必要があります。

パラメータの書き方

# 値の設定
parameter = value

# 他のパラメータを参照($を付ける)
other_parameter = $parameter

Postfixのパラメータは事前に定義されています。$parameter は「既存パラメータの値を参照する」構文で、使用可能なパラメータ一覧は postconf コマンドで確認できます。

遅延評価

Postfixは実行時に必要になるまでパラメータ値を参照しません。そのため、定義順序を気にする必要がありません。

myhostname = mail.$mydomain    # 先に参照してもOK
mydomain = example.com         # 後から定義しても大丈夫

設定変更の反映

postfix reload

サーバーのアイデンティティ設定

myhostname と mydomain

myhostname = mail.example.com   # サーバー自身のFQDN
mydomain = example.com          # ドメイン部分のみ

これらはバーチャルドメインとは別の目的で、サーバー自身のアイデンティティを定義します。

myhostname の用途

場面
SMTP通信での名乗り 250 mail.example.com ESMTP Postfix
バウンスメール送信元 From: [email protected]
Receivedヘッダ Received: by mail.example.com (Postfix) ...
TLS証明書の照合 証明書のCNと一致確認

mydomain の用途

場面 設定例
送信者アドレス補完 myorigin = $mydomain[email protected]
配送先指定の一部 mydestination = localhost.$mydomain
リレー許可設定 relay_domains = $mydomain

myorigin(送信者ドメイン)

ローカルユーザーがメール送信時に付与されるドメインです。

myorigin = $myhostname   # root → [email protected]
myorigin = $mydomain     # root → [email protected](推奨)

受信・ローカル配送の設定

mydestination

このサーバーがローカル配送するドメインを指定します。

# 基本設定
mydestination = $myhostname, localhost.$mydomain, localhost

# ドメイン全体のメールサーバーの場合
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

ドメイン全体のメールサーバー

[email protected] 宛のメールを受け取る場合:

mydestination = $myhostname, localhost, $mydomain

サーバー自身宛のみ

[email protected] 宛だけを受け取る場合:

mydestination = $myhostname, localhost

バーチャルドメインとの関係

設定 用途 ユーザー管理
mydestination 自サーバー/自ドメイン UNIXユーザー(/etc/passwd)
virtual_mailbox_domains ホスティング(複数ドメイン) 仮想ユーザー(DB等)

ホスティング環境での典型設定

# サーバー自身(システムメール用)
mydestination = $myhostname, localhost

# 顧客ドメイン(バーチャル)
virtual_mailbox_domains = customer-a.com, customer-b.co.jp
virtual_transport = lmtp:unix:private/dovecot-lmtp

バーチャルドメインの配送方式

方式1:Postfix内蔵の virtual

virtual_mailbox_domains = customer-a.com, customer-b.co.jp
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox

シンプルだがSieve等の高度な機能が使えません。

方式2:Dovecot LMTP(推奨)

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp

Sieveフィルタ、クォータ管理、インデックス作成が統合されます。


リレー制御の設定

リレー制御は2つの観点から行います。

mynetworks    = 誰から(送信元IP)
relay_domains = どこへ(宛先ドメイン)

mynetworks(送信元制御)

どのIPアドレスからのリレーを許可するかを指定します。

# 簡易設定(いずれか1つ)
mynetworks_style = subnet  # 同一サブネット全体(広域では危険)
mynetworks_style = host    # 自分自身のみ

# 明示的指定(推奨)
mynetworks = 127.0.0.0/8, 203.0.113.10/32

mynetworks を指定すると mynetworks_style は無視されます。

relay_domains(宛先制御)

外部からの接続時、どのドメイン宛の転送を許可するかを指定します。

relay_domains = $mydestination  # デフォルト
relay_domains =                 # 空(転送しない)
relay_domains = $mydomain       # 自ドメインとサブドメインへ転送

主な用途はバックアップMXサーバーやメールゲートウェイです。単独サーバーでバーチャルドメイン運用の場合は空でOKです。


送信経路の設定

relayhost(全体の送信経路)

全ての外部送信メールの経由先を指定します。

relayhost =                      # 直接配信(デフォルト)
relayhost = [mail.isp.tld]       # ISP経由
relayhost = [smtp.gmail.com]:587 # Gmail経由(認証必要)

[] で囲むとDNSのMXルックアップを無効化し、直接そのホストに接続します。

transport_maps(ドメイン別の送信経路)

# main.cf
relayhost =   # 空(デフォルトは直接配信)
transport_maps = hash:/etc/postfix/transport
# /etc/postfix/transport
customer-a.com    smtp:[relay1.example.com]
customer-b.co.jp  smtp:[relay2.example.com]
*                 smtp:   # その他は直接配信

qmail との対比

機能 qmail Postfix
全体経由先 /var/qmail/control/smtproutes:relay.example.com relayhost
ドメイン別経路 smtproutesdomain:relay.com transport_maps

ログ設定

基本設定

# /etc/syslog.conf
mail.err                        /dev/console
mail.debug                      -/var/log/maillog

パス名の前の - は非同期書き込み(バッファリング)を有効にする指定です。高負荷時のパフォーマンスが向上します。

ログ監視コマンド

# 設定チェック
postfix check

# 問題検出
grep -E '(reject|warning|error|fatal|panic):' /var/log/maillog

その他の設定

postmaster への通知

# /etc/aliases
postmaster: [email protected]
root: [email protected]
# 変更後に実行
newaliases

通知クラスの設定

# main.cf
notify_classes = resource, software  # デフォルト
クラス 内容
bounce 配信不能メール
2bounce バウンスの返送失敗
delay 遅延通知
policy ポリシー拒否
protocol プロトコルエラー
resource リソース問題
software ソフトウェア問題

NAT/プロキシ環境

# main.cf
proxy_interfaces = 1.2.3.4  # 外部から見えるIPアドレス

バックアップMXの場合は必須設定です。

inet_interfaces(リッスンアドレス)

inet_interfaces = all                    # 全インターフェース(デフォルト)
inet_interfaces = $myhostname, localhost # 特定のみ

変更後は postfix reload ではなく停止・起動が必要です。

chroot 環境

セキュリティ向上のため、デーモンを chroot 化できます。

# master.cf で設定
smtp      inet  n       -       y       -       -       smtpd
#                               ↑ chroot有効

特に smtpd(受信)と smtp(送信)は chroot 推奨です。


まとめ:設定の全体像

                    Postfix
                       │
        ┌──────────────┼──────────────┐
        ↓              │              ↓
   【受信側】          │         【送信側】
                       │
 どこに配送?          │      どう送る?
        │              │              │
 mydestination         │         relayhost
 virtual_mailbox_*     │         transport_maps
        │              │              │
 local / virtual       │         smtp(外部MTA)
 lmtp(Dovecot)       │

【アクセス制御】
mynetworks = 誰からリレーを受けるか(送信元IP)
relay_domains = どこへ転送するか(宛先ドメイン)

【サーバー識別】
myhostname = サーバーのFQDN(SMTP通信、バウンス送信元)
mydomain = 所属ドメイン(アドレス補完、配送判定)


よくある疑問 Q&A

Q1: $parameter で好きな変数名を作れる?

A: 作れません。

Postfixのパラメータは事前に定義されています。$parameter は「既存パラメータの値を参照する」構文です。

# OK: 既存パラメータの参照
myhostname = mail.$mydomain    # → mail.example.com

# NG: 存在しないパラメータ
myhostname = $my_custom_var    # 動作しない

Q2: myhostname と mydomain は何が違う?

A: スコープが違います。

パラメータ 意味 使われる場面
myhostname このサーバーは誰?(FQDN) 外部との通信、ヘッダ
mydomain どのドメインに属してる? アドレス補完、配送判定
myhostname = mail.example.com
mydomain = example.com

myorigin = $mydomain # → example.com(送信者ドメイン)
mydestination = $myhostname # → mail.example.com(サーバー宛)

Q3: バーチャルドメインがあれば myhostname/mydomain は不要では?

A: 別の目的なので両方必要です。

┌─────────────────────────────────────────────────────┐
│            1台のメールサーバー                       │
│                                                     │
│  ┌──────────────────┐  ┌─────────────────────────┐  │
│  │ サーバー自身      │  │ 顧客ドメイン(バーチャル)│  │
│  │                  │  │                         │  │
│  │ mail.example.com │  │ customer-a.com          │  │
│  │ localhost        │  │ customer-b.co.jp        │  │
│  │                  │  │                         │  │
│  │ → mydestination  │  │ → virtual_mailbox_domains│ │
│  │ → local配送      │  │ → virtual/lmtp配送      │  │
│  └──────────────────┘  └─────────────────────────┘  │
└─────────────────────────────────────────────────────┘

myhostname/mydomainはサーバー自身のアイデンティティ(SMTP通信、バウンス送信元等)に使われます。

Q4: 127.0.0.0/8 を mynetworks に入れないとローカル配送もできなくなる?

A: ローカル配送はできます。

mynetworksはリレー許可(中継送信)の設定で、ローカル配送とは別の概念です。

動作 127.0.0.0/8 なしの場合
ローカル配送(受信) できる
ローカルからのリレー送信 できない

127.0.0.0/8 は同一マシン内のプログラム(Webアプリ、cronジョブ、mailコマンド等)からの送信を許可するための設定です。

Q5: relay_domains は何に使う?

A: MTA間転送のドメインホワイトリストです。

主な用途:

バックアップMXサーバー: プライマリMXがダウンした時に受け取ったメールを転送
メールゲートウェイ: 外部から受け取ったメールを内部サーバーに転送

単独サーバーでバーチャルドメイン運用の場合は relay_domains は空でOKです。

Q6: relayhost の [] で囲む意味は?

A: DNSのMXルックアップを無効化します。

relayhost = mail.example.com      # MXレコードを調べて接続
relayhost = [mail.example.com]    # 直接そのホストに接続

[] で囲むと、意図しないサーバーに接続されることを防げます。

Q7: syslog.confのパス名の前の - は何?

A: 非同期書き込み(バッファリング)を有効にする指定です。

設定 動作 特徴
/var/log/maillog 1行ごとにディスク書き込み 安全だが遅い
-/var/log/maillog バッファ → まとめて書き込み 速い

メールが大量に来る環境では - を付けないと syslogd がボトルネックになります。バッファサイズは 4KB〜64KB 程度なのでメモリ圧迫の心配はありません。


参考資料
Postfix公式ドキュメント – BASIC_CONFIGURATION_README

コメント

タイトルとURLをコピーしました