🐣

ContainerlabでEVPN-VXLANの動きを確認する

2025/02/13に公開

タイトルのとおり、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でも可)

検証環境構築

ファイルダウンロード

以下からダウンロードできます。
https://github.com/polaris700/evpn-vxlan_containerlab

$ 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のインストール方法は割愛します。

https://docs.docker.com/engine/install/

https://containerlab.dev/install/

環境作成

$ 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
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