Goal
- djbdnsでDNSネームサーバ(権威サーバ)をたてて、プライベートなドメインの管理をおこなう
- djbdnsでDNSキャッシュサーバ(再帰検索サーバ)をたてて、同じネットワーク内のホストが利用できるようにする
- プライベートなドメインであれば自前DNSネームサーバに問い合わせ、そうでなければ外部へ再帰検索をおこなうようにDNSキャッシュサーバを設定する
Install
以下を参考にn-djbdnsを利用してインストールする.
Install ndjbdns on CentOS
登場人物
登場人物 | 説明 |
---|---|
tinydns | DNSネームサーバ(権威サーバ) |
dnscache | DNSキャッシュサーバ(再帰検索サーバ) |
etc/ndjbdns/tinydns.conf | tinydns起動設定ファイル |
etc/ndjbdns/dnscache.conf | dnscache起動設定ファイル |
etc/ndjbdns/servers/* | 管理したいゾーンのドメイン名とネームサーバアドレスのマッピングを定義する |
etc/ndjbdns/servers/roots | これがroot DNSの一覧... |
etc/ndjbdns/ip/* | dnscacheにアクセス可能なホスト一覧を定義する |
etc/ndjbdns/{data, data.cdb} | tinydnsが管理するDNSレコードの実体 |
事前確認
djbdnsの各コマンドのパスが通っていること
which tinydns
which tinydns-data
which dnscache
which dnsname
ネームサーバ、キャッシュサーバのデーモンが起動していること
tinydnsとdnscacheが別のIPアドレスをバインドして起動されていることを確認.
port53であることを確認.
lsof -i:53
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# tinydns 23402 daemon 4u IPv4 373980 0t0 UDP localhost:domain
# dnscache 28041 daemon 3u IPv4 406795 0t0 UDP 192.168.2.12:domain
# dnscache 28041 daemon 4u IPv4 406796 0t0 TCP 192.168.2.12:domain (LISTEN)
root DNSのIPが間違っていないか確認しておく
##
## ndjbdnsの設定ファイル・ディレクトリに移動する
## /usr/local以下にインストールした場合は、以下のパスになる
##
cd /usr/local/etc/ndjbdns
dnsname `cat servers/roots`
# h.root-servers.net
# g.root-servers.net
# e.root-servers.net
# b.root-servers.net
# c.root-servers.net
# i.root-servers.net
# f.root-servers.net
# j.root-servers.net
# k.root-servers.net
# a.root-servers.net
# l.root-servers.net
# d.root-servers.net
# m.root-servers.net
tinydnsレコードを追加
図1の(1)をおこなう手順.
dataファイルを記述し、tinydns-dataコマンドでデータベースを作成する.
rvprov-jupiter.netという架空のドメインをローカルドメインとして管理することにする.
dataファイル作成
dataファイルに以下のように記述する(なければ新規作成).
この例では、rvprov-jupiter.netの権威サーバが192.168.2.12で、そのドメイン下のホストであるmetheglin.rvprov-jupiter.netも同じ192.168.2.12としている.
(DNSネームサーバ、DNSキャッシュサーバ、HTTPサーバを同じホストで動かしてる)
古いかもしれないけど、設定内容は以下を参考.
http://network.station.ez-net.jp/special/djbdns/doc/3-3.asp
.rvprov-jupiter.net:192.168.2.12:ns
=metheglin.rvprov-jupiter.net:192.168.2.12
tinydns-dataコマンドでバイナリファイルを作成する.
tinydns-data
ls -l /usr/local/etc/ndjbdns/data.cdb
# data.cdbが作成されていることを確認
reload
service tinydns reload
確認
DNSデーモンを起動しているホストからdigコマンドで権威サーバに直接問い合わせをおこなう.
##
## digコマンドに@をつけて問い合わせをおこなうネームサーバ/キャッシュサーバを指定できる
##
dig @localhost metheglin.rvprov-jupiter.net
# ;; AUTHORITY SECTION:
# rvprov-jupiter.net. 2560 IN SOA ns.ns.rvprov-jupiter.net. hostmaster.rvprov-jupiter.net. 1422109757 16384 2048 1048576 2560
dnscache設定
同じネットワーク内(今回は192.168.2.*)からのアクセスを許可する
図1の(3)を許可する手順.
ipディレクトリ以下にIPアドレスをファイル名とした空ファイルを作ることでACLを作る.
touch /usr/local/etc/ndjbdns/ip/192.168.2
tinydnsとdnscacheの連携
図1の(2),(4)を実現する.
dnscacheが名前解決のリクエストを受け付けたとき、tinydnsが管理しているゾーンのドメインであれば、tinydnsに名前解決をリクエストし、見つからなければ外部ネットワークに再帰検索を委譲する.
resolv.conf設定
同じDNSサーバ内で名前解決をおこなったときに、デフォルトでdnscacheのデーモンを利用するように、DNSキャッシュサーバのアドレス(192.168.2.12)を追加する.
/etc/resolv.confはLinux共通のファイルなので/etcにおいてる点に注意.
; generated by /sbin/dhclient-script
nameserver 192.168.2.12
nameserver 10.0.2.3
ゾーン設定
djbdns設定ファイルルートのservers以下にゾーン名をファイル名としたファイルを作成し、ネームサーバのアドレスをファイル内に記載する.
echo "127.0.0.1" > /usr/local/etc/ndjbdns/servers/rvprov-jupiter.net
reload
設定を変更したらreloadまたはrestartする.
service dnscache reload
確認
DNSサーバとは別の、PCなどから、リゾルバを指定して名前解決コマンドを投げる.
ANSERセクションにAレコードのIPが返ることを確認する.
##
## 内部に権威が存在するドメインで名前解決
##
dig @192.168.2.12 metheglin.rvprov-jupiter.net
# ;; ANSWER SECTION:
# metheglin.rvprov-jupiter.net. 85950 IN A 192.168.2.12
##
## 外部に権威が存在するドメインで名前解決
##
dig @192.168.2.12 metheglin.jp
# ;; ANSWER SECTION:
# metheglin.jp. 3600 IN A 49.212.37.195
dnscacheの通信を捕捉するコマンド(DNSサーバ側で実行)
(※ 1秒以内で名前解決が完結する場合コマンドで捕捉できないのであくまで参考)
(※ 一度検索成功するとキャッシュにのるので初名前解決したドメインでないと捕捉できないかも)
while :; do echo "-----------"; netstat -an | grep "ESTA" | grep :53; sleep 1; done
# udp 0 0 10.0.2.15:49021 49.212.111.248:53 ESTABLISHED
デフォルトのDNSリゾルバを変更
PC側でブラウザのアクセスもオリジナルDNSを経由させたい場合は、Macであればシステム環境設定などでdnscacheがlistenするアドレスを指定する.
(「DNSサーバ 変更」などでぐぐればOK)
Others
間違いがあればご指摘お願い致します.
Environment
uname -a
# Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
cat /etc/issue
# CentOS release 6.5 (Final)
# Kernel \r on an \m