ContainerlabでEVPN-VXLANの動きを確認する
タイトルのとおり、Containerlabで簡単なトポロジを作成し、EVPN-VXLANの動作を確認します。
今回はL2VPNの動作を確認します。
動作環境
Host
Host OS | Docker | Containerlab |
---|---|---|
Debian 11.11 | 24.07 | 0.54.2 |
Container
FRR |
---|
10.0 |
ネットワーク図
物理構成
EVPN-VXLANを使用するデータセンターネットワークはSpine-Leaf型のClosトポロジが一般的ですが、ここでは簡単化のために2ノードのみでネットワークを構成します。
N1とN2の間にあるsw01はパケットキャプチャ用にスイッチを挟んでいます。
論理構成
Underlayネットワーク(Loopbackアドレスを広報)はIS-IS。 OverlayネットワークはiBGPを使用しています。
UnderlayはOSPFでも大丈夫です。(疎通が取れれば良いので、もちろんStaticでも可)
検証環境構築
ファイルダウンロード
以下からダウンロードできます。
$ git clone https://github.com/polaris700/evpn-vxlan_containerlab.git
$ cd l2vpn
Docker image作成
ビルド例は以下になります。
以下、lab_frr:10.0.0のイメージを使用しています。
``` shell: host
$ docker build -t lab_frr:10.0.0 ../docker_images/frr/.
Containerlab上でネットワーク構築
Containerlabの設定ファイルは以下になります。
Docker、Containerlabのインストール方法は割愛します。
環境作成
$ sudo containerlab deploy -t clab.yaml
動作確認
パケットをキャプチャしてから動きを見れるように、sw01のbr0をDownさせています。
そのため、まだ疎通はありません。
はじめに、sw01でパケットをキャプチャします。
※ 別ターミナルで実施
$ docker exec -it clab-evpn-l2vpn-sw01 bash
sw01# tcpdump -i eth1 -w sw01-eth1.pcap
IF up ~ ログ取得までを以下コマンドで実行しています。
is-isで経路交換が完了するのを待つために、途中30秒待機しています。
$ sh check.sh
check.sh
node1=clab-evpn-l2vpn-N1
node2=clab-evpn-l2vpn-N2
sw1=clab-evpn-l2vpn-sw01
host1=clab-evpn-l2vpn-host01
dir=/tmp/sample1
mkidr $dir
# N2 IF up
echo "sw1 br0 up"
docker exec -it $sw1 ip link set dev br0 up
sleep 30
# Check status
echo "N1 ip addr" >$dir/n1_before.log
docker exec -it $node1 ip addr >>$dir/n1_before.log
echo "N1 show ip route" >>$dir/n1_before.log
docker exec -it $node1 vtysh -c "show ip route" >>$dir/n1_before.log
echo "N1 show bgp" >>$dir/n1_before.log
docker exec -it $node1 vtysh -c "show bgp summary" >>$dir/n1_before.log
echo "N1 show bgp l2vpn evpn" >>$dir/n1_before.log
docker exec -it $node1 vtysh -c "show bgp l2vpn evpn" >>$dir/n1_before.log
sleep 0.5
docker exec -it $host1 ping -c 5 192.168.0.2
echo "N1 ip addr" >$dir/n1_after.log
docker exec -it $node1 ip addr >>$dir/n1_after.log
echo "N1 show bgp" >>$dir/n1_after.log
docker exec -it $node1 vtysh -c "show bgp summary" >>$dir/n1_after.log
echo "N1 show bgp l2vpn evpn" >>$dir/n1_after.log
docker exec -it $node1 vtysh -c "show bgp l2vpn evpn" >>$dir/n1_after.log
echo "Copy the log file"
docker cp $node1:/var/log/frr/frr.log $dir/
キャプチャ取得
sw01のキャプチャを終了し、pcapファイルを取得します。
N1# ^C
N1# exit
$ docker cp clab-evpn-l2vpn-sw01:sw01-eth1.pcap /tmp/sample1/
パケット確認
いくつかピックアップしてパケットの確認をしていきます。
表示しているpcapファイルはsample1ディレクトリにおいています。
N1→N2 BGP Update 1 (No.54)
BGP Update messageでN1 br0のMACアドレスをN2に広報しています。(Route Type 2)
また、extended communityでencap方法がVXLANであることを知らせています。
こちらは Multicast用のIPv4アドレスを広報しています。(Route Type 3)
アドレスはN1 Loのアドレス 1.1.1.1/32になっています。
host01→host02 ARP Request (No.77)
host01から送信されたARPパケットはN1でVXLANにencapされています。
N1→N2 BGP Update 2 (No.81)
N1がhost01 eth1のMACアドレスを学習したので、BGP UpdateメッセージでN2にこのMACアドレスを広報しています。
まとめ
containerlabを使ってevpn-vxlanを確認するための簡単な検証環境を構築しました。
他パターンについてはこれから確認していこうと思います。
Discussion