見出し画像

余談 - 6PEとか、Clab用スクリプトとか


6PEが動かない件

containerlab + FRRoutingでMPLS L3VPNの記事でipv4 single stack上でIPv4 L3VPNとIPv6 L3VPNを作ろうとしていました。
しかし、私の環境※下記だと6PE(RFC 4798)は動かないみたい。

pe1# sh ver
FRRouting 10.3-dev_git20241208 (pe1) on Linux(6.8.0-49-generic).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

SR-MPLS/SRv6がトレンドの今(?)、IPv4 MPLS上でIPv6通信を行うための、6PE技術を適用しない気持ちもわかるがちょっと寂しい。
※いやいや動くよ、あなたの設定が間違っているよ。という方はコメントお願いします

IPv4 L3VPNは動く
ce1は172.16.0.1/32でce2が172.16.0.2/32、ce1のloからce2のloには疎通性がある

MPLS IPv4 L3VPNの状態で、pe1とpe2に以下設定を追加

router bgp 64512
 address-family ipv6 vpn
  neighbor ibgp_v4 activate
 exit-address-family
exit
!
router bgp 64512 vrf cust1
 !
 address-family ipv6 unicast
  redistribute ospf6
  label vpn export auto
  rd vpn export 64512:10
  rt vpn both 64512:110
  export vpn
  import vpn
 exit-address-family
exit
!
router ospf6 vrf cust1
 ospf6 router-id 11.11.11.11
 log-adjacency-changes detail
 default-information originate always metric-type 1
exit

そうするとエラーが出てしまう(悲しい)

zebra does not support V6 routing with v4 nexthops

これって6PE動かないってことだよね?(ぴえん)
生ログは以下

2024-12-21 01:16:31.261 [ERR!] bgpd: [VHWDJ-C5186][EC 33554453] 3.3.3.3: No local IPv6 address, and zebra does not support V6 routing with v4 nexthops, BGP routing for V6 will not work
2024-12-21 01:16:31.261 [ERR!] bgpd: [MVZKX-EG443][EC 33554452] bgp_process_packet: BGP OPEN receipt failed for peer: 3.3.3.3
2024-12-21 01:16:33.278 [ERR!] bgpd: [VHWDJ-C5186][EC 33554453] 3.3.3.3: No local IPv6 address, and zebra does not support V6 routing with v4 nexthops, BGP routing for V6 will not work
2024-12-21 01:16:33.278 [ERR!] bgpd: [MVZKX-EG443][EC 33554452] bgp_process_packet: BGP OPEN receipt failed for peer: 3.3.3.3
2024-12-21 01:17:35.263 [ERR!] bgpd: [VHWDJ-C5186][EC 33554453] 3.3.3.3: No local IPv6 address, and zebra does not support V6 routing with v4 nexthops, BGP routing for V6 will not work
2024-12-21 01:17:35.263 [ERR!] bgpd: [MVZKX-EG443][EC 33554452] bgp_process_packet: BGP OPEN receipt failed for peer: 3.3.3.3
2024-12-21 01:17:37.281 [ERR!] bgpd: [VHWDJ-C5186][EC 33554453] 3.3.3.3: No local IPv6 address, and zebra does not support V6 routing with v4 nexthops, BGP routing for V6 will not work
2024-12-21 01:17:37.281 [ERR!] bgpd: [MVZKX-EG443][EC 33554452] bgp_process_packet: BGP OPEN receipt failed for peer: 3.3.3.3

ということで、FRRoutingでIPv6 MPLSを動かすにはMPLSノード間でipv6のアンダー例を構築し、ipv6でLDPも動かす必要がある。(面倒くさい)
ということで、containerlab + FRRoutingでMPLS L3VPNのstep2が遅れた理由をわざわざ書いてみた(6PEで実現させたかった)。

FRRouting用Shell Script

FRRoutingのlogファイルとかconfigファイルとか

bindsでlogファイルを指定すると、syslogが母艦側に記録される(便利)。
同様にconfigファイルも。
毎回手作業で作るのが面倒なので以下の通りスクリプト化したよ。

#!/bin/bash

cat topology.yml | grep "\.log" | awk '{print $2}' | awk -F":" '{print $1}' | while read l; do
        touch ${l}
        chmod 666 ${l}
done

cat topology.yml | grep "\.conf" | awk '{print $2}' | awk -F":" '{print $1}' | while read l; do
        touch ${l}
        chmod 666 ${l}
        cat <<EOF >> ${l}
log file /var/log/frr.log
log stdout notifications
ipv6 forwarding
EOF
done

topology.ymlはこんな感じで、topologyファイルからlogファイルとconfigファイルを作ってくれるよ。

name: mpls4

topology:
  nodes:
    ce1:
      kind: linux
      image: quay.io/frrouting/frr:master
      binds:
        - ./daemons:/etc/frr/daemons
        - ./logs/ce1.log:/var/log/frr.log
        - ./confs/ce1.conf:/etc/frr/frr.conf

MPLS用Shell Script

FRRoutingはLinux上で動いているのでMPLS動かすならkernelパラメータを変更する必要がある。
合わせてloopbackやinterfaceにVRFを適用する場合、にLinuxのipコマンドを使う必要がある。
面倒くさいのでスクリプト化したよ。
※スクリプト実行用のためにパラメータ設定ファイルも作成してるよ。

#!/bin/bash

lab=`ls | grep ^clab`

# Management VRFの作成
prov_cmds[0]="ip link add mgmt type vrf table 10"
prov_cmds[1]="ip link set dev mgmt up"
prov_cmds[2]="ip link set dev eth0 master mgmt"
cat ./topology.yml | grep ^"    [a-z]" | tr -d ":" | while read line; do
        for cmd in "${prov_cmds[@]}"; do
                sudo docker exec ${lab}-${line} bash -c "${cmd}"
        done
done

# Customer VRFの作成
cat ./router_prov_confs/vrf.conf | while read line; do
        host=`echo ${line} | awk -F"," '{print $1}'`
        lo_if_name=`echo ${line} | awk -F"," '{print $2}'`
        vrf_name=`echo ${line} | awk -F"," '{print $3}'`
        vrf_table=`echo ${line} | awk -F"," '{print $4}'`
        sudo docker exec ${lab}-${host} bash -c "ip link add ${vrf_name} type vrf table ${vrf_table}"
        sudo docker exec ${lab}-${host} bash -c "ip link set dev ${vrf_name} up"
        sudo docker exec ${lab}-${host} bash -c "ip link add ${lo_if_name} type dummy"
        sudo docker exec ${lab}-${host} bash -c "ip link set dev ${lo_if_name} master ${vrf_name}"
        sudo docker exec ${lab}-${host} bash -c "ip link set dev ${lo_if_name} up"
done

# Ethernet Interface に VRF を適用
cat ./router_prov_confs/vrf_if.conf | while read line; do
        host=`echo ${line} | awk -F"," '{print $1}'`
        if_name=`echo ${line} | awk -F"," '{print $2}'`
        vrf_name=`echo ${line} | awk -F"," '{print $3}'`
        sudo docker exec ${lab}-${host} bash -c "ip link set dev ${if_name} master ${vrf_name}"
done

# MPLSを動かす準備
mpls_cmds[0]="sysctl -w net.ipv4.ip_forward=1"
mpls_cmds[1]="systcl -w net.ipv4.conf.all.rp_filter=0"
mpls_cmds[2]="sysctl -w net.ipv4.conf.lo.rp_filter=0"
mpls_cmds[3]="sysctl -w net.mpls.conf.lo.input=1"
mpls_cmds[4]="sysctl -w net.mpls.platform_labels=1048575"
cat ./router_prov_confs/mpls.conf | while read line; do
        host=`echo ${line} | awk -F"," '{print $1}'`
        if_name=`echo ${line} | awk -F"," '{print $2}'`
        for cmd in "${mpls_cmds[@]}"; do
                sudo docker exec ${lab}-${host} bash -c "${cmd}"
        done
        sudo docker exec ${lab}-${host} bash -c "sysctl -w net.mpls.conf.${if_name}.input=1"
done

ラボを起動させたら、上記スクリプトを実行するとvrf mgmtが作られてeth0に適用される。
./params配下の各種パラメータに応じて、VRFやインタフェースの作成、カーネルパラメータの変更をしてくれる。
便利。

最後に

言い訳もできたので、続きを書いていきます。
この記事の画像はマイクロソフトデザイナーで「OSSで実装!MPBGPで実現する6PE!」と書いて作られた絵です笑


いいなと思ったら応援しよう!