自宅ネット用のDNSリゾルバを立てる

DNSといえばBINDしか知らないクチだったけど、最近は結構他にもあるもんだなぁとかとか。なぜDNSを立てようと思ったかとかも含めてグダグダ書こう。

自宅ネット内には自宅サーバ(外部公開の http://www.rarul.com/ とか)が立ってる。多分に漏れず、ISPから固定でないIPv4のグローバルIPアドレスをもらってて、それをNAPTでぶら下げる形でプライベートIPアドレス運用している。Webサーバとして公開するので、ポートマッピングとしてTCPポート80をこの自宅サーバのプライベートIPアドレスへと転送している。自宅サーバ的にはほぼこれでOKと。IPv6化計画がないわけでもないけど、まだ様子見、、、ASAHIネットよ早くJPNEのIPv6ローミングに対応してくれよと。

rarul.comドメインのネームサーバはValue-Domainで用意してくれている固定IPアドレスのを使っているのでネームサーバの心配はない。Value-Domainのネームサーバは動的DNSの運用も許してくれていて、自宅サーバから定期的にValue-Doaminの動的DNS設定をたたくことで、ISPからもらったグローバルIPアドレスが変わってしまった場合(PPPoEが切れたとか)にも勝手にネームサーバの配信する情報を変更してる。

これらにより、外部ネットワークからアクセスする場合には特に問題がなくなる。が、問題なのは内部からアクセスする場合。

何もせずに内部から「http://www.rarul.com/」にアクセスしようとすると、www.rarul.comをマジメに名前解決してしまい、グローバルIPアドレスが返ってきてしまう。このグローバルIPアドレスでアクセスした場合は使ってるルータ(というかNAPTというか)次第で、今使ってるフレッツ光プレミアムのCTUは、HTTP Response 500とともに「Internal Server Error」と書かれたページが返ってくる。たぶん外部ネットワークからCTU設定画面に入ろうとしたヤカラのための対策なんだろうなぁ。YAMAHAのRTX1100なんかの場合は、このグローバルIPアドレスでのアクセスを再ルーティングしてポートマッピング設定した先まで返してくれるという親切なのか怪しい仕様というべきなのかという挙動をすることで結構有名。よくあるルータなんかだと接続タイムアウトで何も返ってこなかったり、ルータの設定画面に入れてしまったり、結構怪しい部分だったりする。

マシンの台数が少なかったりすると、各マシンのhostsにプライベートIPアドレスが返ってくるようゴニョゴニョ書いておくという方法がとれる。Windowsだと「C:\Windows\System32\drivers\etc\hosts」をゴニョればいい。Vista以降は管理者権限がないとこのファイルを編集できないので不便だけど、そんな人のためのTips。でも、台数が多かったり、自宅サーバがよく移転したり、ノートPCのように内部ネットワークからだったり外部ネットワークからだったりが時と場合によったりする場合、このやり方も限界がある。最近新しくスマホ買った影響で、まさにこのノートPCのような例に引っかかり、限界を感じたところ。結局のところ、内部から「http://www.rarul.com/」に正しくアクセスできるようにするには、内部ネット用のDNSを立てるのが確実な解決方法だったりする。

そんなわけで、BIND以外のDNSとして候補を調べると、PowerDNS、NSD、Unbound、あたりが残る。今は(特に外部に公開するような)ネームサーバとして動作させたいわけではないので、NSDは対象外。この中で、CentOSのyumで管理できてかつ簡易なものということで、今回はdnsmasqをチョイス。

# yum install dnsmasq
# vi /etc/dnsmasq.conf

domain-needed
bogus-priv
local=/www.rarul.com/
local=/rinchan.com/
# /etc/init.d/dnsmasq start
# /sbin/chkconfig dnsmasq on

あらかじめ /etc/hosts にゴニョゴニョ書いてあるという想定で、dnsmasq は/etc/hostsを見て勝手に返信してくれる。
mail.rarul.comは外部ネットワークにいってほしいのでlocal=/www.rarul.com/で。
本当はmail.rinchan.comも外部ネットワークにいってほしいのだけどこっちは今のところあきらめ、、で local=/rinchan.com/

これであとはDHCPサーバで配信するDNSのIPアドレスをdnsmasq立てたマシンにし向ければ・・・と思ったら、フレッツ光プレミアムのCTUのDHCPサーバが、配信するDNSのIPアドレスは固定でCTU自身から変えられないでやんの。イヤなところで躓いた。

このCTUは代わりに、「ドメイン問い合わせ先設定」なんていう設定を持っている。これは、通常はCTU自身がDNS要求のリレーをする(内部クライアントから来た要求を外部ISPのDNSにリレーする)ところを、手動で入れたドメインに対する要求の時にだけ別のDNSにリレーするという設定。ここに「www.rarul.comはdnsmasq立てたマシンへ」「rinchan.comはdnsmasq立てたマシンへ」と書いとくと、この2つの名前解決の要求が内部のdnsmasqマシンへ飛んできてくれるようになる。ただし、dnsmasqの設定で「自分で解決できないrinchan.comドメインのは上位のリゾルバに任せる」としていると、dnsmasqから(上位リゾルバとして登録している)CTUに要求が飛び、CTUがdnsmasqにリレーして、dnsmasqがCTUに要求をとばし・・・を繰り返してCTUがしばらくハングしてしまう現象になる。ISPが変わるケースも考えるとdnsmasqの上位リゾルバはCTUしかあり得ないので、結局、dnsmasq.confの「local=」を記述することでこのループに入らないようにした。本当なら、CTUにDHCPサーバをやらすのをやめてdnsmasqのDHCPサーバを使うのがいいんだろうけど、これだとdnsmasq立ててるマシンが死ぬとネットワークが死んじゃうので却下。いろいろめんどいです。

さ、これで設定完了・・・と思ったらなぜか http://rinchan.com/ にアクセスできない。nslookupだとちゃんとプライベートIPアドレスが返ってきてるのに ping だとグローバルIPアドレスが返ってきてNG・・・結局調べると、WindowsのOSのDNSキャッシュでした・・・この手のを確認するときは「ipconfig /displaydns」「ipconfig /flushdns」を忘れずに、、

ちなみにUNIX系は、DNSの結果をプロセス単位でしかキャッシュせず、OSとしてはキャッシュしないそうな・・・え?そうなんや・・・言われてみれば確かにlibcの機能としてしか提供してなかったか・・・

このブログ記事について

このページは、らるるが2013年7月19日 03:24に書いたブログ記事です。

ひとつ前のブログ記事は「今日のできごと」です。

次のブログ記事は「Effective C++ は必ず読んどこう」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0