dnsmasqのDHCPでMACアドレスに応じてルーティング情報を配布する

dnsmasqはうちの会社くらい規模だと、DNSのキャッシュサーバ兼DHCPサーバとして、お手軽で、且つ、思ったよりずっと柔軟に設定を制御できるのでなかなか便利です。

実際、基本的にインターネットに出ていくためのBフレッツでPPPoE経由でつないでいるのはNVR500ですが、さすがにこのルータのDHCPサーバ機能をそのまま使ってしまうと、ローカルの一部の開発サーバのためにDNSの返答をカスタムするために、クライアントに依っては別のDNSサーバを配ったり、VPN経由でサービス用セグメントにつなぐためのルーティング情報をメンテナンスするメンツにだけ配るというような制御は当然ですができません。(そんなものがこの価格帯のアプライアンスでできるわけないですよね。)

ただ本題からはずれますが、ルーターとしては、YAMAHAの製品だけあって本当に安定していて、10人弱が日中普通に使いまくっていたり、会社の製品の性質上のRTMPでの動画データの送信を延々とやったりしてもフリーズしたり狂ったりということは滅多にありません。2年くらい使っていて、1-2度再起動をしたかなぁ程度の記憶です。とりあえず、個人宅でもNVR500マジ安くてオススメ。私は自宅ではVyatta使っていますけど。

で、本題のdnsmasqの設定。上記の通り、特定の端末にだけ、ルーティング情報を配るという設定をしたい場合にメモ。

net:で名前をつける

簡単な手順を文章で書くと、以下のような流れ。

  1. dhcp-hostでMACアドレスにnet:[name]で名前をつける
  2. dhcp-optionで、net:[name]を先頭に宣言してから、渡すオプションを決める

という感じで極めてシンプルに端末毎にDHCPオプションを制御できます。

実際の設定例は以下のような感じ。実際にはこのサーバでも別のPPPoEの終端をしたりもしているので、bind-interfaceを指定してDHCPサーバになるインターフェースを限定しつつ、基本的にはシンプルにdhcp-rangeで全体の設定をしつつ、dhcp-hostで特定の端末だけルーティング情報を配るように設定を追加しています。また、dnsmasqはなにも設定しないと、自分をデフォルトゲートウェイとして配ってしまうので、インターネット回線のルータが別にあったりするようなケースではoption:routerを別途設定しておきます。

interface=br0
bind-interfaces

domain=mat2uken.local

dhcp-authoritative
dhcp-range=172.16.0.20,172.16.0.230,255.255.248.0,72h
dhcp-option=option:router,172.16.0.1

dhcp-host=00:15:17:xx:xx:xx,net:red
dhcp-option=net:red,121,10.0.0.0/8,172.16.2.240

cache-size=65536
no-negcache

ざっくりこれくらいかけば、DNS兼DHCPサーバとして機能してくれます。特定のMACアドレスに10.0.0.0/8のstatic routeを配ります。

DHCPの各種オプションいじれるサーバの中ではダントツに使いやすいのがdnsmasqだと思います。単純なお手軽DHCPというだけでなく。

dnsmasqはいろいろ便利

とりあえず、dnsmasqを動かせるようなlinuxなりの常時稼働のマシンが自宅にあればとりあえず動かしておけばDNSキャッシュにもなるし、DHCPのオプションをいじり放題なので結構オススメ。まあ、そんな人は大抵知ってていろんな方法でやってそうだけど。

あと、開発時にSSLの確認などで、本番のドメイン名での動作を確認するために、ローカルのhostsを書き換えなくても、dnsmasqが動いているサーバの/etc/hostsを書き換えれば自動的に繋がっている端末での名前引きもその設定をつかえるので大変便利。特に、iPhoneとかAndroidなどもモバイル端末の場合にすごく楽になります。