rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

ひかり電話 HGW PR-600MI DHCPv6-PDサーバーが再起動時に割り当てるPrefix

2021-12-17 11:00:00 | ひかり電話
ひかり電話 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メッセージ

PR-600MIのPrefix-PD表示は、2409:10:XXXX:YY40, YY30, YY20, YY10の順でYY10が最新
reconfigureメッセージは、YY10のNVR510にだけ発行される。OpenWrt, debian10, NVR500には発行されない。

2021年10月19日23時52分リブート時のreconfigureメッセージ

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メッセージ

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を行うように変更。

試行の結果、いくつかの不具合が発生した
・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
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が成功する)。
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のprefix取得を待たない。
シグナル発行後、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



 


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Synology DS-216JからDS-220J... | トップ | ヤマハ NVR510 / 500のsyslog... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

ひかり電話」カテゴリの最新記事