Postfix に hosts を参照させる
普通はそんなことしなくてもいいし、あったにしてももっと違うスマートで根本的な解決策を取るべきなのだが、それが色々な制約、制限、問題によってそういったスマートな手段が取れず、推奨されない泥臭い設定をしたのでそのメモを残しておく。
制約・制限:
- 内部からメール送信/転送する時に、DNS(MX)は引けて、グローバルアドレスを返すが、実はその実態は隣にあるサーバ(ローカルアドレス空間)
- DNS で返ってくるグローバルアドレスを NAT しているネットワーク機器で、内部からそのグローバルアドレスへ通信できるように設定できない or 設定方法不明
- つまり、内部から foo@example.com へメール送信しようとする時、example.com の MX を引くとキチンと引けてあるグローバルアドレスを返すが、内部からそのグローバルアドレスに対して smtp 通信しようとしても、隣にある example.com の MTA を担っているサーバへ smtp 通信ができない。(内部からはブローバルアドレス→ローカルアドレスのマッピングができない)
本来であれば、グローバルアドレスに対応したローカルアドレスへ NAT しているネットワーク機器に、内部からのそのグローバルアドレスへの接続要求は、グローバルアドレスにマッピングしたローカルアドレスへルーティング設定して、最終的に内部間通信できるようにする必要があるわけだ。だが、その設定が諸事情によりすぐできない。
そんな場合、直ぐに考えつくのが、「なら hosts に書いてしまえばいいじゃん」という案だ。そこでそそくさと hosts に記載して Postfix を再起動したが、全く効いていないみたい。なんで hosts を読まないんだ?と思って調べてみたら、Postfix はデフォルトでは dns 参照しかせず、サーバの hosts は参照しないことが判明。
では Postfix に hosts を参照させるにはどうしたらいいのか?
Google 先生にキーワード「Postfix hosts」あたりで聞いてみると、以下の様な回答が多数上位にヒットする。
ignore_mx_lookup_error = yes
disable_dns_lookups = yes
だが、これでは hosts は参照してくれるが、そもそもそれ以外の名前を dns 参照してくれなくなってしまう(disable_dns_lookups = yes)。また、ignore_mx_lookup_error = yes によって、MX が引けなくても、A が引ければそこへ SMTP 通信してしまう、というなんだかよくわからない動作になってしまう。それでは意味が無い。
やりたいことは以下なのだ。
メール送信時、dns 参照するが nsswitch に設定されているように、「まず hosts を参照し、なけれれば dns を引く」、という設定にしたい。名前解決時に Postfix がそのような順番で名前解決をしてほしい。
もちろん、冒頭に書いた「スマートで根本的な解決策」として、「view 機能を使って参照する dns サーバ側で、問合せ元によって回答を出し分ける」という方法が取れればいいのだが、即席でそんなことは依頼できない。前述のネットワーク機器の設定もいつできるか分からない。
「それくらい設定できないのか?Postfix は!ホストの名前解決の基本はローカルファイル→dns が基本だろ?」とややプリプリしながらさらに調べてみると、意図した設定で動作してくれそうなパラメータがあった。smpt_host_lookup パラメータだ。デフォルトではこれは dns となっていて、dns による名前解決しかしない。これを
smtp_host_lookup = native
とすると、意図した動作になる。もちろん、事前に必要な内容を hosts に記載し、nsswitch.conf で hosts が files dns となっている前提である。サイトによっては「smtp_host_lookup = dns native」と2つ併記するようにも書いてあるサイトもあるが、それだとまず dns 検索して、ヒットしなかった場合に hosts を参照するので、今回の場合は MX レコードが引けてしまうので、そもそも hosts は参照されない。
そして上記を設定(native とする)して Postfix を再起動する。意図した通りに、hosts に書いてあればそちらを参照し、なければ通常の resolv.conf に指定されたネームサーバへ問い合わせる動作となった。
なんでそんな妙な仕様なんだろう?sendmail デフォルトな私にとっては、hosts を参照しないというポリシーが今ひとつ理解できない。
参考サイト:
- Postfix Configuration Parameters.
- Force postfix to refer /etc/hosts.
- Postfix /etc/hosts | boompty boomp.
追伸:
「そんな特殊な設定する前に本来あるべき設定に、ネットワーク機器なりネームサーバなりに施すべき」という耳の痛い叱責が聞こえてきそうだが、色々な時間的制約やら、能力・スキルの問題やら、大人の事情やら、簡単には排除できない難しい現実があるわけで…
コメントを残す