YAMAHA 製のルータ内で DHCP サーバが動いている状況で、特定のクライアントに対して DHCP サーバから固定の IP アドレスを払い出すように設定したい。
dhcp scope bind 1 192.168.0.2 XX:XX:XX:XX:XX:XX
とりあえず「IP アドレスと MAC アドレスを紐付けたらいいでしょ」と考えてこのようなコマンドを実行したが、IP アドレスは固定できなかった。
3行まとめ
- DHCP の仕様 (RFC2131) で定義されている Client Identifier という機能があり、DHCP クライアントは任意の識別子を DHCP サーバに伝えることができる
- YAMAHA ルータの DHCP サーバは初期設定では Client Identifier を用いた固定割当 (use-clientid 機能) を優先するようになっており、その場合は MAC アドレスで固定割当を設定しても動作しないことがある
- YAMAHA ルータの設定で use-clientid 機能を無効にすることで MAC アドレスによる固定割り当て設定を動作させることができる
原因調査をする
15.1.5 DHCP 予約アドレスの設定 - RTpro - ヤマハ
公式ドキュメントを読むと、こう書いてある。
[書式]
dhcp scope bind scope_num ip_address [type] id
dhcp scope bind scope_num ip_address mac_address
...
DHCP 固定割当をするコマンドには複数のフォーマットがあるらしい。
さきほど実行してうまくいかなかったのは第2書式に当たる。
コマンドの第 2 書式による MAC アドレスでの予約は、クライアントの識別に DHCP パケットの chaddr フィールドを用いる。この形の予約機能は、RT の設定が dhcp server rfc2131 compliant off あるいは use-clientid 機能を使用しない設定になっているか、もしくは DHCP クライアントが DHCP パケット中に Client-Identifier オプションを付けてこない場合でないと動作しない。
つまり、「設定で use-clientid 機能が有効になっている」かつ「DHCP パケット中に Client-Identifier オプションが付いている」場合は、第2書式で指定した固定割当は動作しない。
15.1.2 RFC2131 対応動作の設定 - RTpro - ヤマハ
公式ドキュメントを読むと、use-clientid 機能は初期状態で有効になっていることがわかる。
また、show status dhcp
を実行した結果を見ると、ほとんどのクライアントで (タイプ) クライアントID: (01) xx xx xx xx xx xx
と表示されることから、ほとんどの DHCP クライアントのパケットに「Client-Identifier オプションが付いている」ことがわかる。
DHCP の Client Identifier とは何か
以下のサイトが詳しかった。
DHCPのクライアントIDオプション:プログラマー社長のブログ:オルタナティブ・ブログ
要点を抜粋すると、
- Client Identifier は DHCP の仕様 (RFC2131) に記載されている仕様で「クライアントからクライアント ID が送られてきたら MAC アドレスの代わりにクライアント IDでクライアントを識別せよ」という機能のこと
- この仕様の趣旨は「ネットワークボードを交換しても同じ払い出しを受けられるようにする」ため
- 実際の DHCP クライアントは、ほとんどがクライアント ID として「0x01 + MAC アドレス」を指定してくる
- 先頭の 0x01 は種別が MAC アドレスだという意味で、事実上 MAC アドレスで識別しているのと変わらない
- macOS ではネットワーク設定画面から簡単にこのクライアント ID を任意の値に設定できる
- 同一セグメント内で「クライアント ID」が重複するように設定できてしまう
- 上記サイトの筆者 (長年 DHCP 製品を開発) は、クライアント ID による識別が必要なケースに出会ったことがない
クライアント ID による識別、やらないほうがいいのではないか???
クライアント ID による識別を無効にする
YAMAHA ルータでは、以下のコマンドでクライアント ID による識別を無効にすることができる。
dhcp server rfc2131 compliant except use-clientid
これを設定しておけば、冒頭の
dhcp scope bind 1 192.168.0.2 XX:XX:XX:XX:XX:XX
このようなコマンド (第2書式) で MAC アドレスによる固定割当が動作するようになる。
補足: use-clientid を有効にしたまま固定割当する方法
何らかの事情で use-clientid を無効にできない場合かつクライアントからクライアント ID が送られてくる場合は、第2書式は使えないので第1書式で指定するほかないが、第1書式での指定方法もいくつかある。
(クライアントからクライアント ID が送られてくるかどうかは、一度 IP を払い出してみて show status dhcp
したらわかる。)
(use-clientid が有効であっても、クライアント ID が送られてこないクライアントに対しては第2書式は使える)
クライアント ID を指定する方法
MAC アドレスではなくクライアント ID を指定することで固定割当できる。
dhcp scope bind 1 192.168.0.2 <クライアントID>
<クライアントID>
はたいてい 01 XX XX XX XX XX XX
(01 + MAC アドレスをスペース区切りにしたもの) が送られてくるが、クライアントが変則的なフォーマットでクライアント ID を指定してくる場合はそれに対応しなければならない。
type ethernet
を指定する方法
type ethernet
を明示することで、クライアント ID が送られてくる場合であっても MAC アドレスによる固定割当ができる。
dhcp scope bind 1 192.168.0.2 ethernet <MACアドレス>
3行まとめ (再掲)
- DHCP の仕様 (RFC2131) で定義されている Client Identifier という機能があり、DHCP クライアントは任意の識別子を DHCP サーバに伝えることができる
- YAMAHA ルータの DHCP サーバは初期設定では Client Identifier を用いた固定割当 (use-clientid 機能) を優先するようになっており、その場合は MAC アドレスで固定割当を設定しても動作しないことがある
- YAMAHA ルータの設定で use-clientid 機能を無効にすることで MAC アドレスによる固定割り当て設定を動作させることができる