ルーターの DHCP サーバーでルートを配る
おうちでネットワークのテストをしていたら、DHCP で default gateway 以外のルートも配ってみたくなった。
調べてみると DHCP の option 121 を使って送ることができるらしい。
option 121 Classless Static Routes option
注意点としては、option 121 を配布すると option 6 のデフォルトルートを無視するのが RFC の定義らしいので、デフォルトルートも含めて指定しましょう。ただし、両方とも有効として登録してしまう端末もいるので、両方でデフォルトルートが異ならないように。
また Android は option 121 を理解しません。
この他にも DHCP オプション番号 から適当に書き出してみると
オプション | 属性 |
---|---|
2 | 協定世界時からのオフセット時間 |
3 | Router (デフォルトルート) |
6 | DNS サーバ |
7 | ログサーバー |
15 | クライアントの DNS ドメイン名 |
26 | インターフェイスの MTU サイズ |
28 | ブロードキャストアドレス |
42 | NTP サーバ |
43 | ベンダー固有情報 |
51 | IP アドレスのリース期間 |
121 | クラスレス静的ルート |
... と DHCP は色々と情報を送れます。option 43 なんかは、Cisco の AP に WLC (コントローラ) のアドレスを教えるのに使ったり、Aruba の AP にコントローラーのアドレスを教えるのに使ったりと、使い道は色々。
注) クラスフル (CIDR に対応していない) ルーティングの Static Route option (option 33) は RFC 3442 で廃止。
では option 121 でルートを送ってみよう
しかしパラメータの計算が面倒くさい。ということで、perl スクリプトを書いてみた。
プログラムの後ろ、END 以下部がルーティングのデータになります。
プログラム中の while (<DATA>){
の部分を while (<STDIN>){
にすると標準入力から対話式に入力できます。
__END__以下をこんな感じにして、実行。
10.0.0.0/8 192.168.10.200
172.16.0.0/12 192.168.10.200
0/0 192.168.10.250
q
08 ← subnet mask (ルーティング一つ目)
0a ← 10.0.0.0 の先頭 8bit
c0a80ac8 ← 192.168.10.200
0c ← subnet mask (ルーティング二つ目)
ac10 ← 172.16.0.0 (先頭 16bit)
c0a80ac8 ← 192.168.10.200
00 ← 0/0 省略形 (デフォルトルート)
c0a80afa ← 192.168.10.250
これらを並べることになる。
実行結果
% perl ./option121.pl
enter Distination net/mask and Gateway <NET>/<bit> <GW>
Default route --> 0/0 <gateway>
(ex: 10.20.30.40/16 172.31.23.5) ==>
Next or quit (q)
(ex: 10.20.30.40/16 172.31.23.5) ==>
Next or quit (q)
(ex: 10.20.30.40/16 172.31.23.5) ==>
Next or quit (q)
(ex: 10.20.30.40/16 172.31.23.5) ==>
08,0a,c0,a8,0a,c8,0c,ac,10,c0,a8,0a,c8,00,c0,a8,0a,fa
YAMAHA RTX 用のオプションの文字列を生成完了。
いざ RTX 1000 へ投入!
# dns server 8.8.4.4 8.8.8.8
# dns private address spoof on
# ip host rtx1000 192.168.10.250
# ip host ad.doubleclick.net 127.0.0.1
# ip host www.google-analytics.com 127.0.0.1
#
# dhcp service server
# dhcp server rfc2131 compliant on
# dhcp duplicate check 300 500
# dhcp scope 1 192.168.10.100-192.168.10.150/24 except 192.168.10.111 gateway 192.168.10.250 expire 1:10
# dhcp scope option 1 dns=192.168.10.250,9.9.9.9
# dhcp scope option 1 hostname=RTX1000
# dhcp scope option 1 121=08,0a,c0,a8,0a,c8,0c,ac,10,c0,a8,0a,c8
Error: Illegal keyword
#
な!、肝心な option 121 がエラーに。
調べてみると、昔の Windows は 249 だったらしい。今でも (Windows 11) 効くんだろうか?
# dhcp scope option 1 249=08,0a,c0,a8,0a,c8,0c,ac,10,c0,a8,0a,c8
#
エラーなく入ったっぽい。
RTX1000 の配る IP を Windows 11 で取得してみる
→無事、ROUTE に反映されました。
12行目のセパレータを書き換えると NEC UNIVERGE IX, YAMAHA RTX, Cisco で使えることを確認しました。
記述方法については、perl スクリプト末尾のコメント部分を参考にどうぞ。
そのほか GUI の例
Aruba IAP WebUI の場合
192.168.16.32/32 192.168.63.128
0/0 192.168.63.254
のスタティックルートを登録する。
入力する値は HEX 値を : で区切り入力します。
ここで「OK」をクリックした後に、下にある「保存」をクリックで反映。
Aruba Airheads community
1. DHCP Option 121 Configuration
PaloAlto の場合
192.168.16.32/32 192.168.63.128
0/0 192.168.63.254
のスタティックルートを追加する
NETWORK > DHCP
DHCP サーバ から、カスタム DHCP オプションを追加 or 編集で開く
option 121 を追加する
他の項目も適宜入力し保存したら commit を忘れずに。
PaloAlto knowledgebase
How to push static routes from the Palo Alto Networks DHCP Server