![見出し画像](https://assets.st-note.com/production/uploads/images/166577226/rectangle_large_type_2_a682a45d7f74baf2470c16645969820a.jpeg?width=1200)
余談 - 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技術を適用しない気持ちもわかるがちょっと寂しい。
※いやいや動くよ、あなたの設定が間違っているよ。という方はコメントお願いします
![](https://assets.st-note.com/img/1734743143-AGeOEUKqTslvnrdWa7QM2V16.png?width=1200)
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
そうするとエラーが出てしまう(悲しい)
![](https://assets.st-note.com/img/1734743910-p4F9350rtjOdgB8zWDnxcVMs.png?width=1200)
これって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!」と書いて作られた絵です笑