うまいぼうぶろぐ

linuxとhttpdとperlのメモ

postfixのsmtpd_recipient_restrictionsの宛先制限はsendmailコマンド使用時には有効にならない

ようだ。

main.cfでsmtpd_recipient_restrictions を設定すれば 万事OKだと思っていたが、名前通り"smtpd"の制限パラメータなので、 localでsendmailコマンドを使用した場合にはsmtpd をスルーして smtpのプロセスが走ってしまう。そのため、smtpd_recipient_restrictionsで設定したつもりの宛先制限が有効にならない。

ref.


smtpd* がダメならtransport(sendmailでいうmailertable)で何とか出来んじゃね、と思って調べたら出てきた。

これでできそう。

transport で localを設定するパターン

リンク参照。

1. main.cf

main.cf でluser_relay(localのunknownなmailを全て受け取るuser) を適当に設定。ここではゴミ箱行きとわかるように"trash" userで指定。あと、3で設定するtransport ファイルを指定。

luser_relay    = trash
transport_maps = hash:/etc/postfix/transport
2. /etc/aliases

luser_relay で設定したuserに届いたmailを/dev/null に捨てる設定。

trash: /dev/null
3. transport

送信を許可する宛先ドメインを"smtp:"の空エントリで書く。ここで書いたドメインに対してはMX配送をする。(transport_maps のdefaultがsmtpなので、リンク先のように"smtp"も省略できるけど、わかり易さのために明示的に書いておくことに)

allow_domain1.example.com  smtp:
allow_domain2.example.com  smtp:
*                          local:

これで出来る。

この設定の注意点

大抵の場合、この設定で良さそうだけど、一つだけ注意。アカウントがlocalに存在している場合 transport_mapsに書いてないドメイン宛でも、localのアカウントに配送される。例えばroot@unexist.domain.example.com に送信してもlocalのrootに配送される。
これは、transportの設定で"smtp"で記述されていないドメイン宛のメールを"local" に配送して、存在しないユーザ宛のメールをaliasesを使って/dev/nullに送っているため。
これが嫌な場合は次の設定で。

transport でlocalじゃなくてdiscardするパターン

この設定ではmain.cfのluser_relayと、/etc/aliasesの設定は不要。こちらの設定だとlocalに存在するuserでも宛先ドメインがtransportに書いてなければdiscard(捨てる)する。

transport

tranportの最後の行をlocal じゃなくて discardにする。"discard:"の後はlogに残るメッセージなのでわかり易いように適当に。

この設定の欠点

@localhost、@localhost.localdomain 等も全て明示的にtransport に書かないと(cronなどのシステムがローカルに送信するメール等が) localに配送される必要なmailもdiscardされてしまうこと。結構めんどくさい。

allow_domain1.example.com smtp:
allow_domain2.example.com smtp:
localhost                 local:
localhost.localdomain     local:
*                         discard: "discard received email"