家のサーバを仮想化してから、管理用のメールの扱いが面倒になりました。
解決しなければならない課題は2つ。
- Linuxは管理用のメールを「root」へ送ろうとする。ドメインは自分のホスト名が補完されるが、仮想化したホストそれぞれが自分にメールをしてもしょうがないので、これをサーバ1カ所に集約させなければならない。
- うちの環境はルーティングの問題で、WAN側の自分自身のサーバへ到達できない。
解決策はいくつかあるけど、この2つを同時に且つ手間のかからない変更で対応したいので、DNSでやっつけてみる。
- メーラは、メールアドレスのドメイン名と、DNSのMXレコードから探して配送する。つまり、仮想サーバ毎のMXレコードを定義してやればそのサーバへメールを転送できる。
- LAN側のPCからDNSを引くときは、WAN側のIPでは無く、LAN側のIPを引くようにする。
これで、DNSの設定変更のみで行ける。ちなみに、メールの転送先はsendmailなどの場合「/etc/mail/submit.cf」にSMTPサーバを指定できるので、それでも可能。
今回はWAN側のIPに到達できない問題を孕んでいる関係もあるので、submit.cfには手をつけない。
MXレコードを追加して、メールを転送する
この方法は当然自分でDNSを立ててないと対応できない。
対応方法は簡単で、正引き設定ファイルにMXレコードを追加するだけ。
ただし、サーバ分の追加が必要。
送信元をvm.sample.com、送信先をsmtp.sample.comとした場合は、以下のような感じになる。
vm.sample.com. IN MX 10 smtp.sample.com.
これで、たとえば「root@vm.sample.com」宛のメールはsmtp.sample.comサーバへ送られる。
ちなみに送信先(受信側)サーバでも「root@vm.sample.com」を自分自身宛と認識させなければならない。
たとえば、postfixの場合は、main.cfのmydestinationにvm.sample.comを追加することで解決する。
LAN側の名前引きの挙動を変える
これは、bindの機能でできる。bind9のどこかのバージョンからできるようになったみたい(この機能は今回初めて使ったので、いつから使えるものだったのかはよくわからない)。
まず、ACLの定義。LAN側サブネットが「192.168.0.0」の場合。
acl "allowed-internal-hosts" {
192.168.0.0/24;
127.0.0.1;
};
次にviewの定義。
view "internal" {
match-clients { allowed-internal-hosts; };
allow-query { allowed-internal-hosts; };
…(略)
}
これで、LAN側ホストからDNSへ問い合わせが来た場合は、このinternal viewを参照するようになる。
ちなみに、WANからのアクセスについては、以下のような定義にしておけばよいみたい。
view "external" {
match-clients { any; };
allow-query { any; };
…(略)
}
略の部分には、正引きだの逆引きだののzoneの定義を書けば良い。
で、基本的に、internalもexternalも書く内容は一緒にしておくが、今回は正引きの挙動を変えたいので、正引きのzone定義のみを変更する。
view "internal" {
match-clients { allowed-internal-hosts; };
allow-query { allowed-internal-hosts; };
…(略)
zone "sample.com" {
type master;
file "named.internal.sample.com";
};
…(略)
}
view "external" {
match-clients { any; };
allow-query { any; };
…(略)
zone "sample.com" {
type master;
file "named.sample.com";
};
…(略)
}
これで、LANからの問い合わせは「named.internal.sample.com」を、WANからの問い合わせは「named.sample.com」を参照するようになる。
あとは、普通の正引き設定ファイルなので、それぞれのIPアドレスを定義してやれば良い。
前項のMXレコードの定義も、WAN側には関係の無い話なので、LAN側の正引き設定ファイルにのみ記載しておけば良い。

Leave a Reply