「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」の構成で、OpenWrtが「2409:10:XXXX:YY20::/60」と「2409:10:XXXX:YY30::/60」のprefixを委譲されるよう制御したが、「2409:10:XXXX:YY30::/60」をdebian10が委譲を受けるよう変更し、PR-600MI再起動時に受けるreconfigureメッセージを調べた。
(1)DHCPv6 Reconfigureメッセージ確認
2021年10月19日12時49分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/60/09/e5e240f9d06db403f9a1d8abd8bc3b90.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY40, YY30, YY20, YY10の順でYY10が最新
reconfigureメッセージは、YY10のNVR510にだけ発行される。OpenWrt, debian10, NVR500には発行されない。
2021年10月19日23時52分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/12/a0/ab8e02505cb75acfb51667c4f5388ce1.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY30, YY40, YY10の順でYY10が最新
reconfigureメッセージは、YY10のNVR510,YY40のNVR500,YY20のOpenWrtの順に発行され、Debian10には発行されない。
2021年11月1日10時41分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/5f/d2/cfaa18680589e3ce586ff7a6a83d657f.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY30, YY40, YY10の順でYY10が最新
reconfigureメッセージは、YY40のNVR500,YY10のNVR510の順に発行され、OpenWrt, debian10には発行されない。
2021年11月19日9時25分リブート時のreconfigureメッセージ
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY10, YY40, YY30の順でYY30が最新
reconfigureメッセージは、どのデバイスにも発行されなかった。
確認結果
PR-600MIのPDデータ変更を「DHCPv6 reconfigureメッセージ」だけで認識することが出来ない。
定期的に委譲されたprefixを確認し、変更されていたら再取得を行い、「DHCPv6 reconfigureメッセージ」を受けたら直ちにprefixの再取得を行う。
定期的確認は、cronを使い、reconfigureメッセージ確認は、syslogを集約し監視する事にする。
(2)DHCPv6-PDの取得制御
RebindAllISCスクリプト
「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」の「RebindAllISC」に、必要な装置だけreleaseとrebindを行うように変更。
![](https://blogimg.goo.ne.jp/user_image/38/ad/e9f0bbf36e3079bab4229b2373548160.png)
試行の結果、いくつかの不具合が発生した
・PR-600MIが委譲していないprefixに対してrelease実行をしないと指定した装置が期待しないprefix委譲を受ける不具合
・debian10でdhclientが二重に起動する不具合(releaseが不完全)
・OpenWrtのodhcp6cがprefix委譲を受ける前にdebian10がprefixを取得してしまいprefix順序が期待値にならない不具合
(あ)期待しないprefix委譲を受ける不具合対策
15行目から23行目で装置に委譲されるprefixが指定したprefixと一致しない場合は(委譲していない場合も含む)、releaseを実行するように変更
(い)dhclientが二重に起動する不具合対策
33行目から40行目でrelease後に、dhclientプロセスが終了していなければ、終了させる
(う)prefix順序が期待値にならない不具合対策
OpenWrtでは、「odhcp6c」がprefix delegationを担っている。で起動される。
clientidのdefault値は、LLTなのでLL指定する(PR-600MI指定)。LLTでもprefix delegationされるがタイム値が不明となるため、他デバイスからのreleaseが困難になる(OpenWrtは、default固定値。確か000000=2000/1/1 00:00:00UTCだったような・・・)。
「dhcpv6.script」の最後で「/etc/odhcp6c.user」ファイルをincludeするので、odhcp6cの状態をログに記録するよう設定しているPR-600MIが再起動するとreconfigureメッセージを送る(場合がある)。
「odhcp6c」は、reconfigureメッセージを受けると
・renewを行う(結果:status code 3 [NoBinding])
・rebindを行う(結果:status code 4 [NotOnLink])
・solicit/requestでprefix delegation取得を行う(prefixが取得されるとifdown/ifupが行われ処理時間が掛かる。WZR-HP-G300NHで約14秒位)
起動されている「odhcp6c」にprefixの再取得をさせるには、「SIGUSR1」を送る(OpenWrtがPR-600MIからprefixを得ている場合は、renewが成功する)。シグナル送信は、odhcp6cのprefix取得を待たない。
シグナル発行後、odhcp6cがrebindしdhcpv6.scriptでbound処理を実行し、odhcp6c.userでboundログを記録する。boundログを監視し、prefix取得を待つスクリプトを使い同期を取る事にした。
OpenWrtの/rootにを配置する。
「システム」「バックアップ/ファームウェア更新」「設定」の設定リストに「/root/odhcp6c-bound」と「/etc/odhcp6c.user」を設定し、再起動時の設定消失を防ぐ。
RebindAllISCの54行目から58行目を変更する
(1)DHCPv6 Reconfigureメッセージ確認
2021年10月19日12時49分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/60/09/e5e240f9d06db403f9a1d8abd8bc3b90.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY40, YY30, YY20, YY10の順でYY10が最新
reconfigureメッセージは、YY10のNVR510にだけ発行される。OpenWrt, debian10, NVR500には発行されない。
2021年10月19日23時52分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/12/a0/ab8e02505cb75acfb51667c4f5388ce1.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY30, YY40, YY10の順でYY10が最新
reconfigureメッセージは、YY10のNVR510,YY40のNVR500,YY20のOpenWrtの順に発行され、Debian10には発行されない。
2021年11月1日10時41分リブート時のreconfigureメッセージ
![](https://blogimg.goo.ne.jp/user_image/5f/d2/cfaa18680589e3ce586ff7a6a83d657f.png)
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY30, YY40, YY10の順でYY10が最新
reconfigureメッセージは、YY40のNVR500,YY10のNVR510の順に発行され、OpenWrt, debian10には発行されない。
2021年11月19日9時25分リブート時のreconfigureメッセージ
PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY20, YY10, YY40, YY30の順でYY30が最新
reconfigureメッセージは、どのデバイスにも発行されなかった。
確認結果
PR-600MIのPDデータ変更を「DHCPv6 reconfigureメッセージ」だけで認識することが出来ない。
定期的に委譲されたprefixを確認し、変更されていたら再取得を行い、「DHCPv6 reconfigureメッセージ」を受けたら直ちにprefixの再取得を行う。
定期的確認は、cronを使い、reconfigureメッセージ確認は、syslogを集約し監視する事にする。
(2)DHCPv6-PDの取得制御
RebindAllISCスクリプト
「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」の「RebindAllISC」に、必要な装置だけreleaseとrebindを行うように変更。
![](https://blogimg.goo.ne.jp/user_image/38/ad/e9f0bbf36e3079bab4229b2373548160.png)
試行の結果、いくつかの不具合が発生した
・PR-600MIが委譲していないprefixに対してrelease実行をしないと指定した装置が期待しないprefix委譲を受ける不具合
・debian10でdhclientが二重に起動する不具合(releaseが不完全)
・OpenWrtのodhcp6cがprefix委譲を受ける前にdebian10がprefixを取得してしまいprefix順序が期待値にならない不具合
(あ)期待しないprefix委譲を受ける不具合対策
15行目から23行目で装置に委譲されるprefixが指定したprefixと一致しない場合は(委譲していない場合も含む)、releaseを実行するように変更
for i in $order
do
if [ "${curdevprefix[${i}]}" != "${deviceprefix[${i}]}" ]; then
releasedevice="$releasedevice ${devicename[${i}]}"
rebinddevice="$rebinddevice ${devicename[${i}]}"
releasedevice=${releasedevice## }; rebinddevice=${rebinddevice## }
fi
done
(い)dhclientが二重に起動する不具合対策
33行目から40行目でrelease後に、dhclientプロセスが終了していなければ、終了させる
for CL in $CID; do
if [ "$CL" = "$ID3" ]; then
if [ -n "/run/dhclient6.$IF.pid" ]; then
DHCLPID=`cat "/run/dhclient6.$IF.pid"`
else
DHCLPID="65536"
fi
$DHCPV6CL -r -pf "/run/dhclient6.$IF.pid" -lf "/var/lib/dhcp/dhclient6.$IF.leases" $IF
if ps -p "$DHCLPID" | grep dhclient > /dev/null ; then
kill "$DHCLPID"
fi
else
$DHCPV6CL -cf "$PTH/$CL.conf" -pf "$PTH/$CL.pid" -lf "$PTH/$CL.$IF.leases" $IF
$DHCPV6CL -r -cf "$PTH/$CL.conf" -pf "$PTH/$CL.pid" -lf "$PTH/$CL.$IF.leases" $IF
fi
done
(う)prefix順序が期待値にならない不具合対策
OpenWrtでは、「odhcp6c」がprefix delegationを担っている。
/etc/config/network
config interface 'wan6'
option ifname 'eth1'
option proto 'dhcpv6'
option reqaddress 'try'
option reqprefix 'auto'
option clientid '00030001001d73344556'
-----------
odhcp6c -s /lib/netfid/dhcpv6.script -Ntry -P0 -t120 -c00030001001d73344556 eth1
clientidのdefault値は、LLTなのでLL指定する(PR-600MI指定)。LLTでもprefix delegationされるがタイム値が不明となるため、他デバイスからのreleaseが困難になる(OpenWrtは、default固定値。確か000000=2000/1/1 00:00:00UTCだったような・・・)。
「dhcpv6.script」の最後で「/etc/odhcp6c.user」ファイルをincludeするので、odhcp6cの状態をログに記録するよう設定している
/etc/odhcp6c.user
case "$2" in
bound|updated|unbound|rebound|informed)
logger -t "odhcp6c" -s "$2:$PREFIXES:$OPTION_1"
;;
*)
logger -t "odhcp6c" -s "$2"
;;
esac
「odhcp6c」は、reconfigureメッセージを受けると
・renewを行う(結果:status code 3 [NoBinding])
・rebindを行う(結果:status code 4 [NotOnLink])
・solicit/requestでprefix delegation取得を行う(prefixが取得されるとifdown/ifupが行われ処理時間が掛かる。WZR-HP-G300NHで約14秒位)
起動されている「odhcp6c」にprefixの再取得をさせるには、「SIGUSR1」を送る(OpenWrtがPR-600MIからprefixを得ている場合は、renewが成功する)。
XID=`ssh root@openwrt.familyname "ps | grep ' odhcp6c ' | grep -v grep | sed -e 's/^ *\([0-9]*\) .*$/\1/'"`
ssh root@openwrt.familyname kill -sigusr1 $XID
シグナル発行後、odhcp6cがrebindしdhcpv6.scriptでbound処理を実行し、odhcp6c.userでboundログを記録する。boundログを監視し、prefix取得を待つスクリプトを使い同期を取る事にした。
OpenWrtの/rootに
odhcp6c-bound
#!/bin/sh
kill -sigusr1 `ps | grep ' odhcp6c ' | grep -v grep | sed -e 's/^ *\([0-9]*\) .*$/\1/'`
TMP=`logread -l1 -e '^odhcp6c:' | grep ' updated:\| bound:' | sed -e 's/^.* \(.*:[0-9:/]*\),.*$/\1/'`
WL=0; CN=0
while [ -z ${TMP} ]; do
if [ ${CN} -gt 20 ]; then break; fi
sleep 1
CN=$((CN += 1))
if [ ${WL} -lt 10 ]; then WL=$((WL += 1)); fi
echo -n "."
TMP=`logread -l${WL} -e '^odhcp6c:' | grep ' updated:\| bound:' | sed -e 's/^.* \(.*:[0-9:/]*\),.*$/\1/'`
done
echo "done!"
「システム」「バックアップ/ファームウェア更新」「設定」の設定リストに「/root/odhcp6c-bound」と「/etc/odhcp6c.user」を設定し、再起動時の設定消失を防ぐ。
RebindAllISCの54行目から58行目を変更する
---- before ----
# rebind OpenWrt for #2
if echo -n $CID | grep "$ID2" >/dev/null; then
ssh root@openwrt-wan.familyname ubus call network.interface.wan6 renew
logger -s -t $0 "Bind #2($ID2)"
fi
---- after ----
# rebind OpenWrt for #2
if echo -n $CID | grep "$ID2" >/dev/null; then
ssh root@openwrt-wan.familyname /root/odhcp6c-bound
logger -s -t $0 "Bind #2($ID2)"
fi