DHCPサーバーｋｅａでクラスレス静的経路の配布

# はじめに
isc-dhcpd から kea に移行してしばし経つが、クラスレス静的経路（ＲＦＣ３４４２）の機能だけ移行しきれず、ごまかしながら運用していたが、じっくり調査する機会ができたので調べてみた。結論はシンプルだった。

# 検証環境
- FreeBSD/amd64 14.2-R
- kea 2.6.1 ※2.5.5 以降であることを確認

## 動作検証環境
- isc-dhcpd 由来の `dhclient` を採用しているＯＳならほぼ（分岐した時期による）。
    - FreeBSD/amd64 14.2-R など。
    - 今時のいくつかの Linux Distribution でも確認している（セットアップしてまでの動作確認は未実施）。
    - 期待通りコード１２１（Classless static route）の設定を優先してくれる。
- Windows 11 Pro 24H2
    - コード１２１（Classless static route）は認識してくれる。
    - コード３（Router）とコード１２１のデフォルトルーターを両方設定してしまう（イコールパス？）。
    - コード３を無視しないという振る舞い以外はほぼ期待通り。
- Apple iPhone 16 Pro / iOS 18.3
    - コード１２１（Classless static route）は認識してくれる。
    - コード３（Router）があるとそちらが優先される。※微妙
    - 静的経路の確認できないので設定が効いてるかは不明。
- Google Pixcel 6a / Android 15
    - コード１２１（Classless static route）を認識してくれない。
    - 結果コード３（Router）しか認識されない。
    - 静的経路の確認できないので仮に設定が出来たとしても確認できるかは不明。
- Sony ILCE-1（α1）/ Ver. 3.00 
    - コード１２１（Classless static route）を認識してくれない。
    - 結果コード３（Router）しか認識されない。
    - このことから組み込み系は警戒した方がいい。

# 設定ポイント

単純にコード３（デフォルトゲートウェイの配布）と同じ設定を目指すなら、下記のように表現します。

```json
    {
        "name": "classless-static-route",
        "data": "0.0.0.0/0 - 192.168.0.1"
    }
```

- `name` は `"classless-static-route"` の固定。
- `data` は `"サブネットアドレス - ゲートウェイＩＰ"`。

複数の経路を指定する場合は `,` で区切って指定します。

```json
    {
        "name": "classless-static-route",
        "data": "0.0.0.0/0 - 192.168.0.1, 192.168.1.0/24 - 192.168.0.1"
    }
```

空白の有り無しについては評価していないですが、見やすさとのバランスを考慮すると、上記バランスで書くのが重要かと。

# 過去情報についての注意喚起

以下の過去の話です、設定すると有害です。具体的にはエラーになります。
- `option-def` で `"code": 121` なレコード定義しろ
- `uint8,ipv4-address` な指定する
- `"0, 192.168.0.1, 24, 192, 168, 1, 192.168.0.1"` な指定とか

## Ｑ．いつからこの設定ができるようになったのですか？

Ａ．ソースコードの変更差分を追ってみると [2.5.5](https://gitlab.isc.org/isc-projects/kea/-/wikis/release-notes/release-notes-2.5.5) （2024/01/31）からです。
機能追加リクエストがあり、実装されました。

2.5.4 以下では過去の設定が機能するかもしれません（自分は上手く動かせなかったので未確認）。

# よくある質問とその答え

## Ｑ．isc-dhcpd とか kea って？
[ＩＳＣ（Internet Systems Consortium）](https://www.isc.org/about/)が作ったＤＨＣＰサーバーです。古くから isc-dhcpd が一般的に使用されていましたがサポートは終了、後継の kea の使用が推奨されています。

## Ｑ．isc-dhcpd と kea の話を区別する方法は？
Ａ．ＩＳＣやＤＨＣＰというキーワードだけなら、isc-dhcpd の話をしている可能性があります。ＫＥＡなら kea と書いてるケースが多いです。
設定ファイルを見て、セミコロンで列挙するタイプであれば isc-dhcpd、ＪＳＯＮ形式（亜種）であれば kea であると区別できます。

## Ｑ．何か嬉しいの？
Ａ．ＬＡＮが１ポートしかないケースで嬉しいことはあんまりないです。複数ポート持ってて、それぞれのポートの先に違うサブネットワークがあるようなケースで、動的ルーティング運用するまでもないネットワークを運用するような場合、ＤＨＣＰクライアント側の設定が楽になります（基本何も気にしない）。
これはルーティング情報の配布をＤＨＣＰサーバー側に集約させることができるからです。

Ａ．この機能を要望した人によれば

> 冗長的なＩＰＳｅｃ接続性を有する複雑なエンタープライズメッシュＶＰＮ構成において、ＤＨＣＰサーバーからネットワークトポロジに関するヒントを提供する必要がある場合があります。
> この機能により、メッシュ内のさまざまなアイランドへのＣＩＤＲ経路を提供しやすくなります。

とのこと。必要な所では必要と認識されています。

## Ｑ．何を調べたの？
コード１２１（Classless static route）はコード３（Router）の上位互換機能となります。コード１２１はコード３より優先的に解釈することが求められます。コード３を実装していないＤＨＣＰクライアントは存在しませんが、コード１２１の方は一般的で無いため、実装の状態を確認する必要があります。

実際、サーバーユースでコード１２１に対応していないＯＳはあまり見ません（今回動作検証確認としては少ないです）が、組み込み系はどこまで頑張ってるか不明なため、確認する必要があります。

## Ｑ．isc-dhcpd 由来の dhclient とは？
Ａ．isc-dhcpd の中に dhclient が配布されていましたが、各ＯＳでこれを取り込み、独自に進化しています。
中には完全に置き換えたＯＳもあるかもしれませんが、細かくは追っていません。

## Ｑ．他の資料を読んでいるとオプションと言ってるけど、コードと何が違うの？
Ａ．ＤＨＣＰでは、やり取りする情報をオプションという形でサーバー・クライアント間で必要となる情報のやり取りをします。また各オプションではコードによりその意味が定義されています。
よってオプションはコード＋データ的な意味合いがありますが、結局は伝えるべき内容の話なので、だいたいは同じ意味を指しています。
例： オプション１２１≒コード１２１

# 参考文献

- [Support for option 121 (classless-static-routes) is needed](https://gitlab.isc.org/isc-projects/kea/-/issues/3074)
- [src/lib/dhcp/option_classless_static_route.cc](https://gitlab.isc.org/isc-projects/kea/-/blob/Kea-2.6.1/src/lib/dhcp/option_classless_static_route.cc?ref_type=tags#L58)
- [doc/examples/kea4/all-options.json](https://gitlab.isc.org/isc-projects/kea/-/blob/Kea-2.6.1/doc/examples/kea4/all-options.json#L1323)

ドキュメントが無いのなんで？（怒） `option-def` でオーバーライドできないというエラーが出るから…で調査始めて、更にコード見たら、コメントに書き方書いてあるのは助かったけど、そこで閉じてるのは大問題だと思うよ。
究極的には機能追加要望（イシュー）にしか情報が無いかと。検索でこの情報に到達できないの、よろしくない。

追記： `all-options.json` に全て書いてあるというツッコミを受けて調べたところ、`//` でコメントでＪＳＯＮ？と思いつつ、これをドキュメントと言い張るには…。

- [DHCPで静的経路の配布 (Classless Static Routes)](https://qiita.com/kyokuheki/items/ccf770c6475a236d2035)
- [DHCP サーバで static ルートを配る](https://qiita.com/jp_yen/items/bef91748a31aecb60d79)
- [RFC 3442 - The Classless Static Route Option for Dynamic Host Configuration Protocol (DHCP) version 4 日本語訳](https://tex2e.github.io/rfc-translater/html/rfc3442.html)