EdgeRouterでONU直結、ひかり電話あり
AsahiNetがようやくDS-liteに対応したので、重い腰をあげて自宅のIPv6回りを整えました。
EdgeRouterを使ってIPv6で遊ぶためには「ひかり電話」を契約した方が良いとのことで、ひかり電話を契約したものの、電話を使うわけではないのにでっかいホームゲートウェイがEdgeRouterとONUの間に挟まるのは気持ち悪いので、どうにかこのホームゲートウェイを排除してONUにEdgeRouterを直結できないのか、というのがこのエントリの趣旨です。
ホームゲートウェイありの場合
ホームゲートウェイを間に挟んで良い場合は、インターネットに色々と知見があって、以下二つのサイトを参考にすれば特にハマることはなく比較的簡単に設定することができる。
ただ、
実際に配布されるprefixの長さはひかり電話ありのケースでは60bitとなります。具体的には2xxx:xxxx:xxxx:xxx0::/60という形です。なお、HGWには上位のルーターから56bitのprefixが付与されており、HGWはそれを切り出して配下のルーターに60bitのprefixを付与しています
ということで、ホームゲートウェイを挟まなければ56bitのprefixを使えるんじゃないのか?という素朴な疑問が生まれます。
EdgeRouterをONU直結の場合
色々調べたところによると、結局ホームゲートウェイ自体も上位のルーターから DHCPv6-PD
を使ってprefixを委譲されているということがわかりました。ということは、ホームゲートウェイからprefixを委譲してもらうための以下の設定、
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 host-address '::1'
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 prefix-id ':0'
set interfaces ethernet eth0 dhcpv6-pd pd 0 interface switch0 service slaac
set interfaces ethernet eth0 dhcpv6-pd pd 0 prefix-length /60
set interfaces ethernet eth0 dhcpv6-pd prefix-only
の prefix-length
を /56
に設定を変えるだけでそのまま ONU に EdgeRouter を直結できるんじゃないか?と考えるわけです。
が、現実はなぜか厳しくて、上記の設定のままでは IPv4 PPPoE
は有効化されるものの、IPv6 の prefixがいつまで待っても降ってくる様子がありません。
DUID-LL
あーだこーだと設定を弄りつつ、無限に時間が溶けていきそうな予感の中、ようやく以下の記事を発見。
次にDUIDの生成を行う必要がある。DUIDはDHCPクライアントを識別するためのIDであり、通常はMACアドレスなどを元に自動で生成される。しかし、NGNが受け入れるDUIDは一般的な実装に比べて独特な仕様となっているので、今回は手動で生成を行わなければならない。まず、Jeffrey F. Blank氏が提供しているDUID生成スクリプト(wide_mkduid.pl)をダウンロードする。
NGN網はUNI仕様書に書かれているとおり、このDUID-LLフォーマットのみを受け入れる。
というわけで、これでした。EdgeRouterの場合以下のコマンドで、DUID-LLのフォーマットでDUIDを指定してやる必要があったのです。
set interfaces ethernet eth0 dhcpv6-pd duid 00:03:00:01:XX:XX:XX:XX:XX:XX
注) XX:XX:XX:XX:XX:XX
は対象インターフェースのMACアドレス
EdgeRouter X v2.0.9-hotfix.2 におけるバグ
絶対これだろ!と思って入れた設定が動かなかった時のガッカリ感は大きいものがありますよね!それがしかも設定ミスではなくソフトウェアのバグに起因するものだった場合、残念感もひとしおです。
とりあえず、dhcp6cのログを見ると、こんな感じになっています。
nobody@ubnt:/var/log$ cat dhcp6c.log
Aug/04/2021 04:07:39: get_duid: DUID file corrupted
Aug/04/2021 04:07:39: client6_init: failed to get a DUID
DUIDファイルが壊れてる、とのメッセージ。。。実際に設定されているDUIDを確認してみると、明らかに狂ってる。
yuanying@ubnt:/var/log$ show dhcpv6-pd duid
DUID 00:01:XX:XX:XX:XX:XX:XX::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
そして見つけたのがこれ。
--- /opt/vyatta/sbin/dhcpv6-pd-duid.pl.orig
— Hector Martin (@marcan42) May 22, 2020
+++ /opt/vyatta/sbin/dhcpv6-pd-duid.pl
@@ -44 +44 @@
- my $buf = pack("n", $len);
+ my $buf = pack("S", $len);
@@ -60 +60 @@
- my $buf = pack("n", $len);
+ my $buf = pack("S", $len);
/opt/vyatta/sbin/dhcpv6-pd-duid.pl
のバグでした。勘弁してもらいたい。