読者です 読者をやめる 読者になる 読者になる

postfixの勉強 #3

以下の続き.
postfixの勉強 #1 - NK5のノート
postfixの勉強 #2 - NK5のノート

postfixは受け取ったメールをcleanup(8)デーモンでキレイにするが,
そのときにcanonical(5)に基づいて送信元/送信先を変換できる,
というところまでが,前回の確認事項.

変換手段としてもう1つ,virtual(5)も用意されている.

Postfix manual - virtual(5)

気を付けてほしいのは,同名のvirtual(8)というデーモンが存在すること.
最初それに気づいていなくて混乱した.
前回から(1)とか(5)とか(8)とか明記するようにしたのはそのため.

話を戻すと,virtual(5)の使い方は,canonical(5)とほぼ同様.
以下,設定からメール送付までの操作.
捕捉として,前回設定したcanonical(5)は無効化してます.

# ll /etc/postfix/
total 148
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
-rw-r--r-- 1 root root 11681 Jun 10  2014 canonical
-rw-r--r-- 1 root root  9904 Jun 10  2014 generic
-rw-r--r-- 1 root root 21545 Jun 10  2014 header_checks
-rw-r--r-- 1 root root 27195 Mar 23 18:25 main.cf
-rw-r--r-- 1 root root  6105 Jun 10  2014 master.cf
-rw-r--r-- 1 root root  6816 Jun 10  2014 relocated
-rw-r--r-- 1 root root 12549 Jun 10  2014 transport
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual

# vi /etc/postfix/virtualtest
(ファイル作成,中略)
# cat /etc/postfix/virtualtest
■■■@gmail.com  〇〇@yahoo.co.jp
root    oreore@oreore.com
# postmap /etc/postfix/virtualtest

# ll /etc/postfix/
total 164
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
-rw-r--r-- 1 root root 11681 Jun 10  2014 canonical
-rw-r--r-- 1 root root  9904 Jun 10  2014 generic
-rw-r--r-- 1 root root 21545 Jun 10  2014 header_checks
-rw-r--r-- 1 root root 27195 Mar 23 18:25 main.cf
-rw-r--r-- 1 root root  6105 Jun 10  2014 master.cf
-rw-r--r-- 1 root root  6816 Jun 10  2014 relocated
-rw-r--r-- 1 root root 12549 Jun 10  2014 transport
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual
-rw-r--r-- 1 root root    69 Mar 23 18:29 virtualtest
-rw-r--r-- 1 root root 12288 Mar 23 18:31 virtualtest.db

# vi /etc/postfix/main.cf
(ファイル編集,中略)
# grep "virtual_alias_maps =" /etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtualtest
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

# sendmail ■■■@gmail.com
From:oreore@oreore.com
To:■■■@gmail.com
Subject:this is test mail
This is virtual test mail.
.

# journalctl -n 5
Mar 23 18:50:18 100eec03ccac postfix/pickup[586]: 20DE060138FB: uid=0 from=<root>
Mar 23 18:50:18 100eec03ccac postfix/cleanup[590]: 20DE060138FB: message-id=<20170323185018.20DE060138FB@100eec03ccac.localdomain>
Mar 23 18:50:18 100eec03ccac postfix/qmgr[587]: 20DE060138FB: from=<root@100eec03ccac.localdomain>, size=342, nrcpt=1 (queue active)
Mar 23 18:50:18 100eec03ccac postfix/smtp[592]: 20DE060138FB: to=<〇〇@yahoo.co.jp>, orig_to=<■■■@gmail.com>, relay=mx2.mail.yahoo.co.jp[182.22.12.117]:25, delay=27, delays=26/0.16/0.21/0.28, dsn=2.0.0, status=sent (250 ok dirdel)
Mar 23 18:50:18 100eec03ccac postfix/qmgr[587]: 20DE060138FB: removed

流れ的には,
・virtual(5)テーブルの文法に沿った変換テーブルを作成し,dbを作成
・main.cfのvirtual_alias_mapsにテーブルを紐づけ
Postfixをreload
sendmail(1)でメールをお試し送信
・journaldのログチェック
という感じ.
Gmail宛としたにも関わらず,yahooメールのMTAにリレーしているのがわかると思う.

canonical(5)とvirtual(5)の違いは,変換対象にある.
canonical(5)は,変換対象を柔軟に設定できるのに対し,
(対象はmain.cfのcanonical_classesで設定できる)
virtual(5)は,エンベロープの受信者(送信先)だけを変換対象とする.

エンベロープって何ぞ?」という人は,以下を見てもらった方が早い.

f:id:bob_l_s:20170324040549p:plain

実際に受信したYahooアカウント側から見えるメール.
注目すべきところはメールのTo:の部分.
sendmail(1)で指定したGmailアドレスのままであることがわかると思う.

メールには,乱暴に言えば宛先を2つ書く欄があって,
それが「エンベロープ」と「メールヘッダ」.
普段,俺たちがThunderbirdOutlookで見ているToは後者なんだけど,
メールサーバがやり取りで使用する真のToは前者となる.

つまり,virtual(5)とは,
「メールヘッダ(ユーザから見える世界の宛先)に手を加えることなく,
 メールの送信先をコントロールしたい」
という要求に答えてくれる機能,と思えば良いと思う.

他にもcleanup(8)は色々やってくれているようだけど,
とりあえず今回の勉強で触れるのはここまでとする.

cleanup(8)は,整形したメールをincomingキューに放り込む.
で,それを拾い上げるのがqmgr(8)デーモンとなる.


で,ここから先はまた次回.たぶん次で終わり.