2020年7月26日日曜日

ルーターとは別にDHCPサーバーとDNSサーバを立てると吉


家で8年ほど使っていたルータが故障しました。

BHR-4GRVという機種に、DD-WRTをインストールして使っていたのですが、ある日突然リンクしなくなり、HUBとしてすら使えなくなりました。
簡易DNSやヘアピンNATができて重宝していたのですが…でもまあ、長持ちした方かも、今までありがとう。

DD-WRTは高機能なのですが、IPv6パススルーやPPPoEマルチセッションができなかったりします。
正確にいえば、CUIで色々やればできるのですが、GUIで設定できて使えるほどには整理されていません。
この2つの機能のどちらかがないと、フレッツのサービス情報サイトにアクセスできず、回線認証をするフレッツメンバーズクラブのポイント交換ができません。

今後、IPv6化もしたいので、DD-WRTとはここでお別れし、通常の市販ルータに置き換えたいと思います。

それにしても、ルータが壊れるのは悲劇ですね。
インターネットにアクセスできなくなるだけではなく、DHCPでIPアドレスも振られなくなるし、内部の名前も引けなくなるので、一瞬パニックになりました。
今後、ルータが壊れた時に、内部で最低限のことができるように、DHCPと内向きのDNSは別の機器で分けるようにしておきたいと思います。

まず、最初にルータ本体の置き換えから。
最近の大抵の機種では、IPv6パススルーやPPPoEマルチセッションはできるようです。
一方、簡易DNSは高級な機種のみにしかなく、ヘアピンNATはその機能の有無がカタログにすら載っていないことが多いです。
このため、簡易DNSとヘアピンNATをルータ本体で賄わない、と割り切ることにしました。

首都圏の市街地では2.4GHz帯は非常に混雑しており、我が家の周辺でも同様のため、11aに対応したモデルを選び、普通に設定して使いはじめました。
これでとりあえずはインターネットへのアクセスは確保できました。

次に内向きのDNSについて。
イントラ内のクライアントが少ない内向けのDNSの構築には、dnsmasqが向いています。
また、dnsmasqにはDHCP機能もあるので、最終的にDHCPもdnsmasqで賄い、ルータのDHCPを無効にすると良いと思います。

幸いにして、我が家には7セグメントLED時計を表示させるために電源は入りっぱなしのRaspberry pi 2があるので、これを流用することにしました。
このFreeBSDがインストールされたRaspberry pi 2に、portsnapを利用してdnsmasqをインストールします。

portsnap fetch extract
cd /usr/ports/dns/dnsmasq
make install clean

4コアといえども非力なARMに加え、SDカードの読み書きが遅いため、かなり時間がかかるので注意してください。
また、途中でビルドのオプションを問うダイアログがいくつも表示されるので、いちいちOKをしていく必要があります。

インストールが完了したら、「/usr/local/etc/dnsmasq.conf」をこんな感じで編集します。

# global settings

domain-needed
bogus-priv
expand-hosts
domain=local.kishiro.com
listen-address=127.0.0.1,192.168.0.6

# DHCP settings

dhcp-range=192.168.0.128,192.168.0.233,720m
dhcp-leasefile=/tmp/dnsmasq.leases
dhcp-option=option:router,192.168.0.1
dhcp-option=option:netmask,255.255.255.0
dhcp-option=option:dns-server,192.168.0.6
dhcp-option=option:ntp-server,192.168.0.6

# DNS

address=/www.kishiro.com/192.168.0.26

address=/router.local.kishiro.com/192.168.0.1
    :
    :
    :

「192.168.0.6」はRaspberry pi 2に割り当てられているIPアドレスで、「local.kishiro.com」はイントラ内のドメイン名です。

「www.kishiro.com」は外部に公開しているwwwサーバで、外部DNSではルーターのWAN側のIPアドレスが引かれるように設定しています。
また、ルーター側の設定で、WAN側の80/443番ポートへのアクセスをLAN側の「192.168.0.26」にポートフォワードするようにしています。

置き換えた新しいルータは、案の定ヘアピンNATが使えない(内部ネットワークからwww.kishiro.comに接続してもエラーになる)機種でしたので、dnsmasqの設定に以下の一行を加えています。

address=/www.kishiro.com/192.168.0.26

これにより、内部ネットワークから「www.kishiro.com」の名前解決を試みたときに、外のDNSに問い合わせに行く前にdnsmasqがローカルIPアドレスの方を回答します。
結果、パケットがWAN側に出ていかず、折り返しが発生しなくなるわけですね。

長くなりましたが、これでルータが壊れたとしても、Raspberry pi 2さえ動いていれば、dnsmasqによる内部のネットワークのIPアドレス払い出しと、名前解決が担保されるようになりました。
Raspberry pi 2のほうが壊れにくいかは謎ですが。

そして何より、今後、高級なルータを買わなくてもすむようになりました。

皆様もよろしければお試しください。

0 件のコメント:

コメントを投稿