今回はとある大量配信向けMTAを導入しようとしたときのお話。
そのMTAはとても素晴らしくエラーレポート機能なども備えていた。
エラーレポート生成までの流れは以下のような感じ。前提として1つのマシンで動かす場合ね。
1. クライアントから、Envelope-Fromアドレスをtest@example.co.jp とした、宛先不明となる送信用メールデータ[メールA]を125.XXX.XXX.XXXの8025番ポートに接続して送信する。
2. receiverが8025番ポートにて、送信用メールデータ[メールA]を受信する。
3. senderは、送信用メールデータ[メールA]の送信を試みますが、宛先不明であるためエラーとなる。
4. senderは[エラーメールB]を生成し、Envelope-Fromアドレスであるtest@example.co.jp宛に送信を試みる。
5. senderはexample.co.jpのMXであるexample.co.jpの25番ポートへ接続し、[エラーメールB]を送信する。
6. example.co.jp のIPアドレスは125.XXX.XXX.XXXであるため、そのIPアドレスを使用するエラーメール受信用のreceiverが25番ポートにてエラーメールを受信する。
7. analyzerは保存された[エラーメールB]に含まれるエラーの内容を分析し、レポートファイルに結果を出力する。
ここで1つ問題が発生!!4.の段階でDNSサーバーから引けるIPアドレスは当然125.XXX.XXX.XXXである。これはこのサーバー自身のグローバルIPアドレス。
静的IPNATは、外部からのアクセスに対しては適用されるが、内部からのアクセスに対しては通常適用されない。
ということでタイムアウト!!ふむ。困った。というより当たり前の動作か。こんな時のセオリーはおおまかに4つある。
1.GapNAT、ヘアピンNATルーターというものを使う。
ヘアピンの分かりやすい説明はここ。
http://natloopback.web.fc2.com/how_natloopback.html
GapNATはNATルータの内側にもグローバルIPが付与される技術。
いま使ってるルーターは対応してませーん。
2.hostsファイルを利用
これが最もポピュラーな方法ではなかろうか?ファイル編集するだけだし。
ということでやってみたが、上記MTAはどうもhostsファイルを読まないので断念。。。
Postfixとかなら、hostファイルを読みにいく設定とか出来るのだけどね。このMTAはそういう設定はできないみたい。
でも、似たような機能があり、hostsじゃないファイルで実現できそうだったが、効かない。。。
問合せたら利用バージョンではその機能はバグがあって効かないとのこと。なんじゃそりゃ。。。
3.内部用DNSをたてる
運用サーバー専用のDNSサーバーの構築。まあ確実だろうけどいちいち面倒だなー。
4.ISPなどインターネット側で公開されているプロキシ経由でアクセスする
これもいいけど、プライベートIPで処理してくれるのがベスト。
なんだかんだで、悩んでたら知人にdnsmasqなるものを紹介してもらった。
比較的容易ににDNS,DHCP機能が構築できるみたい。/etc/hostsを参照してレコードを返すこともできそう。
何か良さそう。ということで3の方法を採択。
早速試してみる。
CentOSならば、yumでさくっと入ります。
# yum install dnsmasq
で、設定ファイルが/etc/dnsmasq.conf にあるので弄くる。
今回は/etc/hostsを参照してレコード返してくれれば十分なのでほとんどの項目はデフォルトのまま。
よって自分が行った設定は2つだけ。
ホスト自身の名前引き問い合わせにのみ応答するように
listen-address=127.0.0.1
ワイルドカードアドレス (0.0.0.0) にバインドされないように、
bind-interfaces
のみ!
そして、サーバーの/etc/resolv.confnにて、先頭にnameserver 127.0.0.1 と追加して先にローカルのDNSに問い合わせるようにする。
さて、これで改めてドメインでIPを引くと。。。!見事プライベートIPが返されるようになった(^^)V