Carpe Diem

備忘録。https://github.com/jun06t

内部向けDNSサーバ

今回は内部向けDNSサーバについてです。DNSサーバを構築することのメリットは、内部の端末に対してIPでなくホスト名でアクセスできる点です。これはhostsファイルを書き換えられるマシンならそこまで重要ではないですが、iPhoneなど書き換えが出来ないものにとっては有益です。ここではホスト名はexample.com、サーバのプライベートIPは192.168.11.5とします。ファイアウォールを使用している場合TCPUDP の 53番ポート宛てを通しておいてください。 まずはインストール $ sudo aptitude install bind9 一応bind9とbind9utilsが必要ですが、後者は自動的にインストールされます。 順番は以下になります。 ・resolv.conf の設定 ・named.confの設定 ・ゾーンデータの設定 ・動作確認1 ・ルータの設定 ・動作確認2 ◆resolv.conf の設定 ここではネームサーバの設定を行います。これはbindに名前解決の問い合わせをする「リゾルバ」というプログラムに対し,DNSサーバのIPやデフォルトのドメインを設定しておくものです。 # emacs -nw /etc/resolv.conf nameserver 192.168.11.5  ←DNSサーバのIPアドレス複数OK domain example.com  ←ローカルドメイン名。1つだけ。 search example.com  ←ホスト検索時のドメインリスト。複数OK searchやdomainを指定すると、ドメイン名を省略したホスト名(マシン名)でアクセスできるようになります。本来ゾーン設定をした場合、ドメイン名を含むFQDNでないとアクセスは出来ませんが、これを設定することでホスト名のみのショートネームで出来るようになります。これはWindowsではDNSサフィックスと呼ばれます。VPN接続でも「DNSサーバ」「検索するドメイン」を指定すると、このnameserverとsearchが自動的に補完されます。VPNではこのDNSサーバを指定しないと接続しているルータ(192.168.11.1)をnameserverと認識するため、同じLAN内にいるのに名前解決してもらえません。これはルータ側LANでDNSサーバを指定していても、resolv.confのnameserverがルータ(192.168.11.1)を向いているのでDNSサーバを認識しません。 ◆named.conf、named.conf.options の設定 まずnamed.conf.optionsを設定します。 # emacs -nw /etc/bind/named.conf.options options {         directory "/etc/bind";         // LAN内部からの問い合わせのみ許可する         allow-query { localhost; 192.168.11.0/24; };         // ゾーン転送はしない(セカンダリDNSサーバを指定する場合は使用)         allow-transfer {none;};         # 再帰検索を許可する範囲。今回は使用しない。         //allow-recursion { localhost; 192.168.11.0/24; };         // 自宅ドメイン以外の閲覧はルータ(192.168.11.1)へ転送         forwarders {192.168.11.1;};         forward only;         auth-nxdomain no;    # conform to RFC1035         #listen-on-v6 { any; }; }; 192.168.11.0/24のような書き方はCIDR表記といいます。詳しくはネットワークの設定を見てください。 次にnamed.confを設定します。 # emacs -nw /etc/bind/named.conf 最後の部分を次にように修正します。named.conf.internal-zonesは新しく自分で作ります。 include "/etc/bind/named.conf.options"; include "/etc/bind/named.conf.local"; #include "/etc/bind/named.conf.default-zones"; ←コメントアウト include "/etc/bind/named.conf.internal-zones"; # emacs -nw /etc/bind/named.conf.internal-zones view "internal" {    # このクライアントからはinternalの処理をする    match-clients {        localhost;     192.168.11.0/24;    }; # 内部向け正引きゾーン設定 zone "example.com" {      type master;      file "/etc/bind/db.internal";  ←新しく作るゾーン設定 }; # 内部向け逆引きゾーン設定 zone "11.168.192.in-addr.arpa" {      type master;      file "/etc/bind/db.rev";  ←新しく作るゾーン設定 }; # 以下bind9のデフォルト設定。named.conf.default-zonesの中身。この通りでOK。 zone "." {      type hint;      file "/etc/bind/db.root"; }; zone "localhost" {      type master;      file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" {      type master;      file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" {      type master;      file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" {      type master;      file "/etc/bind/db.255"; }; }; ◆ゾーン設定 先ほどnamed.conf.internal-zonesで指定したゾーン設定を作成します。
ホスト名 役割 IPアドレス
ns.example.com ネームサーバ(DNSサーバ) 192.168.11.5
example.com Webサーバ 192.168.11.5
mail.example.com メールサーバ 192.168.11.5
ftp.example.com FTPサーバ 192.168.11.5
www.example.com Webサーバ 192.168.11.5
上記の設定で進めます。 ゾーンには正引きと逆引きがあります。 正引き・・・ホスト名からIPアドレスを引き出す。 逆引き・・・IPアドレスからホスト名を引き出す。 となります。逆引きはアクセスの統計などを調べることに使用するみたいです。なので個人サーバではなくても大丈夫です。ただせっかくなので今回は設定します。 正引きゾーンの設定 # emacs -nw /etc/bind/db.internal $TTL 1D @    IN        SOA    ns.example.com. root.example.com. (              2011043001          ;Serial         1H              ;Refresh 1 hour         30M              ;Retry 30 minutes         1W              ;Expire 1 week         1D              ;Minimum TTL 1 day )         IN    NS    ns.example.com.         IN    MX 10    mail.example.com. @        IN    A      192.168.11.5 ns        IN    A      192.168.11.5 www        IN    A      192.168.11.5 mail        IN    A      192.168.11.5 ftp        IN    A      192.168.11.5

1行目:$TTL(Time To Live) には、リソースのキャッシュ有効時間を秒単位で指定します。ここでは1D(day)=24時間としてます。書き方は1Dでも秒換算でもいいです。(1日なら86400)

3行目:@ IN SOA ・・・ には、このゾーンを管理するプライマリネームサーバ(うちではns.example.com.)と、ゾーン管理者のメールアドレスを記述します。ここで ns.example.com. のようにドメインを記述する場面では、末尾に "."(ピリオド)をつけます。ピリオドがない場合にはBIND側でドメイン(ここでは example.com )が付加されるため、間違って ns.example.com のみの記述をした場合には "ns.example.com.example.com" と解釈されてしまいます。また,メールアドレスを記述する部分では、例えば root@example.com. であれば "@""."(ピリオド)に置き換えて root.example.com. とすることになっています。

4~8行目:SOA に続く(・・・)の領域には、セカンダリネームサーバが参照するゾーンデータ情報が入ります。今回のよう にLAN内部向けに1台のみで運用する場合にはあまり意味を持たない部分なので、Serial にゾーンデータを更新した日付を入れた以外は、とりあえず設定例として見かける一般的な値を入れています。

NS、MX、AはDNSレコードといい、それぞれ意味があります。DNSサーバ構築でよく出るものを解説すると NS・・・ドメインDNSサーバ名を指定する MX・・・ドメインのメール・サーバ名 A・・・ホストのIPアドレス CNAME・・・ホスト名のエイリアス(別名) PTR・・・IPアドレスに対するホスト名 詳しくは参考サイトを見てください。 DNSレコード 逆引きゾーンの設定 # emacs -nw /etc/bind/db.rev $TTL 1D @    IN        SOA    ns.example.com. root.example.com. (              2011043001          ;Serial         1H              ;Refresh 1 hour         30M              ;Retry 30 minutes         1W              ;Expire 1 week         1D              ;Minimum TTL 1 day )         IN    NS    ns.example.com.         IN    A    255.255.255.0    ; サブネットマスク 5        IN    PTR    example.com. 注意として、逆引きでは同じIPに複数のホスト名を定義できないため、ns、 mail については逆引きを記述しません。 ◆動作確認1 以上の設定が完了したらきちんと設定が出来ているかのチェックをします。 $ sudo named-checkconf /etc/bind/named.conf これで何も表示されなければOKです。 bind9を再起動します。 $ sudo service bind9 restart  * Stopping domain name service... bind9                                 [ OK ]  * Starting domain name service... bind9                                 [ OK ] この状況でブラウザでexample.com、もしくはwww.example.comと入力すれば、ちゃんとサーバのWebページが見えるようになります。 またメールの設定もmail.example.comの書き方で使用できるようになります。ただしこれは内部の名前解決なので、外部からはmail.example.comは使用できません。 もしここでfail と出る場合は $ less /var/log/syslog でどんなエラーが出ているか確認しながらデバッグしてください。エラーの部分を丸々コピーしてググると大抵解決します。 次はサーバ以外の端末でも名前解決が出来るようにします。 ◆ルータの設定 DHCPサーバがIP供給している端末たちにネームサーバの所在を教えてあげるように設定します。 ルータにアクセス→Internet/LAN > LAN の画面で「DHCPサーバ設定[拡張設定]」の拡張設定 ここで「DNSサーバーの通知」で「指定したIPアドレス」を選択してプライマリに先ほどBIND9を設置したマシンのIPアドレスを記入します。セカンダリーにはルータ自身(DHCPサーバ自身?)のIPアドレスを入力します。実は入力しなくてもできます。なぜなら前のnamed.conf.optionsの設定で // 自宅ドメイン以外の閲覧はルータ(192.168.11.1)へ転送 forwarders {192.168.11.1;}; forward only; としているからです。逆にこれを設定しない場合はセカンダリーにルータのIPを入力してください。またnamed.conf.optionsでも allow-transfer {none;}; の部分をセカンダリーのIPにします。 ◆動作確認2 ルータの設定が完了するとサーバ以外の端末でもホスト名でアクセスできるようになります。 もしアクセスできない場合は一度Wi-Fiを切るなどして再接続させてください。そうすればできるようになると思います。 Windowsでしたらコマンドプロンプトc:\>ipconfig /flushdns としてキャッシュをクリアしてみてください。 より詳細に確認する場合は $ dig example.com でネームサーバから返る値(ANSWER SECTION)を確認できます。ネームサーバやメールサーバなどは $ dig example.com NS $ dig example.com MX 逆引きは $ dig -x 192.168.11.5 です。 ◆トラブルシューティング bind9が初回から起動しない。 私の場合これでした。Ubuntu Serverをインストールしたときにこのbind9もインストールしましたが、なぜかstartできませんでした。 $ sudo aptitude purge bind9 で完全削除してから再インストールすることでstartできました。 ソース: BIND9によるLAN向けDNSサーバの構築 BIND9で内向きDNS構築 on Ubuntu bind9でDNSサーバーを設定する(3)内部ネットワーク