kariaの日記 @ Alice::Diary

ノリツッコミの鳩子がはてなブログ書いちゃうよ

ひかり電話ルータ(RV-440NE)のある環境で内向きDNSサーバを立てようとしたらちょっと苦労した

自宅サーバに割り振ったドメインの名前解決が自宅ネットワーク内ではできない問題、よくありますよね。クライアントとなるマシンの台数が1台や2台ならhostsファイルに書いてやれば解決ですが、最近はスマホとかあるし、クライアントの台数が増加していてそう簡単にはいきません。

というわけで、いい加減何とかしようと思い立ちBINDを使って内向きのDNSサーバを立てました。自宅ネットワーク内にあるサーバのドメインだけ、ローカルなIPアドレス(192.168.x.x)を返すという仕組みです。

んで、我が家はなぜかひかり電話の契約があるのでRV-440NEというホームゲートウェイ兼ルータをNTTから借りて利用しています。設定画面を見る限りNECのOEMのようですね。とりあえずこのルーターに内向きDNSを使うよう設定してやることにしました。

f:id:karia:20141116024320p:plain

LAN側DNSサーバーアドレスといういかにもな設定項目があるので、今回立てたDNSサーバのIPアドレスを入れてやります。うむ、一見楽ちんですね。

これで完了かと思い、クライアントとなるデスクトップマシンから自宅サーバへ接続してみようと思いブラウザを立ち上げ、URLを入力してみましたが……つながらない。ルーターの設定画面を眺めてみましたがさっぱりわからん。

試しに、クライアントとなるWindowsマシンからnslookupしてみるとこんな結果になりました。

C:\Users\karia>nslookup yuno.side2.net
サーバー:  UnKnown
Address:  2408:210:a386:2f00:23a:9dff:fe8f:c4f2

権限のない回答:
名前:    yuno02.yuno.side2.net
Address:  210.139.81.173
Aliases:  yuno.side2.net

思いきりグローバルIPが返ってきてる……のはまあ一旦置いておくとして、サーバーのアドレスがIPv6??

状況を整理してみます。

  • フレッツ光ネクストひかり電話を契約し、かつRV-440NEを利用していると、LAN内機器にまでNTTからIPv6が振られる
  • RV-440NEの「LAN側DNSサーバーアドレス」設定はあくまでIPv4のもの(IPv6では先ほどの「LAN側DNSサーバアドレス」の設定は無視)
  • IPv6に対応したクライアントではIPv6で優先的にDNSを引こうとする

→結果としてせっかく立てた内向きDNSサーバを完全スルー

お、おう……。

まあ放っておくわけにいかないので、いくつか対策法を考えてみました。

1.クライアントでIPv6を無効にする

クライアントのマシンでIPv6を無効にすれば、全ての通信がIPv4になるので内向きDNSを見に行くようになります。一見お手軽なように見えますが、イマドキAndroidでもIPv6に対応している時代。一個一個無効にしていくのはさすがはナンセンスでは……ということでこの案はパス。

2.RV-440NEのローカルドメイン設定を利用する

RV-440NEにも一応ローカルドメイン設定なる設定項目があります。

f:id:karia:20141116030307p:plain

この設定を行うと、ISPDNSに問い合わせする前にこのローカルドメイン設定に記載したDNSサーバに問い合わせを行ってくれます。一見いいことずくめのように見えますがいくつか問題が。

IPv6に対応したDNSサーバを立てる必要がある

この設定画面、プライマリDNSとセカンダリDNSの欄にはIPv6のアドレスしか書くことができません。つまりDNSサーバにIPv6のアドレスを割り振ってやり、かつDNSサーバのソフトウェア的にもIPv6対応である必要があります。

まあできなくはないけど(一応ちゃんと動くことは確認した)、そうなると家庭内ネットワークにおけるIPv6設計をちゃんとしないとなぁという方向性になりますね。付け焼き刃でやると痛い目を見そう。

無駄な問い合わせが発生する

どちらかという問題はこっち。家庭内ネットワークの名前解決の問い合わせ全てについて、一旦ローカルドメインな扱いとして問い合わせが発生します。どういうことかというと、例えば「www.google.co.jp」の名前解決をしようとしたときこうなります。

全部の名前解決リクエストを一旦ローカルドメインの扱いだと思って内向きDNSへ問い合わせに行ってしまうのです。まあ「ローカルドメイン」だからそりゃそうだけどさ……。これは無駄っぽいので却下。

3.もう1台ルーターを使ってクライアントマシンを別セグメント化する

最終的に採用したのがこの対策法。ひかり電話ルーターが使い物にならないなら別のルーターを使えばいいじゃない!

幸いなことに、無線LANの親機としてルーター機能もあるAterm WG1800HPを使用していたので、こいつを利用することにしました。

NEC AtermWG1800HP(HPモデル) PA-WG1800HP

NEC AtermWG1800HP(HPモデル) PA-WG1800HP

構成としては、

(Flet's) - RV-440NE -[1]- Aterm WG1800HP -[2]- (Home Network)

みたいな感じです。[1]のセグメントと[2]のセグメントを分離して、IPv6が利用できるのは[1]のセグメントだけに限定するのがポイント。

RV-440NE側設定

f:id:karia:20141116032028p:plain

LAN側IPアドレスおよびネットマスクを設定します。ここでの設定値が[1]のセグメントで利用できるIPアドレスのレンジを決定します。

DHCPサーバはOFFで良いかと思います。

f:id:karia:20141116034134p:plain

[2]のセグメント宛の通信がWG1800HPを向くよう、静的ルーティング設定をします。エントリ番号02がそれです。ゲートウェイの欄にはWG1800HPのWAN側IPアドレスを設定します。

Aterm WG1800HP側設定

まずはWAN側([1]のセグメント側)設定。

f:id:karia:20141116032311p:plain

DHCPクライアント機能をオフにし、RV-440NEのLAN側IPアドレスで設定したのと同じセグメントにします。ゲートウェイおよびネームサーバはRV-440NEのLAN側IPアドレスに。

お次はLAN側([2]のセグメント側)設定です。

f:id:karia:20141116032558p:plain

[1]のセグメントとは別のレンジで設定します。DHCPサーバは使用しない設定としています(DNSサーバにDHCPサーバを立てたのと、WG1800HPに「LAN側DNSサーバーアドレス」に相当する設定値が見当たらなかったため)。

f:id:karia:20141116035058p:plain

さらに「IPv6ブリッジ」をオフにします。オンにすると[2]のセグメントにいるマシンにIPv6が振られてしまいますので、必ず切っておきましょう。

f:id:karia:20141116032816p:plain

また、「その他の設定」画面にある「NAPT機能」をオフにしてWG1800HP側のIPマスカレード機能をオフにします。この設定をしないとRV-440NEとWG1800HPで2回もNAPTが行われるため、設定はめんどくさいわスループットは落ちるわで全く良いことがありません。

ここまで設定すれば[2]のセグメントにいるクライアントマシンにはIPv6アドレスが振られず、DNSの問い合わせもちゃんと内部DNSサーバへ行くようになり良かった良かった、と言いたいところなのですが、この構成ではUPnPがちゃんと動かないので一部のアプリでは支障がありそうです。なかなかうまくいかないもんですね。

本記事を書くにあたり下記の記事を参考にさせていただきました。この場を借りてお礼申し上げます。

修正履歴

  • 2014/12/11:何が問題かわかりにくかったので箇条書きにして修正