家のサーバを仮想化してから、管理用のメールの扱いが面倒になりました。 解決しなければならない課題は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; }; […]