PR-600MIのDHCPv6仕様は、「次世代ネットワークインタフェース資料 (IP通信網) ― ユーザ・網インタフェース(UNI)― 本編 第1.0版 (2007年10月25日)」の付属資料B DHCP プロトコル (B.2 DHCPv6 プロトコル)に準拠していると考えられる。
DHCPv6のオプションIA_PD(25)とIA_PD Prefix(26)は、RFC3633に準拠していそうだ。RFC3633によれば、DHCPv6 メッセージには、複数のIA_PDを含められ、IA_PDには複数のIA_PD Prefixの包含が許されている。一つのDUIDで複数のPrefix委譲が許される事になる。UNIの仕様なのでPR-600MI HGWのLAN側DHCPv6に当てはまるか確かめる事にした。
複数のクライアントIDを使用してクライアントID分のprefix取得は、「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」で確認した。ISC dhclientは、一つのクライアントIDで複数のprefixを要求する事ができる。
マニュアルによれば、複数のprefixを要求する場合、要求する数だけ「-P」オプションを指定する。
(1)複数prefixテストスクリプト
引数にget, getm2, getm4を指定することで「-P」「-P -P」「-P -P -P -P」のprefix要求を実行する。rel, relm2, relm4でreleaseして終了を実行する。clientIDは、LLタイプで指定。
(2)実行結果
dhclient6mpd.sh getm2
solicit
IA_PDを2個メッセージで送出。IAIDは、「c5570b8f」「c5570b90」を指定。
advertise
IA_PDを1個返答。IAID「c5570b8f」でIA_PDに内包設定されたIA_PD Prefixは、「2409:10:XXXX:YY50::/60」。
request
IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」のIA_PDをもう一個欲しいと要求。
reply
IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」IA_PD Prefix「2409:10:XXXX:YY50::/60」を使えると応答してきた。同じprefixで1個目のpreferred lifetime=12600/valid lifetime=14400、2個目のpreferred lifetime=14400/valid lifetime=14400。RFC3633によればlifetimeは有効だが。PR-600MI大丈夫か?
「dhclient6mpd.sh relm2」を実行すると1個目のIAID「c5570b8f」は、リリースされる。2個目のIAID「c5570b90」は、「No Binding(3)」となる。PR-600MIは、IAID「c5570b8f」だけ委譲している状態。dhclientは、IAID「c5570b8f」とIAID「c5570b90」が委譲されている状態。リリース後、dhclient側でIAID「c5570b90」が委譲されている状態になる。
(3)その他
複数のIA_PDを含むDHCPv6メッセージを送ると棄却されず応答がある。PDの取得とリリースを繰り返すと高い確率で下記不具合が発生する
DHCPv6のオプションIA_PD(25)とIA_PD Prefix(26)は、RFC3633に準拠していそうだ。RFC3633によれば、DHCPv6 メッセージには、複数のIA_PDを含められ、IA_PDには複数のIA_PD Prefixの包含が許されている。一つのDUIDで複数のPrefix委譲が許される事になる。UNIの仕様なのでPR-600MI HGWのLAN側DHCPv6に当てはまるか確かめる事にした。
複数のクライアントIDを使用してクライアントID分のprefix取得は、「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」で確認した。ISC dhclientは、一つのクライアントIDで複数のprefixを要求する事ができる。
マニュアルによれば、複数のprefixを要求する場合、要求する数だけ「-P」オプションを指定する。
(1)複数prefixテストスクリプト
引数にget, getm2, getm4を指定することで「-P」「-P -P」「-P -P -P -P」のprefix要求を実行する。rel, relm2, relm4でreleaseして終了を実行する。
dhclient6mpd.sh
#!/bin/sh
PTH="/root/"
IF="enx3476c5570b8f"
## -P DHCPv6-PD request; ## -r for release; ## -x for NOT release
## Multiple Prefix Delegation request
get_DHCPv6_MPD4 () {
/sbin/dhclient -6 -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -x -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_MPD4 () {
/sbin/dhclient -6 -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -r -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
get_DHCPv6_MPD2 () {
/sbin/dhclient -6 -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -x -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_MPD2 () {
/sbin/dhclient -6 -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -r -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
get_DHCPv6_PD () {
/sbin/dhclient -6 -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -x -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_PD () {
/sbin/dhclient -6 -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
/sbin/dhclient -6 -r -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
##
DEVL="vaio1mpd"
case "$1" in
"getm4")
for i in $DEVL; do get_DHCPv6_MPD4 $i; done
;;
"relm4")
for i in $DEVL; do rel_DHCPv6_MPD4 $i; done
;;
"getm2")
for i in $DEVL; do get_DHCPv6_MPD2 $i; done
;;
"relm2")
for i in $DEVL; do rel_DHCPv6_MPD2 $i; done
;;
"get")
for i in $DEVL; do get_DHCPv6_PD $i; done
;;
"rel")
for i in $DEVL; do rel_DHCPv6_PD $i; done
;;
*)
echo "$0 getm4/relm4/getm2/relm2/get/rel";;
esac
vaio1mpd.conf
interface "enx3476c5570b8f" {
also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
send dhcp6.client-id 00:03:00:01:34:76:c5:57:0b:8f; #vaio LL
}
(2)実行結果
dhclient6mpd.sh getm2
solicit
IA_PDを2個メッセージで送出。IAIDは、「c5570b8f」「c5570b90」を指定。
advertise
IA_PDを1個返答。IAID「c5570b8f」でIA_PDに内包設定されたIA_PD Prefixは、「2409:10:XXXX:YY50::/60」。
request
IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」のIA_PDをもう一個欲しいと要求。
reply
IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」IA_PD Prefix「2409:10:XXXX:YY50::/60」を使えると応答してきた。同じprefixで1個目のpreferred lifetime=12600/valid lifetime=14400、2個目のpreferred lifetime=14400/valid lifetime=14400。RFC3633によればlifetimeは有効だが。PR-600MI大丈夫か?
「dhclient6mpd.sh relm2」を実行すると1個目のIAID「c5570b8f」は、リリースされる。2個目のIAID「c5570b90」は、「No Binding(3)」となる。PR-600MIは、IAID「c5570b8f」だけ委譲している状態。dhclientは、IAID「c5570b8f」とIAID「c5570b90」が委譲されている状態。リリース後、dhclient側でIAID「c5570b90」が委譲されている状態になる。
(3)その他
複数のIA_PDを含むDHCPv6メッセージを送ると棄却されず応答がある。PDの取得とリリースを繰り返すと高い確率で下記不具合が発生する
・DHCPv6の機能が停止する(応答がなくなる)
・「セキュリティログ(IPv6)」記録が止まり「0 entries」になる
・その他の機能は、動作している(不具合を認識できない)
・valid lifetime後にprefixが無効になり、prefix委譲されたネットワークでIPv6通信ができなくなる