プレフィックス変更時に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 !今回は以上です。それでは。
コメント
コメントを投稿