本記事は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 |
| ドメイン別経路 | smtproutes の domain: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 程度なのでメモリ圧迫の心配はありません。


コメント