YANO's digital garage

Copyright ©YANO All rights reserved. https://www.bravotouring.com/~yano/

Last-modified: 2024-04-17 (水)


[一語一絵/IT系]

ローカルDNS / 2008-10-24 (金)

宿題のローカルDNSnx9030を内向けDNSサーバも包括したデフォルトDNSとして動かす事に。

現状、nx9030では192.168.199.1でtinydnsを外向けDNSサーバとして、127.0.0.1でdnscacheをDNSキャッシュとして動かしているが、プライマリDNSサーバとしては192.168.199.1を受け口として「上流サーバ」と「内向けサーバ」にクエリを振り分けるのが筋。

と言う事は、外向けDNSはさておき、全てのDNSリクエストをdnscacheが192.168.199.1:53で受けて、127.0.0.1:53で待つ内向けのtinydnsへ流すのが自然でわかりやすい。

となると外向けDNSの待つインタフェースが無くなってしまうのだが、かと言ってもう一つローカルIPアドレスを与えるのは後々面倒になる気配プンプン。アドレスが被ってもポート番号が被らなければ大丈夫。幸い外向けならばrouterの転送先ポート番号を変えるだけでウマい具合に一網打尽だ。ステキ炸裂。

まずはtinydnsの待受ポートを環境変数PORTから取得して変更できるように改造。

diff -uN server.c.org server.c
--- server.c.org        2001-02-12 06:11:45.000000000 +0900
+++ server.c   2008-10-23 19:06:40.000000000 +0900
@@ -83,6 +83,7 @@
{
   char *x;
   int udp53;
+  ulong listen_port;

   x = env_get("IP");
   if (!x)
@@ -90,10 +91,13 @@
   if (!ip4_scan(x,ip))
     strerr_die3x(111,fatal,"unable to parse IP address ",x);

+  x = env_get("PORT");
+  if (x) scan_ulong(x,&listen_port); else listen_port = 53;
+
   udp53 = socket_udp();
   if (udp53 == -1)
     strerr_die2sys(111,fatal,"unable to create UDP socket: ");
-  if (socket_bind4_reuse(udp53,ip,53) == -1)
+  if (socket_bind4_reuse(udp53,ip,listen_port) == -1)
     strerr_die2sys(111,fatal,"unable to bind UDP socket: ");

   droproot(fatal);

tinydnsを192.168.199.1:653で待機させる。

# echo "192.168.199.1" > /service/tinydns/env/IP
# echo "653" > /service/tinydns/env/PORT

ここでrouterのポートフォワーディング先ポート番号を653に変えて、[External]CyberSyndrome : Nslookupなどから名前解決の確認OK…と思っていたのだが、出先事務所からアクセスしてみると接続不可。実際はtinydnsまでクエリが届いてなかった。iptables653を穴開けしてなかったのが原因。ちゃんとtinydnsのログまで確認しましょう。【10/24 11:10追記】

続いて内向けDNSサービス127.0.0.1:53で待機するtinydns-localとして作成。

# tinydns-conf tinydns dnslog /etc/tinydns-local 127.0.0.1
# cd /etc/tinydns-local/root
# ./add-host www.bravotouring.com 192.168.199.1
# ./add-alias mail.bravotouring.com 192.168.199.1
# ./add-alias ns.bravotouring.com 192.168.199.1
# ./add-host glantank.bravotouring.com 192.168.199.2
# ./add-host router.bravotouring.com 192.168.199.254
# make
# cd /service/
# ln -s /etc/tinydns-local .
てな具合。

dnscacheは192.168.199.1:53で待機。127.0.0.1と192.168.199.*からのリクエストを受け付けるようにし、上位DNSサーバはrouterにしておいて、bravotouring.com宛のクエリだけは127.0.0.1内向けDNSサービスへフォワードするのがミソだ。

# echo "192.168.199.1" > /service/dnscache/env/IP
# touch /service/dnscache/root/ip/127.0.0.1
# touch /service/dnscache/root/ip/192.168.199
# echo "192.168.199.254" > /service/dnscache/root/servers/@
# echo "127.0.0.1" > /service/dnscache/root/servers/bravotouring.com

動作確認は、192.168.199.1からdigを叩いて

# dig @192.168.199.1 www.google.com

; <<>> DiG 9.2.4 <<>> @192.168.199.1 www.google.com
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11235
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         587015  IN      CNAME   www.l.google.com.
www.l.google.com.       215     IN      A       66.249.89.104
www.l.google.com.       215     IN      A       66.249.89.99
www.l.google.com.       215     IN      A       66.249.89.147

;; Query time: 7 msec
;; SERVER: 192.168.199.1#53(192.168.199.1)
;; WHEN: Thu Oct 23 22:28:53 2008
;; MSG SIZE  rcvd: 100
# dig @192.168.199.1 www.bravotouring.com

; <<>> DiG 9.2.4 <<>> @192.168.199.1 www.bravotouring.com
; (1 server found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1195
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.bravotouring.com.          IN      A

;; ANSWER SECTION:
www.bravotouring.com.   80607   IN      A       192.168.199.1

;; Query time: 2 msec
;; SERVER: 192.168.199.1#53(192.168.199.1)
;; WHEN: Thu Oct 23 22:31:15 2008
;; MSG SIZE  rcvd: 54
みたく、内側も外側も解決できればOK。

これでもドメインを付与しないローカルホスト名(routerなど)の解決ができないのだが、それはまた次の機会に。

最後に/etc/dhcpd.confのdomain-name-serversを192.168.199.1に変更し、dhcpdを再起動して終了。

【参照】
●MultiX.jp - ASKN's WebSite http://multix.jp/
"HiCT" Local Area Network - djbdns-1.05
●仙石浩明の日記: CTO兼プログラマ兼システム管理者の視点から http://blog.gcd.org/
一つのIPアドレスで djbdns (tinydns, dnscache) を走らせる (3) dnscache で別ポートを使う 2006年7月10日