postfixの勉強 #5

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

qmgr(8)の後に起動するプロセスが,
送信時は「smtp」だったのに受信時は「local」だった,という話.

この使い分けは,前回も触れたtrivial-rewrite(8)の挙動に起因する.
ここで仕様を再掲しておく.
Postfix manual - trivial-rewrite(8)

上記リンクにもあるとおり,trivial-rewrite(8)は,メールアドレスを元に
主にtransport(配達員)とnexthop(配送先)を解決する.
で,このtransportが,先述のsmtpだったりlocalだったりする.

解決ルールについては,以下の表がわかりやすいと思う.
http://www.kobitosan.net/postfix/jman/rewrite.html#transport

local(8)は,ローカルユーザ宛の配送エージェント.
設定については前回触れたとおり.
さらに,alias_mapsにaliases(5)の変換テーブルを設定していれば,
・taro@mydomain宛のメールを,jiro@mydomain宛に配送
・all@mydomain宛のメールを,taroとjiroの両ユーザ宛に配送
のようなことが可能になる.後者はメーリスのイメージかな.
詳しくは以下.
Postfix manual - local(8)

smtp(8)は,外部ユーザ宛の配送エージェント.
SMTP認証なんかも関わってくるけど,今回は深くは触れないので
リンクだけ貼ってお茶を濁しておく.
Postfix manual - smtp(8)

virtual(8)は,バーチャルユーザ宛の配送エージェント.
バーチャルユーザというのは,名前の通り,実在しないユーザ.
「いちいち受信ユーザ毎にアカウントなんか作ってられるかよ」
という人向け,になるのかな.
実際にやってみる.

# vi /etc/postfix/main.cf
(編集作業,中略)
# grep "virtual_mailbox_domains =" /etc/postfix/main.cf
virtual_mailbox_domains = oreore.com
# grep "virtual_mailbox_base =" /etc/postfix/main.cf
virtual_mailbox_base = /etc/postfix/base
# grep "virtual_mailbox_maps =" /etc/postfix/main.cf
virtual_mailbox_maps = hash:/etc/postfix/v_m_maps
# grep "virtual_gid_maps =" /etc/postfix/main.cf
virtual_gid_maps = static:1919
# grep "virtual_uid_maps =" /etc/postfix/main.cf
virtual_uid_maps = static:114514

設定の意味合いとしては,
・oreore.com宛のメールは,virtual(8)が配送します.
・配送先のルートディレクトリは,/etc/postfix/baseです.
・配送先はv_m_mapsに基づいて最終決定します.
・メールの保存で使うグループのgidは1919です.
・メールの保存で使うユーザのuidは114514です.
といった感じになる.

ちなみに,gid:1919も,uid:114514も,存在しないidとなる.
これでもまあ,動くことは動くんだけど(それを証明するために使った),
管理面で面倒になるので,本来は管理用のグループ&ユーザを用意した方が良い.

また,「static:xxx」の部分は,今までのように「hash:yyy」として
変換テーブルyyyを用意……という戦法でも良い.
こういう手段もあるよ,というのを紹介するために使った.

上記で設定した「/etc/postfix/base/」と「/etc/postfix/v_m_maps」は
当然まだ存在しないので,以下のように用意してあげる.

# mkdir -m o+w /etc/postfix/base

# vi /etc/postfix/v_m_maps
(作成作業,中略)
# cat /etc/postfix/v_m_maps
taro@oreore.com taro/
# postmap /etc/postfix/v_m_maps

# ll /etc/postfix
total 172
-rw-r--r-- 1 root root 20876 Jun 10  2014 access
drwxrwxrwx 2 root root     6 Mar 28 14:18 base
-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 27480 Mar 28 13:59 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    22 Mar 28 13:36 v_m_maps
-rw-r--r-- 1 root root 12288 Mar 28 13:36 v_m_maps.db
-rw-r--r-- 1 root root 12494 Jun 10  2014 virtual

baseディレクトリ作成時に権限を追加してるのは,
gid:1919およびuid:114514とかいう,実在しない適当なユーザでも
ファイルやディレクトリ作成を出来るようにするため.

メールの保存ディレクトリは
「(virtual_mailbox_baseの設定値)/(virtual_mailbox_mapsの変換結果)」
になるので,上記設定だと,taro@oreore.com宛のメールは
/etc/postfix/base/taro/
に保存されることになる.

最後に忘れずにリロード

# postfix reload
postfix/postfix-script: refreshing the Postfix mail system

これで,バーチャルユーザ「taro」にメールを届ける準備が整った.
(useraddもgroupaddも実施していない)
早速メールを送ってみる.以下は送信後の状況.

# journalctl -n 7
Mar 28 14:28:39 3832cc77bd2d postfix/smtpd[1032]: connect from (メールの送信元のホスト名)[172.17.0.1]
Mar 28 14:29:10 3832cc77bd2d postfix/smtpd[1032]: 73BDB60138FD: client=(メールの送信元のホスト名)[172.17.0.1]
Mar 28 14:29:54 3832cc77bd2d postfix/cleanup[1036]: 73BDB60138FD: message-id=<>
Mar 28 14:29:54 3832cc77bd2d postfix/qmgr[1028]: 73BDB60138FD: from=<■■■@gmail.com>, size=321, nrcpt=1 (queue active)
Mar 28 14:29:55 3832cc77bd2d postfix/virtual[1037]: 73BDB60138FD: to=<taro@oreore.com>, relay=virtual, delay=57, delays=57/0.07/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)
Mar 28 14:29:55 3832cc77bd2d postfix/qmgr[1028]: 73BDB60138FD: removed
Mar 28 14:29:57 3832cc77bd2d postfix/smtpd[1032]: disconnect from (メールの送信元のホスト名)[172.17.0.1]

# ll /etc/postfix/base/taro/
total 0
drwx------ 2 114514 1919  6 Mar 28 14:29 cur
drwx------ 2 114514 1919 58 Mar 28 14:29 new
drwx------ 2 114514 1919  6 Mar 28 14:29 tmp

# cat /etc/postfix/base/taro/new/1490711394.Vfc01If0052bdM984614.3832cc77bd2d
Return-Path: <■■■@gmail.com>
X-Original-To: taro@oreore.com
Delivered-To: taro@oreore.com
Received: from oreore (メールの送信元 [172.17.0.1])
        by 3832cc77bd2d.oreore.com (Postfix) with SMTP id 73BDB60138FD
        for <taro@oreore.com>; Tue, 28 Mar 2017 14:28:57 +0000 (UTC)
from:■■■@gmail.com
to:oreore@oreore.com
subject:test mail

this is test mail for virtual user.

配送ユーザとしてvirtual(8)が選択されており,
「taro」というディレクトリにメールが保存されていることがわかると思う.
taroディレクトリは,存在しなければvirtual(8)が勝手に作ってくれる.
(baseディレクトリの権限を緩めたのはこのため)

その他,virtual(8)に関する細かい設定は以下参照.
Postfix manual - virtual(8)


以上,これでPostfixの仕組みと,基本的な設定は理解できた,気がする.
受信したメールはPOP3やIMAP4といったプロトコルで参照することになるが,
それはまた別のアプリケーションの話(dovecotとか)になるので,今回は割愛.


余談だけど,こういう実験の舞台準備としてdockerは超便利だなと実感.