bind9でDNSサーバー

やること 

  • DNSの構築
  • 今時の送信ドメイン認証技術を実装
  • (しばらくしたらdynamicDNS)

インストール

$ sudo apt-get install bind9
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  bind9utils
提案パッケージ:
  bind9-doc resolvconf
以下のパッケージが新たにインストールされます:
  bind9 bind9utils
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 11 個。
433kB のアーカイブを取得する必要があります。
この操作後に追加で 1,368kB のディスク容量が消費されます。
続行しますか [Y/n]?

root serverのゾーンファイルを更新 

/etc/bind/db.root の内容を確認すると、古いようなのでまずは入れ替える。

$ sudo mv db.root db.root.old
$ wget ftp://FTP.INTERNIC.NET//domain/named.root
$ sudo mv named.root db.root
$ sudo chown root:root db.root

viewを使用した外部と内部からの名前引きに対応したサーバーの構築 

まずは、viewを使用する場合には、named.conf.default-zonesに書かれているものを viewの中に入れないといけないので、named.confから外す。

# diff -uN named.conf.orig named.conf
--- named.conf.orig     2010-12-01 05:36:29.000000000 +0900
+++ named.conf  2011-05-29 10:30:05.247866657 +0900
@@ -8,4 +8,4 @@

 include "/etc/bind/named.conf.options";
 include "/etc/bind/named.conf.local";
-include "/etc/bind/named.conf.default-zones";
+//include "/etc/bind/named.conf.default-zones";

次に、viewの外部と内部の定義をしないといけないので、optionsに記述する。 また、今は使用しないipv6を停止などを記載する。

# diff -uN named.conf.options.orig named.conf.options
--- named.conf.options.orig     2010-12-01 05:36:29.000000000 +0900
+++ named.conf.options  2011-05-29 10:37:14.983867336 +0900
@@ -15,6 +15,8 @@
        // };

        auth-nxdomain no;    # conform to RFC1035
-       listen-on-v6 { any; };
-};
+//     listen-on-v6 { any; };

+       // Do not allow access to cache
+       allow-query-cache { none; };
+};

named.local に、internalとexternal の2つを記述する。 internalは、LAN向けなので(recursion yesにして)、ここで、default-zonesをincludeする。 external については、recursion noにする。 (一時的に notify noにしておく。あとで実運用になったら、消す)

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

acl slaves {
        slaveserver-zone/24;
        slaveserver-zone2/28;
        slaeveserver_ip1;
        127.0.0.0/8;
};

acl lan {
        !192.168.1.200;
        192.168.1.0/24;
//      127.0.0.0/8;
};

view "internal" {
        match-clients { lan; };

        // Provide recursive service to internal
        // clients only.
//      recursion yes;

        // set cache ttl
        max-ncache-ttl  300; // nagative
        max-cache-ttl   43200; // normal cache
        lame-ttl        600;  // lame

        nofity no;

        // include localzone
        include "/etc/bind/named.conf.default-zones";

        // Provide a complete view of the example.com
        // zone including addresses of internal hosts.
        zone "kensuke.jp" {
                type master;
                file "/etc/bind/db.kensuke.int";
                allow-transfer {
                        lan;
                };
        };
};

view "external" {
        // Match all clients not matched by the
        // previous view.
        match-clients { any; };

        // Refuse recursive service to external clients.
        recursion no;

        // for debug
        notify no;

        // Provide a restricted view of the example.com
        // zone containing only publicly accessible hosts.
        zone "kensuke.jp" {
                type master;
                file "/etc/bind/db.kensuke.ext";
                allow-transfer {
                        slaves;
                };

        };
};

設定が終わったら、named-checkconfコマンドで確認をする。

# named-checkconf

# named-checkconf -z
zone localhost/IN: loaded serial 2
zone 127.in-addr.arpa/IN: loaded serial 1
zone 0.in-addr.arpa/IN: loaded serial 1
zone 255.in-addr.arpa/IN: loaded serial 1
zone kensuke.jp/IN: loading from master file /etc/bind/db.kensuke.int failed: file not found
zone kensuke.jp/IN: not loaded due to errors.
internal/kensuke.jp/IN: file not found
zone kensuke.jp/IN: loading from master file /etc/bind/db.kensuke.ext failed: file not found
zone kensuke.jp/IN: not loaded due to errors.
external/kensuke.jp/IN: file not found

# named-checkconf -p

そして、 外部向けのzoneファイルと、内部向けのzoneファイルを作成する。

外部向け

;
; BIND data file kensuke.jp zone for external
;
$TTL    1D
@       IN      SOA     ns hostmaster (
                        2011052700      ; Serial
                        1D              ; Refresh
                        1H              ; Retry
                        2W              ; Expire
                        1H )    ; Negative Cache TTL
;
@       IN      NS      ns
@       IN      NS      ns0.セカンダリ.dns.
@       IN      NS      ns1.セカンダリ.dns.
@       IN      NS      ns2.セカンダリ.dns.
@       IN      A       global IP address
;@      IN      AAAA    ::1
@       IN      MX      10      mail
@       IN      TXT     "v=spf1 ip4:global IP address include:_spf.google.com ~all"
mail    IN      A       global IP address
ns      IN      A       global IP address
www     IN      A       global IP address
dns     IN      CNAME   ns
ftp     IN      CNAME   ns
ns1     IN      CNAME   ns
pop     IN      CNAME   ns
smtp    IN      CNAME   ns
east    IN      CNAME   ns

内部向け

;
; BIND data file kensuke.jp zone for internal
;
$TTL    1D
@       IN      SOA     ns hostmaster (
                        2       ; Serial
                        1D              ; Refresh
                        1H              ; Retry
                        2W              ; Expire
                        1H )    ; Negative Cache TTL
;
@       IN      NS      ns
@       IN      A       192.168.100.10
;@      IN      AAAA    ::1
@       IN      MX      10      mail
mail    IN      A       192.168.100.10
ns      IN      A       192.168.100.10
www     IN      A       192.168.100.10

設定が完了したら、bind の reloadを実行する。
その後は、動作確認。現状だと 127.0.0.1からのアクセスでは、外部からのアクセスと同様の返答をして、LAN内からのアクセスだと internalの返答をするようになっている。digを使って動作の確認をして、問題なければ、 externalのnofity を yesに変更(コメントアウトするだけでOK)して、完了です。

SPFへの対応

参照にあるように、gmailを併用しているときでも、特に気にしないでよさそうな話もあるので、とりあえず自分のサーバーの場合には、自分のサーバーからだけ外部にメールが出て行くという前提で、SPFの設定を行う

@       IN      TXT     "v=spf1 ip4:121.1.132.xx ~all"

参照:http://webos-goodies.jp/archives/51103006.html http://d.hatena.ne.jp/paz3/20100210/1265793004 http://cloudrop.jp/cloud/mail_by_google_apps

DNSSECへの対応

http://venus.gr.jp/opf-jp/opm15/jpopm15-08.pdf の31ページあたりからの方法で対応を進めていく。

秘密鍵と公開鍵のペアを作成する。

# dnssec-keygen -a RSASHA1 -b 2048 -n zone kensuke.jp

実行したら、ぜんぜん終了する気配なし。良く調べたら コマンドが/dev/randomを使用しているが、randomはとても遅いみたいで時間がここでかかっている模様。 なので、下記のコマンドで実行するのが良いみたい。

# dnssec-keygen -r /dev/urandom -a RSASHA1 -b 2048 -n zone kensuke.jp

次に、KSKなるkeyペアを作成する。

# dnssec-keygen -r /dev/urandom -f KSK -a RSASHA1 -b 2048 -n zone kensuke.jp

作成された2つの公開鍵をゾーンファイルに追加する。

# cat Kkensuke.jp.+005+*key >> /etc/bind/db.kensuke.ext

追記後に、SOAもカウントアップしておくこと。

ゾーンファイルに署名をする。

# dnssec-signzone -o kensuke.jp /etc/bind/db.kensuke.ext

実行したディレクトリに dsset-kensuke.jp.というファイルができるので、これを上位のDNSに登録してもらう

あとはdnssecを利用するようにDNSを変更して、動作確認がまだ。

http://yebo-blog.blogspot.com/2007/01/dnssec-3.html

参照:http://internet.watch.impress.co.jp/docs/event/janog26/20100714_380523.html

これがいいかも、http://news.softpedia.com/news/How-to-Host-Your-Own-Domain-With-Bind9-on-Ubuntu-49585.shtml