外部からの直接メール着信を規制するもっとも簡単な方法は、/etc/hosts.denyまたはallow で接続禁止してしまうことだろう。
だけど、この方法ではSMTP認証もできなくなってしまう場合がある。よって回避方法が必要になる。
以下、「外部からの着信を許すのは特別なひとつのサーバのみ、送信はSMTP認証のみ」という形態を考える。ちなみに587番ポートも使うがそれはまた別の話である。
/etc/postfix/access での設定は甘い気がする。むしろ、mynetworksで規定した以外を全部捨てた方が楽だ。
また、/etc/hosts.allowで規制するとSMTP認証できなくなってしまうわけで、これに対処するには
ようにすればいいのだと思われる。
inet_interfaces = all mydestination = $myhostname, localhost.$mydomain mynetworks_style = host mynetworks = 127.0.0.0/8,接続元に許可したいサーバをカンマ区切りで並べる smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/access, permit_sasl_authenticated, reject
こうすると、「指定したネットワークの中」「/etc/postfix/accessで許しているか」「SMTP認証を試みる」の順番にチェックし、全部に外れたり認証失敗すると配送されずエラーとなる。
方法1の穴。
/etc/hosts.allowで規制しても通過可能にはできる。つまりpostfixに関してはこの解説は半分嘘である。たとえば以下を見る。
smtpd_recipient_restrictions = permit_mynetworks check_client_access hash:/etc/postfix/access permit_auth_destination permit_sasl_authenticated reject
postfixはこの記述順に確認していく。『つまりmynetworksの記述にある奴かどうか調べて』、次に『/etc/postfix/accessに確認しにいく』。次が『/etc/hosts.allowなどのチェック』で『最後にSMTP認証を確認』する。全てでこけたら
こんな感じである。慣れてしまうと便利です :D
ただし扱いを間違えると、SMTP認証に対応しているが外部からのメールがどうあっても着信しないとか 思わぬミスも出る 。注意してほしい。
基本的に1と同じなのだが、以下のようにする。mynetwork、SMTP認証、dracd(POP before SMTP)とチェックを続け、accessファイルのチェックを最後に回しているのが特徴である。
注意点としては、accessファイルがreject基本となっていること。ここまできたメールはOKまたはRELAY等と明記してない限り、ほとんどここで拒絶(REJECT)される事になってしまうようになっている。またPOP before SMTPが動いているのは古い顧客対応のためであるが、これは現在が移行期間であるからで、後にこの行は削除される。
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated check_client_access btree:/var/lib/drac/dracd check_client_access hash:/etc/postfix/access reject check_relay_domains reject
/etc/postfix/access は以下の通り。
localhost RELAY 127.0.0.1 RELAY antivirus鯖 OK
hosts.allowとかでやってしまうと、SMTP認証もできなくなってしまう。かといってSMTP認証のために最低限の接続を認めると、今度はローカル着信が可能になってしまう。
対処方法はいくつかありうるが、たとえばローカル配送にprocmailを使うならば以下のような強引な手法もある。
/etc/procmailrc :0 H: * ! ^Received:.*mxレコードに忠実な配送元1 * ! ^Received:.*mxレコードに忠実な配送元2 * ! authenticated\ bits=0.*自分自身 /var/tmp/filterd-mails
一行めと二行めは直接接続の抽出である。この中でSMTP認証を使った者を探しこれはスルーさせる。こうする事により、ローカルユーザの正しいローカル配送を目的地に到達させる。
どちらにも属さないもの、つまり直接接続かつ認証もしていないユーザは上の場合、ファイルに吐き出される。
注意するべきは、この場合maillogの方はローカルユーザに配送成功となっていることである。フィルタにかけているのはprocmailなので、sendmail的にはあくまで配送成功である。よって、これの記録を残すには全ての該当メールをpostmasterに届けるか、procmailのログに記録しておく必要がある。
設定はしたがやりっぱなしというのも何なので、テストの方法を考えてみる。
どこからでも認証できないとダメ。よって以下の方法をとってみる。
一部に存在するのでテストする。