Ari's Blog

Reading makes me rich !

Postfix に hosts を参照させる

leave a comment »

普通はそんなことしなくてもいいし、あったにしてももっと違うスマートで根本的な解決策を取るべきなのだが、それが色々な制約、制限、問題によってそういったスマートな手段が取れず、推奨されない泥臭い設定をしたのでそのメモを残しておく。

制約・制限:

  • 内部からメール送信/転送する時に、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 を参照しないというポリシーが今ひとつ理解できない。

参考サイト:

追伸:

「そんな特殊な設定する前に本来あるべき設定に、ネットワーク機器なりネームサーバなりに施すべき」という耳の痛い叱責が聞こえてきそうだが、色々な時間的制約やら、能力・スキルの問題やら、大人の事情やら、簡単には排除できない難しい現実があるわけで…

Written by arito

2013-03-28 @ 00:54

カテゴリー: ネットワーク, Linux

Tagged with , ,

コメントを残す