技術者になりたい何か

技術者になりたい何かの覚書的な何かです

local用のDNSキャッシュサーバを立ててみる

LAN内用のDNSキャッシュサーバをBINDで立てます。

OSはDebian9、パッケージはbind9

aptで普通にインストール。
キャッシュサーバとして動かすだけなら設定は割と簡単かも。

■設定

・/etc/bind/named.conf

LAN内からの問い合わせを受付け、問い合わせ転送先はプロバイダのDNSサーバ。
ipv6は無効。

・/var/cache/bind/named.ca(ルートサーバ情報ファイル)

↓からDL。
ftp://ftp.internic.net/domain/named.cache

$ curl ftp://ftp.internic.net/domain/named.cache > named.ca
$ cat named.ca
$ sudo mv named.ca /var/cache/bind/named.ca

hintファイルはごくまれに更新があるらしいので、
定期的にチェックするかcronで最新取ってくるスクリプトを用意すると良いと思う。

更新は

$ dig @m.root-servers.net. ns > /var/cache/bind/named.ca

とか。(mじゃなくてもよい)

↓ではスクリプトでやってるようです。

network.station.ez-net.jp

・/var/cache/bind/local.zone (ローカル用zoneファイル)

・/var/cache/bind/local.rev (local逆引き用zoneファイル)


■起動てすと→起動

named-checkconfで設定ファイル指定して、構文に間違いがないかチェック。

$ sudo named-checkconf /etc/bind/named.conf

systemctl で起動

$ sudo systemctl start bind9

status確認。エラーが出てたらここのメッセージかjournalctl -xeの出力見ながら設定ファイルなおす。

$ sudo systemctl status bind9
● bind9.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: ena
Active: active (running) since Sun 2018-03-18 22:53:53 JST; 11s ago
Docs: man:named(8)
Process: 19689 ExecStop=/usr/sbin/rndc stop (code=exited, status=0/SUCCESS)
Main PID: 19695 (named)
CGroup: /system.slice/bind9.service
└─19695 /usr/sbin/named -f -u bind -4

3月 18 22:53:53 tminserver named[19695]: automatic empty zone: 1.0.0.0.0.0.0.0.0.
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: D.F.IP6.ARPA
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: 8.E.F.IP6.ARPA
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: 9.E.F.IP6.ARPA
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: A.E.F.IP6.ARPA
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: B.E.F.IP6.ARPA
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: 8.B.D.0.1.0.0.2.IP
3月 18 22:53:53 tminserver named[19695]: automatic empty zone: EMPTY.AS112.ARPA
3月 18 22:53:53 tminserver named[19695]: configuring command channel from '/etc/b
3月 18 22:53:53 tminserver named[19695]: command channel listening on 127.0.0.1#9

 

■動作確認

サーバ上からdigってみる

$ dig 8.8.8.8

; <<>> DiG 9.10.3-P4-Debian <<>> 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 40476
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;8.8.8.8. IN A

;; AUTHORITY SECTION:
. 1406 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018031800 1800 900 604800 86400

;; Query time: 160 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Sun Mar 18 22:57:37 JST 2018
;; MSG SIZE rcvd: 111

 

 

SERVERで自ホスト(DNSサーバホスト)のIPが出てればおk。
一回digったらキャッシュされるので次は早いはず。

$ dig 8.8.8.8

; <<>> DiG 9.10.3-P4-Debian <<>> 8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 60317
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;8.8.8.8. IN A

;; AUTHORITY SECTION:
. 1403 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2018031800 1800 900 604800 86400

;; Query time: 0 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Sun Mar 18 22:57:40 JST 2018
;; MSG SIZE rcvd: 111

 

速くなってますね。

■オープンリゾルバになってたりしないかチェック。

オープンリゾルバ確認サイト公開のお知らせ

$ wget -qO - http://www.openresolver.jp/cli/check.html

2つ結果が出るはずだけど、一つはプロバイダのDNS。両方OKならば大丈夫。


■LAN内のクライアントから動作確認。

@でサーバIP指定してdigってみる

$ dig @192.168.11.1 twitter.com

; <<>> DiG 9.9.5-9+deb8u15-Debian <<>> @192.168.11.1 twitter.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17526
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;twitter.com. IN A

;; ANSWER SECTION:
twitter.com. 1173 IN A 104.244.42.1

;; AUTHORITY SECTION:
com. 164279 IN NS j.gtld-servers.net.
com. 164279 IN NS h.gtld-servers.net.
com. 164279 IN NS g.gtld-servers.net.
com. 164279 IN NS c.gtld-servers.net.
com. 164279 IN NS m.gtld-servers.net.
com. 164279 IN NS a.gtld-servers.net.
com. 164279 IN NS e.gtld-servers.net.
com. 164279 IN NS l.gtld-servers.net.
com. 164279 IN NS i.gtld-servers.net.
com. 164279 IN NS k.gtld-servers.net.
com. 164279 IN NS d.gtld-servers.net.
com. 164279 IN NS b.gtld-servers.net.
com. 164279 IN NS f.gtld-servers.net.

;; ADDITIONAL SECTION:
a.gtld-servers.net. 164279 IN A 192.5.6.30
a.gtld-servers.net. 164279 IN AAAA 2001:503:a83e::2:30
b.gtld-servers.net. 164279 IN A 192.33.14.30
b.gtld-servers.net. 164279 IN AAAA 2001:503:231d::2:30
c.gtld-servers.net. 164279 IN A 192.26.92.30
c.gtld-servers.net. 164279 IN AAAA 2001:503:83eb::30
d.gtld-servers.net. 164279 IN A 192.31.80.30
d.gtld-servers.net. 164279 IN AAAA 2001:500:856e::30
e.gtld-servers.net. 164279 IN A 192.12.94.30
e.gtld-servers.net. 164279 IN AAAA 2001:502:1ca1::30
f.gtld-servers.net. 164279 IN A 192.35.51.30
f.gtld-servers.net. 164279 IN AAAA 2001:503:d414::30
g.gtld-servers.net. 164279 IN A 192.42.93.30
g.gtld-servers.net. 164279 IN AAAA 2001:503:eea3::30
h.gtld-servers.net. 164279 IN A 192.54.112.30
h.gtld-servers.net. 164279 IN AAAA 2001:502:8cc::30
i.gtld-servers.net. 164279 IN A 192.43.172.30
i.gtld-servers.net. 164279 IN AAAA 2001:503:39c1::30
j.gtld-servers.net. 164279 IN A 192.48.79.30
j.gtld-servers.net. 164279 IN AAAA 2001:502:7094::30
k.gtld-servers.net. 164279 IN A 192.52.178.30
k.gtld-servers.net. 164279 IN AAAA 2001:503:d2d::30
l.gtld-servers.net. 164279 IN A 192.41.162.30
l.gtld-servers.net. 164279 IN AAAA 2001:500:d937::30
m.gtld-servers.net. 164279 IN A 192.55.83.30
m.gtld-servers.net. 164279 IN AAAA 2001:501:b1f9::30

;; Query time: 4 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Wed Mar 21 21:14:30 JST 2018
;; MSG SIZE rcvd: 852

 

いけているようなら名前解決を最初にこのLAN内DNSサーバでするように設定。
Linux機ならresolv.confにサーバIPを追記、というかnameserverの一番上にDNSサーバの記述を加える。

/etc/resolv.conf

# Generated by resolvconf
domain tmin.net
nameserver 192.168.11.1 ←今回立てたDNSサーバ
nameserver XXX.XXX.XXX.XXX
nameserver XXX.XXX.XXX.XXX

一回目

$ dig hatena.ne.jp

; <<>> DiG 9.12.0 <<>> hatena.ne.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49201
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;hatena.ne.jp. IN A

;; ANSWER SECTION:
hatena.ne.jp. 600 IN A 59.106.194.19

;; AUTHORITY SECTION:
. 68186 IN NS b.root-servers.net.
. 68186 IN NS l.root-servers.net.
. 68186 IN NS i.root-servers.net.
. 68186 IN NS d.root-servers.net.
. 68186 IN NS e.root-servers.net.
. 68186 IN NS k.root-servers.net.
. 68186 IN NS m.root-servers.net.
. 68186 IN NS c.root-servers.net.
. 68186 IN NS h.root-servers.net.
. 68186 IN NS a.root-servers.net.
. 68186 IN NS g.root-servers.net.
. 68186 IN NS f.root-servers.net.
. 68186 IN NS j.root-servers.net.

;; Query time: 27 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: 水 3月 21 18:28:15 JST 2018
;; MSG SIZE rcvd: 268

 

2回目

$ dig hatena.ne.jp

; <<>> DiG 9.12.0 <<>> hatena.ne.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9592
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;hatena.ne.jp. IN A

;; ANSWER SECTION:
hatena.ne.jp. 598 IN A 59.106.194.19

;; AUTHORITY SECTION:
. 68184 IN NS b.root-servers.net.
. 68184 IN NS d.root-servers.net.
. 68184 IN NS l.root-servers.net.
. 68184 IN NS e.root-servers.net.
. 68184 IN NS i.root-servers.net.
. 68184 IN NS a.root-servers.net.
. 68184 IN NS m.root-servers.net.
. 68184 IN NS h.root-servers.net.
. 68184 IN NS j.root-servers.net.
. 68184 IN NS f.root-servers.net.
. 68184 IN NS c.root-servers.net.
. 68184 IN NS g.root-servers.net.
. 68184 IN NS k.root-servers.net.

;; Query time: 1 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: 水 3月 21 18:28:17 JST 2018
;; MSG SIZE rcvd: 268

 2回めのほうが速くなってればキャッシュされたのをちゃんと使っている。

 

■キャッシュを消したいときとか

rndcコマンドでおk。

$ sudo rndc flush

オプションは下記のようだけど、systemctl使ったらreloadもrestartもstopもできるからなぁ。

rndcでnamedをコントロールする - maruko2 Note.

 

reload named.conf と ゾーン情報をリロードする。シリアル番号が増えているゾーン情報のみリロードする。
reload zone [class [view]] ゾーンを指定しゾーン情報をリロードする。シリアル番号が増えているゾーン情報のみリロードする。
reconfig named.conf と、新しく追加したゾーンのみリロードする。
stats サーバの統計情報を /var/named/named.stats ファイルに書き出す。
status サーバのステータス情報を表示(標準出力)する。
dumpdb [-all|-cache|-zones] [view ...] キャッシュデータを /var/named/named_dump.db ファイルにダンプする。
flush サーバのキャッシュをすべて消去する。
stop named を停止する。rc スクリプトでも使用されている。


■とりあえず立ててみたけど


それぞれの設定内容が適切なのかは謎。
とりあえずオープンリゾルバにはなってないので、迷惑かけることはないと思われ。