プレフィックス変更時にkea-dhcp6.confを更新するスクリプトの雛型を書いてみました。大分手古摺ったのですが、例えば置換対象が、2111:2222:3333:4400ではなく、2111:2222::/56や2111:2222:3333::/56、2111:2222:333:400::/56のような変則的な場合などにも対応する必要があると想定したためです。
かなりゴチャッとしていますが、およそ以下の様になりました。
後は、サブルータに変更を反映する方法ですが、ULAにてsshを使えば、何とかなるかなといったところです。本来はkea-dhcpv6でreconfigureを通知し試験したいのですが、未実装なそうなので、仕方ありません。
また、GUAの配布はkea-dhcpv6だけで行っているので、GUA経路配布についてはOSPF6/RIPngだと端末/routerのdhcpcd再起動程度で行けそうです。
参考までにR0(ONU直下のルータ)のfrr.confは以下の様にしています。
かなりゴチャッとしていますが、およそ以下の様になりました。
#!/bin/sh
if [ $# -ne 3 ];then
echo "Usage: $0 OLD_GUA NEW_GUA TARGET_CONF";
exit 1
fi
replace_file()
{
if [ -e "$1" ]; then
if comp_file "$1" "$2"; then
echo comp_file "$1" "$2" same > /var/lib/dhcpcd/msgs.txt
rm -f "$2"
return 1
fi
fi
cat "$2" > "$1"
rm -f "$2"
return 0
}
OLD_GUA=$1
NEW_GUA=$2
TARGET_CONF=$3
# backup TARGET_CONF before processing.
FILENAME=$(basename $TARGET_CONF)
cp -a $TARGET_CONF /var/lib/dhcpcd/$FILENAME.`date '+%Y_%m_%d-%H:%M:%S'`
# copy $TARGET_CONF /var/lib/dhcpcd/$FILENAME
cp -a $TARGET_CONF /var/lib/dhcpcd/$FILENAME
TARGET_WRK=/var/lib/dhcpcd/$FILENAME
HEXTET_1ST_NEW=`echo $NEW_GUA | awk -F':' '{print $1}'`
HEXTET_1ST_OLD=`echo $OLD_GUA | awk -F':' '{print $1}'`
HEXTET_2ND_NEW=`echo $NEW_GUA | awk -F':' '{print $2}'`
HEXTET_2ND_OLD=`echo $OLD_GUA | awk -F':' '{print $2}'`
HEXTET_3RD_NEW=`echo $NEW_GUA | awk -F':' '{print $3}'`
HEXTET_3RD_OLD=`echo $OLD_GUA | awk -F':' '{print $3}'`
HEXTET_4TH_NEW=`echo $NEW_GUA | awk -F':' '{print $4}'`
HEXTET_4TH_OLD=`echo $OLD_GUA | awk -F':' '{print $4}'`
if [ "" = "$HEXTET_3RD_NEW" ];then
NEW=`echo $NEW_GUA | awk -F'::' '{print $1}'`:0:0:
else
NEW_GUA_48=`echo $NEW_GUA | awk -F":" '{print $1 ":" $2 ":" $3}'`
case $HEXTET_4TH_NEW in
????)
TMP=`echo $HEXTET_4TH_NEW | cut -c 1-2`
NEW=$NEW_GUA_48:$TMP
NEW_ZZ=00
;;
???)
TMP=`echo $HEXTET_4TH_NEW | cut -c 1`
NEW=$NEW_GUA_48:$TMP
NEW_ZZ=00
;;
"")
NEW=$NEW_GUA_48
NEW_ZZ=
;;
esac
fi
if [ "" = "$HEXTET_3RD_OLD" ]; then
OLD=`echo $OLD_GUA | awk -F'::' '{print $1}'`
else
OLD_GUA_48=`echo $OLD_GUA | awk -F":" '{print $1 ":" $2 ":" $3}'`
case $HEXTET_4TH_OLD in
????)
TMP=`echo $HEXTET_4TH_OLD | cut -c 1-2`
OLD=$OLD_GUA_48:$TMP
OLD_ZZ=00
;;
???)
TMP=`echo $HEXTET_4TH_OLD | cut -c 1`
OLD=$OLD_GUA_48:$TMP
OLD_ZZ=00
;;
"")
OLD=$OLD_GUA_48
OLD_ZZ=
;;
esac
fi
TMP2=:0:0:
TMP1=:0:
sed -i "s/$OLD$TMP2/$NEW/g" $TARGET_WRK
sed -i "s/$OLD$TMP1/$NEW/g" $TARGET_WRK
if [ "$HEXTET_1ST_OLD" = "$HEXTET_1ST_NEW" ] && [ "$HEXTET_2ND_OLD" = "$HEXTET_2ND_NEW" ];then
if [ "$HEXTET_3RD_OLD" != "" ]; then
if [ "$HEXTET_4TH_OLD" != "" ]; then
if [ "$HEXTET_3RD_NEW" != "" ];then
if [ "$HEXTET_4TH_NEW" != "" ];then
#echo DL1aa HEXTET_4TH_NEW:$HEXTET_4TH_NEW $OLD $NEW
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
else
#echo DL1ab HEXTET_4TH_NEW:$HEXTET_4TH_NEW $OLD $NEW
sed -i "s/$OLD/$NEW:/g" $TARGET_WRK
fi
else
#echo DL1b
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
fi
else
#echo DL2
# 2111:2222:3333:40:: to 2aaa:bbbb:cccc:dd40::
sed -i "s/$OLD:/$NEW/g" $TARGET_WRK
# correct 2aaa:bbbb:cccc:dd: to 2aaa:bbbb:cccc:dd00::
ZZ=00
sed -i "s/$NEW:/$NEW$ZZ::/g" $TARGET_WRK
fi
else
#echo DL3
sed -i "s/$OLD::/$NEW$NEW_ZZ::/g" $TARGET_WRK
fi
else
if [ "$HEXTET_3RD_OLD" = "" ];then
if [ "$HEXTET_4TH_OLD" = "" ];then
if [ "$HEXTET_3RD_NEW" != "" ];then
if [ "$HEXTET_4TH_NEW" != "" ];then
#echo DL4a
sed -i "s/$OLD$OLD_ZZ/$NEW$NEW_ZZ/g" $TARGET_WRK
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
else
#echo DL4b $OLD $NEW
sed -i "s/$OLD/$NEW:/g" $TARGET_WRK
# correct 2111:2222:3333110:: to 2111:2222:3333:110::
sed -i "s/$NEW/$NEW:/g" $TARGET_WRK
fi
else
#echo DL4c $OLD $NEW
sed -i "s/$OLD::/$NEW::/g" $TARGET_WRK
fi
else
#echo DL4d: $OLD_GUA $NEW_GUA
# 2111:2222:"":1600::/56 は 2111:2222:0:1600::/56でありここでは対象外のため nop
:
fi
else
if [ "$HEXTET_4TH_OLD" = "" ];then
if [ "$HEXTET_3RD_NEW" != "" ];then
if [ "$HEXTET_4TH_NEW" != "" ];then
#echo DL5a $OLD $NEW
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
# correct 2111:2222:3333:16:: to 2111:2222:3333:1600::
ZZ=00
sed -i "s/$NEW/$NEW$ZZ/g" $TARGET_WRK
# ocrrect 2111:2222:3333:1600:10:: 2111:2222:3333:1610::
sed -i "/$NEW$ZZ::/!s/$NEW$ZZ:/$NEW/g" $TARGET_WRK
else
#echo DL5b
# ex "2111:2222:0":10: to "2aaa:bbbb:cccc:dd"10:
sed -i "s/$HEXTET_1ST_OLD:$HEXTET_2ND_OLD:$HEXTET_3RD_OLD:/$NEW/g" $TARGET_WRK
# correct 2aaa:bbbb:cccc:dd: to 2aaa:bbbb:cccc:dd00::
ZZ=00
sed -i "s/$NEW:/$NEW$ZZ::/g" $TARGET_WRK
fi
else
#echo DL5c
# 2111:2222:3333 2aaa:bbbb
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
fi
else
#echo DL6
sed -i "s/$OLD$OLD_ZZ/$NEW$NEW_ZZ/g" $TARGET_WRK
sed -i "s/$OLD/$NEW/g" $TARGET_WRK
fi
fi
fi
sed -i "/duid\|hw-address/!s/:00:/:/g" $TARGET_WRK
sed -i "s/:0:0::/::/g" $TARGET_WRK
sed -i "s/:0::/::/g" $TARGET_WRK
sed -i "s/:::/::/g" $TARGET_WRK
if replace_file $TARGET_CONF "$TARGET_WRK"; then
chmod 644 $TARGET_CONF
fi
exit 0
ここまでできたので、dhcpcdでプレフィックスの変更を検出すれば、目的のプレフィックス変更時の対応までできそうかなと思います。また正常に動作しない場合でも、設定ファイルをバックアップするようにしたので、何かあっても対応できそうです。後は、サブルータに変更を反映する方法ですが、ULAにてsshを使えば、何とかなるかなといったところです。本来はkea-dhcpv6でreconfigureを通知し試験したいのですが、未実装なそうなので、仕方ありません。
また、GUAの配布はkea-dhcpv6だけで行っているので、GUA経路配布についてはOSPF6/RIPngだと端末/routerのdhcpcd再起動程度で行けそうです。
参考までにR0(ONU直下のルータ)のfrr.confは以下の様にしています。
! frr version 8.4.4 frr defaults traditional hostname gw01 log syslog service integrated-vtysh-config ! password xxxxxxxxxxxxxxxx ! interface enp1s0f0 ipv6 ospf6 area 0.0.0.0 exit ! router ospf redistribute kernel network 10.1.1.0/24 area 0.0.0.0 default-information originate exit ! router ospf6 redistribute kernel default-information originate exit ! access-list vty seq 5 permit 127.0.0.0/8 access-list vty seq 10 deny any ! line vty access-class vty exit ! endospf6 には直接IPv6アドレスを固定で設定していないので、アドレスの変更後、暫くすると変更されたアドレスが広報されるので/etc/frr/frr.confの変更はする必要が無いようにしています。ちなみに、r40というR0配下のvmルータ以下とですが、今のところ問題なく通信できています。静的ルート設定はルータからwifiルータへの経路以外は、使っていません。 また、r10という別のR0配下のvmルータがあるのですが、 r0(10.1.1.1) -- r10(10.1.1.10, vm) 間は OSPFで、 r10(10.1.10.1,vm) -- r11(10.1.10.11,vm) 間(r11以下も含む)はripv2/ripngにしているのですが、とりあえず動いたので r10の frr.confを貼っておきます。
frr version 8.4.4 frr defaults traditional hostname r10 log syslog informational service integrated-vtysh-config ! interface eth0 ipv6 ospf6 area 0.0.0.0 exit ! router rip network 10.1.10.0/24 network 10.1.1.0/24 network eth0 network eth1 redistribute connected redistribute ospf version 2 exit ! router ripng network eth0 network eth1 redistribute connected redistribute kernel redistribute ospf6 exit ! router ospf ospf router-id 0.0.0.10 redistribute connected redistribute rip network 10.1.1.0/24 area 0.0.0.0 exit ! router ospf6 ospf6 router-id 0.0.0.10 redistribute connected redistribute ripng exit !今回は以上です。それでは。
コメント
コメントを投稿