SONiCのRoadmap Planningによると、バージョン202012よりEVPN/VXLANが使える事になっている為、前回の記事にて使用したバージョン202106でEVPN/VXLANを動かしてみた。
以下のリンク先にて、仮想アプライアンス版のSONiCではVXLANのコマンドが打てないという残念なお知らせを見てしまったものの、現段階での最新バージョン202106でVXLAN周りのコマンドを試しに打ってみたら、弾かれる事無く投入出来てしまった。
ひょっとしたら商用版だけでなく仮想アプライアンス版でもVXLANが動作するのかも...と期待し、VXLANでよく見られるBGP/EVPN/VXLANな組み合わせでVXLANを試してみた。
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning Roadmap Planning
https://qiita.com/masru0714/items/71f2d8e0efa4c28f991d SONiCとVXLAN
VXLANとは?
Virtual eXtensible Local Area Networkの略称。L3ネットワークの上に論理的なL2ネットワークを構築する為のトンネリングプロトコルで、BGP等で経路が制御されているL3ネットワーク(アンダーレイ)上にVXLANによるトンネリングを構築し(オーバーレイ)、オーバーレイ上の各ネットワークがL2スイッチで接続されているような感じで通信をする。
データセンタ内のネットワークにて使用される。
関連する仕様はRFC7348(Virtual eXtensible Local Area Network (VXLAN))となっている。
従来のVLANでは最大4094個のL2ネットワークを扱う事が可能だが、VXLANでは更に多い約1600万ものL2ネットワークを扱う事が可能である。
Edge-coreやNVIDIA等が出している商用版のSONiCでは本家版よりも早く、VXLANの設定が可能となっている。
当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.24
ゲストOS:SONiC 202106.32193-d7f5dded1
ゲストOS:Cumulus VX 4.4.0
構成
SONiCはデプロイ完了の時点で、IPアドレスやBGP等の設定が既に入っていた状態だった為、BGPの設定は既存から大幅に設定を修正。
Cumulus VX側はSONiCの設定に合わせるような内容でIPアドレスとBGPを設定。
SONiCおよびCumulus Linuxの導入
SONiCの最新バージョン202106は以下のリンク先よりダウンロード可能。
ただし、開発者が個人的に立ち上げたサイトである為、永続的にダウンロードが可能であるかに関しては不明。
https://sonic.software/
ダウンロード後、.imgファイルをNHCというツールで.vhdファイルに変換し、VBoxManage.exeコマンドでUUIDを付与する必要が有る。
SONiCのデプロイに関しては、以下の記事をご参照ください。
https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
Cumulus VXのデプロイに関しては、下記の動画をご参照ください。
https://www.youtube.com/watch?v=9AYYhBcDm1Q how to install Cumulus VX on Virtual Box
SONiC~Cumulus VX間を仮想的に1本づつ仮想的なケーブルで接続させるには、ネットワークアダプタの内部ネットワークの設定を変更する必要が有る。
設定変更の方法に関しては以下の記事をご参照ください。
https://debslink.hatenadiary.jp/entry/20201217/1608182777
Cumulus Linux (Cumulus VX)の設定内容
インタフェースやシステム周りはNCLUコマンド net commitコマンドにTabキーでオプションを探しながら投入し、net config saveコマンドで設定内容を保存。
BGPはvtyshモードに入りCisco IOSライクなコマンドで設定を投入し、write memoryコマンドで設定内容を保存。
Cumulus LinuxはSONiCとは異なり、再起動しても設定が残っている。
以下は/etc/network/interfacesファイルの内容。
NCLUコマンドで投入したインタフェース周りの設定が書かれている。
link-speedとmtuの値はSONiCに合わせている。
# The loopback network interface auto lo iface lo inet loopback # The primary network interface address 10.1.1.98/32 vxlan-local-tunnelip 10.1.1.98 # The primary network interface auto eth0 iface eth0 address 192.168.3.112/24 vrf mgmt auto swp1 iface swp1 address 192.168.10.1/31 alias DEV=jpmtkvmsw99 IF=eth0 link-speed 40000 mtu 9216 auto swp2 iface swp2 bridge-access 100 auto bridge iface bridge bridge-ports swp2 vxlan1000 bridge-vids 100 bridge-vlan-aware yes auto mgmt iface mgmt address 127.0.0.1/8 address ::1/128 vrf-table auto auto vlan100 iface vlan100 address 192.168.100.98/24 vlan-id 100 vlan-raw-device bridge auto vxlan1000 iface vxlan1000 bridge-access 100 mstpctl-bpduguard yes mstpctl-portbpdufilter yes mtu 1500 vxlan-id 1000 vxlan-local-tunnelip 10.1.1.98
以下は/etc/frr/frr.confファイルの内容。
vtyshモードに入り、Cisco IOSライクなコマンドで設定投入し、writeコマンドで設定内容を保存。
vtyshモードから抜けない状態でshow runコマンドを叩くと、以下が出力される。
frr version 7.5+cl4.4.0u4 frr defaults datacenter hostname jpmtkvmsw98 log syslog informational service integrated-vtysh-config ! ip route 10.1.1.99/32 192.168.10.0 ip route 192.168.100.99/32 192.168.10.0 ! router bgp 65098 bgp router-id 10.1.1.98 no bgp default ipv4-unicast bgp graceful-restart restart-time 240 bgp graceful-restart bgp graceful-restart preserve-fw-state bgp bestpath as-path multipath-relax neighbor 10.1.1.99 remote-as 65099 neighbor 10.1.1.99 description jpmtkvmsw99-lo neighbor 192.168.10.0 remote-as 65099 neighbor 192.168.10.0 description jpmtkvmsw99-swp1 ! address-family ipv4 unicast network 10.1.1.98/32 neighbor 10.1.1.99 activate neighbor 192.168.10.0 activate exit-address-family ! address-family l2vpn evpn neighbor 10.1.1.99 activate neighbor 192.168.10.0 activate advertise-all-vni exit-address-family ! line vty !
SONiCの設定内容
以下は/etc/sonic/config_db.jsonファイルの内容。前回の記事(SONiCとCumulus LinuxでBGP unnumbered)の設定内容を流用したが、今回のBGPの設定はBGP Unnumberedではない為にconfig_db.jsonファイルを直接編集している。
VXLANの設定に関しては、何とconfig vxlanコマンドが投入出来た。
先にVXLANの設定を試みた方々によると前のバージョンではconfig vxlanコマンドが打てなかったとの事なので、大きな前進である。
商用版のSONiCではVXLANの設定が可能になっており、Edge-Core NetworksやMacnica等ベンダのサイトにてSONiCのVXLAN設定方法が紹介されていたものの、仮想アプライアンス版ではそれだけでは足りないようで、Cumulus Linuxの内容も参照し設定投入した。
https://support.edge-core.com/hc/en-us/articles/900002720523-EVPN-L2-VXLAN
https://qiita.com/masru0714/items/71f2d8e0efa4c28f991d
https://www.macnica.co.jp/business/semiconductor/articles/basic/136390/
結局、以下の内容で落ち着いた(?)
尚、表示されていない設定内容に関しては全く手を付けていない為、割愛している。
{ "BGP_NEIGHBOR": { "192.168.10.1": { "asn": "65098", "holdtime": "180", "keepalive": "60", "local_addr": "192.168.10.0", "name": "jpmtkvmsw98-swp1", "nhopself": "0", "rrclient": "0" } }, : }, "DEVICE_METADATA": { "localhost": { "bgp_asn": "65099", "buffer_model": "traditional", "default_bgp_status": "up", "default_pfcwd_status": "disable", "hostname": "jpmtkvmsw99", "hwsku": "Force10-S6000", "mac": "52:54:00:12:34:56", "platform": "x86_64-kvm_x86_64-r0", "type": "SpineRouter" } }, : "INTERFACE": { "Ethernet0": {}, "Ethernet0|192.168.10.0/31": {}, "Ethernet4": {}, "Ethernet4|": {}, : "LOOPBACK_INTERFACE": { "Loopback0": {}, "Loopback0|10.1.1.99/32": {} }, "MGMT_INTERFACE": { "eth0|192.168.3.247/24": {} }, : "VLAN": { "Vlan100": { "vlanid": "100" } }, "VLAN_INTERFACE": { "Vlan100": {}, "Vlan100|192.168.100.99/24": {} }, "VLAN_MEMBER": { "Vlan100|Ethernet4": { "tagging_mode": "untagged" } }, "VXLAN_EVPN_NVO": { "nvo": { "source_vtep": "vtep" } }, "VXLAN_TUNNEL": { "vtep": { "src_ip": "10.1.1.99" } }, "VXLAN_TUNNEL_MAP": { "vtep|map_1000_Vlan100": { "vlan": "Vlan100", "vni": "1000" } } }
以下は、show running-configの出力内容。
Cumulus VXと同様にvtyshモードに入り、Cisco IOSライクなコマンドで設定投入する。
BGPやルートマップの設定が既に入っていた為、不要な設定や修正すべき設定は一旦削除し修正。writeコマンドで設定内容が反映される為、/etc/sonic/frr/bgpd.confや/etc/sonic/frr/zebra.confファイルは直接編集していない。
一番下にPrefix Listが2行出力されているが、これらは自動で投入されたものである。
仮想アプライアンス版の場合、vtyshモードで投入した設定内容は、SONiCを再起動させると殆どが元の設定に戻るので注意。
frr version 7.5.1-sonic frr defaults traditional hostname jpmtkvmsw99 log syslog informational log facility local4 agentx no service integrated-vtysh-config ! password zebra enable password zebra ! ip route 0.0.0.0/0 200 ip route 10.1.1.98/32 192.168.10.1 ip route 192.168.100.98/32 192.168.10.1 ! interface eth0 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra ! interface eth4 ipv6 nd ra-interval 10 no ipv6 nd suppress-ra ! router bgp 65099 bgp router-id 10.1.1.99 bgp log-neighbor-changes no bgp ebgp-requires-policy no bgp default ipv4-unicast bgp graceful-restart restart-time 240 bgp graceful-restart bgp graceful-restart preserve-fw-state bgp bestpath as-path multipath-relax neighbor 10.1.1.98 remote-as 65098 neighbor 10.1.1.98 description jpmtkvmsw98-lo neighbor 192.168.10.1 remote-as 65098 neighbor 192.168.10.1 description jpmtkvmsw98-swp1 ! address-family ipv4 unicast network 10.1.1.99/32 neighbor 10.1.1.98 activate neighbor 192.168.10.1 activate maximum-paths 64 exit-address-family ! address-family l2vpn evpn neighbor 10.1.1.98 activate neighbor 192.168.10.1 activate advertise-all-vni exit-address-family ! ip prefix-list PL_LoopbackV4 seq 5 permit 10.1.1.99/32 ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 5 permit 192.168.100.0/24 ! line vty !
BGPテーブルの内容の確認
VXLANおよびEVPNの設定を終えたところで、BGPテーブルの内容を確認。
前回とは異なり今回は挙動が不安定で、設定投入後5分前後はステータスがIdleに戻ったりピアを張ったり...を繰り返す。
Cumulus Linux同士で設定すると即座にBGPピアを張ってその後は落ちる事が無い為、動作が不安定な原因はSONiC側かと思われる。
以下はCumulus Linux側のBGPピアの情報の確認。
jpmtkvmsw98# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0 BGP table version 48 RIB entries 3, using 600 bytes of memory Peers 2, using 46 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt jpmtkvmsw99(10.1.1.99) 4 65099 830 807 0 0 0 00:22:57 1 2 jpmtkvmsw99(192.168.10.0) 4 65099 1744 2254 0 0 0 00:22:58 1 2 Total number of neighbors 2
以下はSONiC側のBGPピアの情報の確認。
前回とは異なり今回は設定投入直後は不安定で、Stateが時々Idleに戻る。
Cumulus LinuxとSONiCはBGPピアを確立している時間がほぼ同じであるにも関わらず、MsgRcvdとMsgSentの値に大きな差分が有る。何故だろう...
jpmtkvmsw99# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0 BGP table version 8 RIB entries 3, using 576 bytes of memory Peers 2, using 43 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 10.1.1.98 4 65098 588 525 0 0 0 00:22:46 1 2 192.168.10.1 4 65098 594 531 0 0 0 00:22:46 1 2 Total number of neighbors 2 jpmtkvmsw99#
MACアドレステーブルの確認
以下はCumulus Linux側のMACアドレステーブルの情報。
Cumulus Linux側からはLAN向けインタフェース(swp2)やBGPピア向けインタフェース(VXLAN1000)からMACアドレスが見えている。
cumulus@jpmtkvmsw98:mgmt:~$ net show bridge macs VLAN Master Interface MAC TunnelDest State Flags LastSeen -------- ------ --------- ----------------- ---------- --------- ----- -------- 100 bridge bridge 08:00:27:f5:1a:2f permanent 01:06:03 untagged vxlan1000 00:00:00:00:00:00 10.1.1.99 permanent self 00:25:30 untagged bridge swp2 08:00:27:f5:1a:2f permanent 01:06:03 untagged bridge vxlan1000 86:28:ed:e6:78:df permanent 01:06:03 cumulus@jpmtkvmsw98:mgmt:~$
以下はSONiC側のMACアドレステーブルの確認。
こちらではCumulus Linux側からMACアドレスを学習出来ていない。
Cumulus Linux側に向けてPingを打っても、show macの出力内容は全く変化無し。
admin@jpmtkvmsw99:~$ show mac No. Vlan MacAddress Port Type ----- ------ ------------ ------ ------ Total number of entries 0 admin@jpmtkvmsw99:~$
EVPN VNIの確認
以下はCumulus Linux側のVNI情報の確認。
VXLANインタフェース名をCumulus LinuxとSONiCとの間で揃えれば良かったと後悔。
jpmtkvmsw98# show evpn vni VNI Type VxLAN IF # MACs # ARPs # Remote VTEPs Tenant VRF 1000 L2 vxlan1000 1 3 1 default jpmtkvmsw98#
以下はSONiC側のVNI情報の確認。
上記のMACアドレステーブルは空っぽだったが、show evpn vniコマンドを叩くとMACアドレスを2個認識している事が分かる。
Cumulus Linuxとの間で#ARPsの数に差分が生じている原因は不明。
jpmtkvmsw99# show evpn vni VNI Type VxLAN IF # MACs # ARPs # Remote VTEPs Tenant VRF 1000 L2 vtep-100 1 2 1 default jpmtkvmsw99#
EVPN VTEPの確認
以下はCumulus Linux側のVTEP情報の確認。
Number of MACsの行とNumber of ARPsの行の値は、show evpn vniの出力内容と同じである事が分かる。
jpmtkvmsw98# show evpn vni detail VNI: 1000 Type: L2 Vlan: 100 Bridge: bridge Tenant VRF: default VxLAN interface: vxlan1000 VxLAN ifIndex: 11 Local VTEP IP: 10.1.1.98 Mcast group: 0.0.0.0 Remote VTEPs for this VNI: 10.1.1.99 flood: HER Number of MACs (local and remote) known for this VNI: 1 Number of ARPs (IPv4 and IPv6, local and remote) known for this VNI: 3 Advertise-gw-macip: No Advertise-svi-macip: No jpmtkvmsw98#
以下はSONiC側のVTEP情報の確認。
あらら、Oper Statusがoper_downのステータスになっている。
何度か設定を試行してもOperStatusはoper_downのままだった。
admin@jpmtkvmsw99:~$ show vxlan remotevtep +-----------+-----------+-------------------+--------------+ | SIP | DIP | Creation Source | OperStatus | +===========+===========+===================+==============+ | 10.1.1.99 | 10.1.1.98 | EVPN | oper_down | +-----------+-----------+-------------------+--------------+ Total count : 1 admin@jpmtkvmsw99:~$
EVPNの学習経路の確認
[3]で始まるエントリのみ出力されている。
[3]はEVPN Type-3を表し、EVPN Type-3とはBUMトラフィックを転送するトンネルエンドポイントへの到達性を表す為に使用される。
BUMトラフィックとはBroadcast/Unknownunicast/Multicastの略称であり、ARPのようなブロードキャスト通信やOSPFで使用するHelloパケット(マルチキャスト)通信等もBUMトラフィックに含まれる。
今回の場合、全VLAN(当環境ではVLAN100のみ)に対しType-3が生成されて全VLANにフラッディングし、対向の機器が自動で発見されるような形となる。
以下はCumulus Linux側のEVPNの学習経路の確認。
例えば[3]:[0]:[32]:[10.1.1.98]の場合、Type-3、EthTag無し、IPアドレスが/32、オリジンIPが10.1.1.98(自分自身)を示す。
10.1.1.99への経路は、真ん中のエントリが採用されている。
jpmtkvmsw98# show bgp evpn evpn route BGP table version is 1, local router ID is 10.1.1.98 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal Origin codes: i - IGP, e - EGP, ? - incomplete EVPN type-1 prefix: [1]:[ESI]:[EthTag]:[IPlen]:[VTEP-IP]:[Frag-id] EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP] EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP] EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP] EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP] Network Next Hop Metric LocPrf Weight Path Extended Community Route Distinguisher: 10.1.1.98:2 *> [3]:[0]:[32]:[10.1.1.98] 10.1.1.98 32768 i ET:8 RT:65098:1000 Route Distinguisher: 10.1.1.99:2 *> [3]:[0]:[32]:[10.1.1.99] 10.1.1.99 0 65099 i RT:65099:1000 ET:8 * [3]:[0]:[32]:[10.1.1.99] 10.1.1.99 0 65099 i RT:65099:1000 ET:8 Displayed 2 prefixes (3 paths) jpmtkvmsw98#
以下はSONiC側のEVPNの学習経路の確認。
OSは違えど出力フォーマットはCumulus Linuxと同じである。
こちらもType-3のみ出力されている。10.1.1.98への経路は一番上のエントリが採用されている。
jpmtkvmsw99# show bgp evpn evpn route BGP table version is 1, local router ID is 10.1.1.99 Status codes: s suppressed, d damped, h history, * valid, > best, i - internal Origin codes: i - IGP, e - EGP, ? - incomplete EVPN type-1 prefix: [1]:[ESI]:[EthTag]:[IPlen]:[VTEP-IP] EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP] EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP] EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP] EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP] Network Next Hop Metric LocPrf Weight Path Extended Community Route Distinguisher: 10.1.1.98:2 *> [3]:[0]:[32]:[10.1.1.98] 10.1.1.98 0 65098 i RT:65098:1000 ET:8 * [3]:[0]:[32]:[10.1.1.98] 10.1.1.98 0 65098 i RT:65098:1000 ET:8 Route Distinguisher: 10.1.1.99:2 *> [3]:[0]:[32]:[10.1.1.99] 10.1.1.99 32768 i ET:8 RT:65099:1000 Displayed 2 prefixes (3 paths) jpmtkvmsw99#
今回はここまで。
Cumulus LinuxからSONiCの方向の通信に関しては、EVPNやVNIやVTEPの確認が出来たものの、SONiCからCumulus VX方向の通信に関してはshow macの出力内容が空白という事で、正常性の確認が完全に出来ていない。SONiCのこの事象について、設定不備なのかSONiCの仮想アプライアンス版ではまだ動作が不完全なのか、今後も確認を続けたい。
SONiC3〜4台でLeaf-Spineの構成組んでやってみたいのだが、ホスト機のスペックが低い為に2台が精一杯。PCを買い換える機会が有ったら、RAMは最低でも16GBは欲しいところだ。
VXLANについて (2022/12/31追記)
VXLANのの動作が確認出来ない件について。
以下の記事によると、自分がいつも利用しているSONiC(コミュニティ版)でVXLANをまともに動かすにはソースコードの変更が必要との事。
先達の方に感謝。
https://qiita.com/masru0714/items/aca21a09ce4ce1107f05
Cumulus Linuxのキャラクター「Rocket Turtle」が参考書 Cloud Native Data Center Networking (Dinesh著、O'Reilly刊)を眺めている。
123ページ以降に断続的にVXLANに関する記載が有る。
参照サイト
開発者および先達の皆さまに感謝。
https://azure.github.io/SONiC/ SONiC Software for Open Networking in the Cloud
https://qiita.com/advent-calendar/2019/sonic SONiC Advent Calendar 2019
https://qiita.com/advent-calendar/2020/sonic SONiC Advent Calendar 2020
https://speakerdeck.com/imasaruoki Speaker Deckに掲載れているSONiCの資料
https://github.com/Azure/SONiC/tree/master/doc 202106のリリースノートはまだ置かれていない
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning Sonic Roadmap Planning
https://datatracker.ietf.org/doc/html/rfc7348 RFC7348
https://www.apresiatac.jp/blog/201903131137/ Cumulus LinuxでVXLANルーティング構築
https://www.macnica.co.jp/business/semiconductor/articles/basic/136390/ 【第6回】ホワイトボックススイッチの相互運用性試験 ~Edgecore SONiC x Cumulus Linux~
https://www.netone.co.jp/knowledge-center/blog-column/knowledge_takumi_182/ EVPNの仕様と実験的検討③
https://qiita.com/masru0714/items/71f2d8e0efa4c28f991d SONiCとVXLAN
https://kakkotetsu.hatenablog.com/entry/2017/05/11/001708 Cumulus VX で VXLAN+EVPN (original : 2017/03/22)
SONiCに関する記事
https://debslink.hatenadiary.jp/entry/20210131/1612091391 SONiCを少しかじってみた
https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認
https://debslink.hatenadiary.jp/entry/20210320/1616230057 Cumulus LinuxとSONiCの設定ファイル
https://debslink.hatenadiary.jp/entry/20210822/1629600666 SONiCとCumulus LinuxでBGP unnumbered
https://debslink.hatenadiary.jp/entry/20210912/1631418907 SONiCとCumulus Linuxで4byte ASなBGP + IP Clos構成
https://debslink.hatenadiary.jp/entry/20220122/1642852049 SONiCでL2 MC-LAGを組んでみた
https://debslink.hatenadiary.jp/entry/20240421/1713678733 DELL版のSONiCをVMware Fusionで動かす - 導入編