今回は手持ちのラズパイにDHCPサーバーを導入して検証してみた。
これまでDHCPサーバーはルーターのおまけ機能程度の認識だったけど、ネットワークで遊びだすとNTTのホームゲートウェイについているDHCPv4機能では物足りなくなってくる。
NTTホームゲートウェイのDHCPv4機能ではできないこと
ドメイン名が自由に配布できない。
例えば宅内DNSサーバーを立てていたとして、ドメインにlocal.thom.jpを指定していたとする。ここでホスト名rpi3と通信をするには、rpi3.local.thom.jpという風にFQDN指定しないと繋がらない。
dhcp側でデフォルトのドメイン名をlocal.thom.jpとして配布できれば、rpi3とホスト名を指定するだけで通信できる。これが一番大きい。
単一のセグメント分しか払い出しできない
普通の方は宅内でネットワークを分割してルーティングしようなどとは考えないので1つで足りると思う。
普通じゃない方はそういうことをやりがちなので、ネットワークごとに別のDHCPサーバーを立てるか、DHCPリレー機能で単一のDHCPサーバーに払い出しリクエストをパスすることになる。このときにセグメントに応じたIPアドレスを払い出せないとネットワークがうまく機能しない。
例えば10.1.1.0/24のネットワークと192.168.1.0/24のネットワークがあった場合に、NTTホームゲートウェイだとどちらか片方の系統のIPアドレスしか払い出せないということ。
まぁ今回の検証では単一セグメントしか扱わないけど、ゆくゆくはネットワークセグメント分割もやってみたい。
DHCPサーバーの選定
検索するとdnsmasqを紹介する記事が多かったので最初はdnsmasqを導入しようかと考えていた。
ここで少し私の好みに合わなかった点はdnsmasqは名前の通りDNSサーバーであり、dhcpも兼務してますというだけなところ。
私の場合は宅内DNSを立てたくて切実に困っているというわけではなく、どちらかというと道楽目的なのでどうせやるなら多少難しくても潰しが効く標準的なツールで固めたい。よってDNSには世界的にスタンダードとされるBINDを使用するつもりである。
そうするとdnsmasqのdhcp機能だけ使うのかという話になるが、それもなんか微妙だ。
更に調べてるとISC-DHCPを紹介する記事も結構多いことに気づいた。後から知ったことだけど、ISCとはInternet System Consortiumという組織で、BIND作ってるのもこのISCとのこと。
ということは、DHCPの世界標準もひょっとしたらISC-DHCPなのかもしれないと思い、今回はISC-DHCPを導入することにした。
(さらに後から調べて知ったのがISCはKeaというモダンなDHCPをリリースしてるらしく、今後はそちらが主流になっていくと思われる。またKeaも後日やってみたいと思う。)
DHCP検証の注意点
折角Ciscoルーターあるのでクローズドネットワークでやろうかと思ったけど、休日なのでそのまま自宅ネットワークで対応することにした。
想定されるリスクは以下の2点。
- 宅内DHCPとの競合がIPアドレスの重複を引き起こしてクライアントからネットワーク接続できなくなる可能性がある
- 設定ミスしたDHCPサーバーからIPを払い出されたクライアントがネットワーク接続できなくなる可能性がある。
在宅勤務なので平日夜とかにネットワークトラブル起こすと大変。こういう作業は連休中に限る。
メインマシンと、メインマシンからホームゲートウェイまでを中継する機器(無線AP・スイッチ)はDHCP障害に備えてあらかじめ固定IP化しておくのがおススメ。
何かトラブったときにネット検索もできなくなると詰む。
インストール
以下のサイトを参考にインストールと設定をやってみた。
qiita.com
インストールコマンド
sudo apt install isc-dhcp-server
インストール中に色々とエラーが出るけど、これはいきなり起動しようとして設定ファイルがちゃんと記載されていないことによるエラーだと思うので無視。
↓インストール時に発生したエラー
/etc/dhcp/dhcpd.conf ファイルの編集
コメント類を除くと次の設定となった。
※機器のMACアドレスは伏せている。
default-lease-time 600; max-lease-time 7200; ddns-update-style none; authoritative; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.20 192.168.1.30; option routers 192.168.1.1; option domain-name "local.thom.jp"; option domain-name-servers 192.168.1.97, 192.168.1.97; option broadcast-address 192.168.1.255; ignore declines; host x200 { hardware ethernet 00:26:c6:XX:XX:XX; fixed-address 192.168.1.180; } host GooglePixel { hardware ethernet f8:1a:2b:XX:XX:XX; fixed-address 192.168.1.170; } }
自動IP払い出しの範囲が192.168.1.20~192.168.1.30としているのは既存の宅内DHCPと被らせない為。
ホストx200とGooglePixelだけ固定IPを払い出すように設定してみた。検証なので特に意味はない。ISC-DHCPの注意点として、ここで設定する固定IPは自動IP払い出しの範囲外でなければならないこと。他のDHCPソフトでは固定指定したIPは対象MACアドレスの機器のために予約されるが、ISC-DHCPは自動IP払い出し範囲に入っているIPは問答無用で他の機器に貸し出されてしまう。
option domain-nameはまさに今回やりたかったことで、これによってrpi3と入力するだけでrpi3.local.thom.jpと入力したのと同じことになる。これはクライアントに対してIPを割り当てる際にデフォルトのドメインはlocal.thom.jpですよと教えている為だ。
/etc/default/isc-dhcp-server ファイルの編集
コメント類を除くと次の設定となった。
INTERFACESv4="wlan0" INTERFACESv6=""
ラズパイ3B+の場合、インターフェースは有線ならeth0、無線ならwlan0となる。
USBでLANや無線を挿してる場合はまた別の名前かと思うのでifconfigコマンドで調査する。
起動と検証
次のようにsystemctl startで起動し、systemctl enableで自動起動も有効にしておく。
sudo systemctl start isc-dhcp-server.service sudo systemctl enable isc-dhcp-server.service
あとはNTTホームゲートウェイでDHCPv4機能を停止させてから端末のDHCPを返却するか再起動するかネットワークにつなぎ直す等すれば、ホームゲートウェイではなく自分で起動させたラズパイDHCPがIPアドレスを払い出してくれるようになる。
発生したトラブル
- スマホがインターネットに接続できなかったが、CiscoスイッチとCisco APのIPアドレスを固定化したらうまくいった。
- クライアントによっては端末ごと再起動しないとうまくいかないものもあった。
- DNSサーバーIPアドレスをクライアントに配布する際、宅内DNSを指定すると全てのDNSトラフィックが宅内サーバーを通るので少しネット接続が遅くなったように感じた。これはNTT-HGWを指定しなおして、NGW側でlocal.thom.jpドメイン向けのDNSリクエストのみ宅内DNSに転送するように設定することで解消した。(記事内の設定は古いまま)
終わりに
いゃぁ、正直DHCP舐めてた。
地味だとか思ってすみませんでしたぁああああ。
という気持ち。
今後の展望としては、折角うまくいったけどやっぱISC-Keaという後継のDHCPサーバーでやり直そうと思う。
このISC-KeaをDockerで動かすという面白い記事を見つけたのでこれをやってみたい。
以上