2018年4月17日火曜日

Postfixのmain.cfの設定変更は自動反映されるので注意!


Postfixの主要な設定を記載するファイルは、/etc/postfix/main.cfとなる。

main.cfに設定変更を加えたのち、Postfixをreloadすることで設定反映を行うという手順は、さまざまなサイトで言及されている手順となる。

しかし、main.cfの設定は自動反映されることがある。したがって、事前にmain.cfに設定変更を行っておき、任意のタイミングで反映するような作業計画は危険であり、main.cfの設定変更は、設定反映と同じタイミングで実施するよう計画すべきである。

しかし、reloadしなくても反映される場合、どのようなタイミングで反映されるかが気になるので調べてみることにした。

Postfixをデバッグモードにする

通常の設定では詳細なログが出力されないので、Postfixをデバッグモードにする。以下の通り、master.cfのsmtp行に「-v」のオプションを付ける。

# cat /etc/postfix/master.cf | grep -v -e "^#"
------------------------------
smtp      inet  n       -       n       -       -       smtpd -v
------------------------------

設定反映のため、Postfixを再起動する。

# systemctl restart postfix

設定反映のタイミングを確認

Postfixで複数の管理ドメインを持つバーチャルメールボックスの構成としている状況で、管理ドメインの設定ファイルからドメインを1つコメントアウトしてみる。

【main.cfの設定】
# cat /etc/postfix/main.cf | grep virtual
------------------------------
virtual_mailbox_domains = /etc/postfix/vdomains
virtual_mailbox_base = /var/spool/virtual
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_alias_maps = hash:/etc/postfix/virtual
------------------------------

【変更前】
# cat /etc/postfix/vdomains
------------------------------
example.com
example1.com
example2.com
------------------------------

【変更後】
# cat /etc/postfix/vdomains
------------------------------
#example.com
example1.com
example2.com
------------------------------

通常は自分自身のメールボックスに配送されるexample.com宛てのメールが、コメントアウトの設定が反映されることで上位のMTAにリレーされる。この動作の差異を見ることで設定反映の有無を確認することができる。

変更前にexample.com宛てにメールを送ってみると、以下の通り「delivered to maildir」のログが表示され、自身のサーバー内のメールボックスにメールが送信されたことがわかる。

# tail -100 /var/log/maillog | egrep "example.com.*status"
------------------------------
Apr  9 06:25:26 t1110rh72 postfix/virtual[3102]: BF47F18D2AA7: to=<ex-1@example.com>, relay=virtual, delay=0.06, delays=0.05/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
------------------------------

ここで、example.comのドメインをコメントアウトし、再度メールを送信してみる。しかし、このタイミングでは先ほどと同じ動作となることがログからわかる。つまり、設定はまだ反映されていない。

# tail -100 /var/log/maillog | egrep "example.com.*status"
------------------------------
Apr  9 06:26:31 t1110rh72 postfix/virtual[3102]: 6EEC818D2AA9: to=<ex-1@example.com>, relay=virtual, delay=0.02, delays=0.02/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
------------------------------

しばらく待ってからメールを送信してみると、ログの内容が変化する。どうやらexample.com宛てのメールが上位のMTAにリレーされているようだ。

# tail -100 /var/log/maillog | egrep "example.com.*status"
------------------------------
Apr  9 06:29:05 t1110rh72 postfix/smtp[3185]: 7E88118D2AAB: to=<ex-1@example.com>, relay=192.168.11.112[192.168.11.112]:25, delay=0.05, delays=0.02/0.01/0.01/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 70D61A67D9)
------------------------------

当然だが、この作業の間にPostfixのサービス再起動などはしておらず、何らかのタイミングで設定が自動反映されたことになる。

なぜ設定が反映されたかを確認してみる

結果的に、maillogを見ることで、設定反映のタイミングを確認することができた。以下ログの黄色網掛け箇所に注目する。

# tail -f /var/log/maillog | grep postfix
------------------------------
Apr  9 06:26:31 t1110rh72 postfix/smtpd[3095]: private/anvil: wanted attribute: (list terminator)
Apr  9 06:26:31 t1110rh72 postfix/smtpd[3095]: input attribute name: (end)
Apr  9 06:26:31 t1110rh72 postfix/smtpd[3095]: disconnect from t1082w216[192.168.11.82]
Apr  9 06:26:31 t1110rh72 postfix/smtpd[3095]: master_notify: status 1
Apr  9 06:26:31 t1110rh72 postfix/smtpd[3095]: connection closed
Apr  9 06:28:11 t1110rh72 postfix/smtpd[3095]: idle timeout -- exiting
------------------------------

メール送信後のconnection closedから100秒後に、idle timeoutが発生している。

Postfixはメール送信時に送信用プロセスを作成するが(これはprocess generationというログから確認できる)、一定時間メール送信がない場合は、プロセスを停止する動作を行う。そして、再度メールが送信される際に新しくプロセスを作成するのだが、その際にmain.cfの再読み込みを行うようだ。

したがって、main.cfの設定変更を行った後、メール送信がない状態が続いてプロセスが停止した場合、設定が反映されてメールが送信されるということになる。

なお、プロセスのアイドル時間は以下設定値で定義されている。デフォルトで100秒となっている。

# postconf | grep -e "^max_idle"
------------------------------
max_idle = 100s
------------------------------

0 件のコメント:

コメントを投稿

人気の投稿