DHCP サーバで static ルートを配る

# ルーターの DHCP サーバーでルートを配る
おうちでネットワークのテストをしていたら、DHCP で default gateway 以外のルートも配ってみたくなった。

調べてみると DHCP の option 121 を使って送ることができるらしい。
option 121 Classless Static Routes option
注意点としては、option 121 を配布すると option 6 のデフォルトルートを無視するのが RFC の定義らしいので、デフォルトルートも含めて指定しましょう。ただし、両方とも有効として登録してしまう端末もいるので、両方でデフォルトルートが異ならないように。
また Android は option 121 を理解しません。

この他にも [DHCP オプション番号](http://help.sonicwall.com/help/sw/jpn/7100/26/2/4/content/Network_DHCP_Server.042.12.html) から適当に書き出してみると

| オプション| 属性 |
|--:|:----|
| 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 スクリプトを書いてみた。

[option121.pl](https://github.com/jp-yen/calc-dhcp-option-121/blob/main/option121.pl)

プログラムの後ろ、__END__ 以下部がルーティングのデータになります。
プログラム中の ` while (<DATA>){` の部分を ` while (<STDIN>){` にすると標準入力から対話式に入力できます。

__END__以下をこんな感じにして、実行。

```perl:
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
これらを並べることになる。

実行結果
```tcsh:
% 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 へ投入!
```RTX:
# 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) 効くんだろうか？

```RTX:改めて option を投入
# 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
のスタティックルートを登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/de34fdec-44d6-7740-abc5-009005db6e6b.png)
入力する値は HEX 値を : で区切り入力します。
ここで「OK」をクリックした後に、下にある「保存」をクリックで反映。

Aruba Airheads community
[1.  DHCP Option 121 Configuration](https://community.arubanetworks.com/discussion/dhcp-option-121-configuration#bm3e5ba38f-3d19-44ac-b070-2a78887b2ee5)

## PaloAlto の場合
192.168.16.32/32 192.168.63.128
0/0 192.168.63.254
のスタティックルートを追加する
NETWORK > DHCP
DHCP サーバ から、カスタム DHCP オプションを追加 or 編集で開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/648780f3-6086-664a-00cf-439c912a82c3.png)
option 121 を追加する

オプションタイプは 16進数を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/67633813-60e4-c512-3236-a474f64d6bb6.png)

他の項目も適宜入力し保存したら commit を忘れずに。

PaloAlto knowledgebase
[How to push static routes from the Palo Alto Networks DHCP Server](https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000ClEICA0&lang=en_US)