{"id":6776,"date":"2026-05-14T03:56:42","date_gmt":"2026-05-14T03:56:42","guid":{"rendered":"https:\/\/technobabble.us.to\/?p=6776"},"modified":"2026-05-14T07:31:50","modified_gmt":"2026-05-14T07:31:50","slug":"evpn-vxlan-on-sonic-virtually-via-eve-ng","status":"publish","type":"post","link":"https:\/\/technobabble.us.to\/?p=6776","title":{"rendered":"EVPN-VXLAN on SONiC virtually via EVE-NG"},"content":{"rendered":"\n<p>I&#8217;ve been focused heavily on network automation and hardware during my last 5 years working at eBay &amp; Celestica so I wanted to get back to my networking roots and dig into a protocol that I don&#8217;t have much experience with. Lucky for me SONiC offers <a href=\"https:\/\/support.stordis.com\/hc\/en-us\/articles\/26116997413661-Where-to-download-the-SONiC-Virtual-Switch-VS-community-pre-built-image#h_01JQ6FJVWE5VNQN22FTSJTM510\" data-type=\"link\" data-id=\"https:\/\/support.stordis.com\/hc\/en-us\/articles\/26116997413661-Where-to-download-the-SONiC-Virtual-Switch-VS-community-pre-built-image#h_01JQ6FJVWE5VNQN22FTSJTM510\">virtual images<\/a> that can be run on network emulators like EVE-NG.<\/p>\n\n\n\n<p>I&#8217;m running my instance of EVE-NG inside of a VM on ProxMox, but it can also be setup on bare metal. I&#8217;m rocking a new <a href=\"https:\/\/www.servethehome.com\/minisforum-ms-a2-review-an-almost-perfect-amd-ryzen-intel-10gbe-homelab-system\/\" data-type=\"link\" data-id=\"https:\/\/www.servethehome.com\/minisforum-ms-a2-review-an-almost-perfect-amd-ryzen-intel-10gbe-homelab-system\/\">Minisforum MS-A2<\/a> with 128GB DDR5 memory with an AMD Ryzen 9 9955HX, so the hypervisor overhead in minimal in my case.<\/p>\n\n\n\n<p>Once you get the image downloaded, then it just needs to be unzipped, renamed and uploaded to EVE-NG, there is no need to convert the image or do anything special. Once it&#8217;s been uploaded and added to a template you can uses these images over and over for various labs.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1224\" data-id=\"6779\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-scaled.png\" alt=\"\" class=\"wp-image-6779\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-scaled.png 2560w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-300x143.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-768x367.png 768w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-1536x734.png 1536w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE_resources-2048x979.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"962\" data-id=\"6780\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-scaled.png\" alt=\"\" class=\"wp-image-6780\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-scaled.png 2560w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-300x113.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-768x289.png 768w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-1536x577.png 1536w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/eve-proxmox-2048x769.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1694\" height=\"1336\" data-id=\"6778\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1.png\" alt=\"\" class=\"wp-image-6778\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1.png 1694w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1-300x237.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1-768x606.png 768w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-VXLAN-LAB1-1536x1211.png 1536w\" sizes=\"auto, (max-width: 1694px) 100vw, 1694px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>Moving onto the actual configurations, there were several SONiC issues I had to work out. I did not go to bed until 4am, hence the blog post, to try and save anyone else from needless pain. <\/p>\n\n\n\n<p>Let&#8217;s start with the diagram above, specifically the port numbering. What I found, on two different virtual images was that you want to avoid using Ethernet0 when connecting everything. The reason being when you run LLDP you will keep seeing references to eth0, also all of the neighbors looked funny. <\/p>\n\n\n\n<p>When I had everything connected via Ethernet0 I was not able to ping a directly connected link! Through some trial and error I saw the issue and then reconnected everything like you see above. Now the crazy thing is when you configure the interfaces in SONiC, you will be configuring Ethernet0 for the wire that is Ethernet1. <\/p>\n\n\n\n<p><strong>Here is an example of the issue<\/strong>, <strong>Links in EVE-NG are <em>Ethernet1<\/em> &amp; <em>Ethernet2<\/em><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-LINK-ISSUE.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1504\" height=\"1018\" data-id=\"6783\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-LINK-ISSUE.png\" alt=\"\" class=\"wp-image-6783\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-LINK-ISSUE.png 1504w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-LINK-ISSUE-300x203.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/EVE-LINK-ISSUE-768x520.png 768w\" sizes=\"auto, (max-width: 1504px) 100vw, 1504px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>Once again, I saw this issue in our Celestica image, as well as the image I downloaded from Azure. This caused a lot of confusion when I was copy and pasting configs. You might also notice that Ethernet2 actually maps to Ethernet4&#8230;&#8230;.fun times&#8230;&#8230;.now you know!  <\/p>\n\n\n\n<p>The next bit of fun was trying to find an image that supported all the config options I needed for my lab, unfortunately I wasted several hours with our Celestica image that forced you to use sonic-cli with missing options for EVPN-VXLAN, there was no way to enter vtysh mode on this image. <\/p>\n\n\n\n<p>Once I downloaded a 202511 image from Azure, I was able to enter VTYSH mode and configure BGP with all the advanced options. This led to the next bit of fun where I would constantly lose my BGP configs when the switch was rebooted! <\/p>\n\n\n\n<p>With SONiC, there are a lot of ways to configure things, too many ways if I&#8217;m being honest! Then there is the whole sonic-cli thing, and frr-mgmt-framework, which attempts to keep everything unified and Cisco like. I personally hate this but then learned all the GNMI, YANG, &amp; REST stuff is all tied into this. <\/p>\n\n\n\n<p>However, for a lab, that stuff is all overkill. All I need is a simple config_db.json file paired with a BGP config file (frr.conf)  that I manage and that will not get borked when rebooting. The magic that makes this happen is &#8220;<strong>split-unified<\/strong>&#8220;. <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nadmin@spine-1:~$ sudo cat \/etc\/sonic\/config_db.json | jq &quot;.DEVICE_METADATA&quot;\n{\n  &quot;localhost&quot;: {\n    &quot;buffer_model&quot;: &quot;traditional&quot;,\n    &quot;default_bgp_status&quot;: &quot;up&quot;,\n    &quot;default_pfcwd_status&quot;: &quot;disable&quot;,\n    &quot;docker_routing_config_mode&quot;: &quot;split-unified&quot;,\n    &quot;hostname&quot;: &quot;spine-1&quot;,\n    &quot;hwsku&quot;: &quot;Force10-S6000&quot;,\n    &quot;mac&quot;: &quot;22:1c:31:5e:21:7c&quot;,\n    &quot;platform&quot;: &quot;x86_64-kvm_x86_64-r0&quot;,\n    &quot;timezone&quot;: &quot;UTC&quot;,\n    &quot;type&quot;: &quot;LeafRouter&quot;\n  }\n}\n<\/pre><\/div>\n\n\n<p>You also need to pair that config change with a change to <em>vtysh.conf<\/em>      <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nservice integrated-vtysh-config&quot;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.46.43.png\"><img loading=\"lazy\" decoding=\"async\" width=\"876\" height=\"406\" data-id=\"6787\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.46.43.png\" alt=\"\" class=\"wp-image-6787\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.46.43.png 876w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.46.43-300x139.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.46.43-768x356.png 768w\" sizes=\"auto, (max-width: 876px) 100vw, 876px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>what you now have is a simple way to manage your BGP configuration separate from your config_db.json file. More importantly, this file frr.conf file will persist across reboots!<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.54.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"692\" height=\"1304\" data-id=\"6788\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.54.29.png\" alt=\"\" class=\"wp-image-6788\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.54.29.png 692w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-20.54.29-159x300.png 159w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>There is also no need for any of the other files that you normally find in this location, zerba, bgpd, ospf, static, etc. With this change, none of those are needed, you can delete them as I have. You can even have static route info in your frr.conf file. <\/p>\n\n\n\n<p><strong>Key Aspects of <code>split-unified<\/code> Mode:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Configuration Handling:<\/strong> Unlike <code>unified<\/code> mode (which generates <code>frr.conf<\/code> from <code>configDB<\/code>), <code>split-unified<\/code> does not auto-generate the FRR configuration, letting users handle it independently.<\/li>\n\n\n\n<li><strong>Implementation:<\/strong> It is enabled by adding <code>\"docker_routing_config_mode\": \"split-unified\"<\/code> to the <code>DEVICE_METADATA<\/code> table in <code>\/etc\/sonic\/config_db.json<\/code>.<\/li>\n\n\n\n<li><strong>Usage:<\/strong> Commonly used in lab, simulation, and specific deployment environments to gain better control over BGP\/routing configurations without needing to define everything in the <code>configDB<\/code> structure.<\/li>\n\n\n\n<li><strong>frrcfgd Interaction:<\/strong> <code>frrcfgd<\/code> (FRR configuration daemon) handles the translation, and this mode offers a middle ground between total separation (<code>split<\/code>) and total unification (<code>unified<\/code>).<\/li>\n\n\n\n<li><strong>Deployment:<\/strong> <code>split-unified<\/code> mode is used in modern SONiC versions (e.g., 202405) to manage complex networking deployments like EVPN-VXLAN.<\/li>\n<\/ul>\n\n\n\n<p>The rest of this first lab was pretty straightforward as this is a simple VXLAN Data Plane + L2 VNI. Here you can see the end hosts are able to ping eachother like they we on the same switch. <\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1058\" height=\"740\" data-id=\"6797\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.17.png\" alt=\"\" class=\"wp-image-6797\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.17.png 1058w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.17-300x210.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.17-768x537.png 768w\" sizes=\"auto, (max-width: 1058px) 100vw, 1058px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-8 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.28.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1048\" height=\"788\" data-id=\"6798\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.28.png\" alt=\"\" class=\"wp-image-6798\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.28.png 1048w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.28-300x226.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.07.28-768x577.png 768w\" sizes=\"auto, (max-width: 1048px) 100vw, 1048px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p>mac addresses only show up after a successful ping, after awhile they timeout.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-9 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.09.05.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1252\" height=\"934\" data-id=\"6801\" src=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.09.05.png\" alt=\"\" class=\"wp-image-6801\" srcset=\"https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.09.05.png 1252w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.09.05-300x224.png 300w, https:\/\/technobabble.us.to\/wp-content\/uploads\/2026\/05\/Screenshot-2026-05-13-at-21.09.05-768x573.png 768w\" sizes=\"auto, (max-width: 1252px) 100vw, 1252px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>I get tired of jumping between modes, so I programmed some commands in SecureCRT, these commands jump into and out of vtysh mode as needed.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo vtysh \\n \\p show bgp l2vpn evpn route type macip \\n exit \\n\n<\/pre><\/div>\n\n\n<p>In closing, there are some ACL entries in IPTABLES that get generated automatically by SONiC. These will need to be manually deleted before traffic can be passed as expected! <\/p>\n\n\n\n<p>This is also needed in your config before prefixes will be exchanged.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nrouter bgp 65XXX\n no bgp ebgp-requires-policy\n<\/pre><\/div>\n\n\n<p>Finally, your new SONiC image is likely to come pre populated with a TON of IP addresses and BGP ASN&#8217;s, I found a simple way to clean that up.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo jq 'del(.BGP_NEIGHBOR) | del(.BGP_PEER_RANGE) | del(.INTERFACE) | del(.PORTCHANNEL_INTERFACE) | del(.LOOPBACK_INTERFACE)' \\\n      \/etc\/sonic\/config_db.json | sudo tee \/tmp\/clean_config.json\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo config reload \/tmp\/clean_config.json -y\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>I&#8217;ve been focused heavily on network automation and hardware during my last 5 years working at eBay &amp; Celestica so I wanted to get back to my networking roots and dig into a protocol that I don&#8217;t have much experience &hellip; <a href=\"https:\/\/technobabble.us.to\/?p=6776\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6776","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/posts\/6776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6776"}],"version-history":[{"count":21,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/posts\/6776\/revisions"}],"predecessor-version":[{"id":6811,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=\/wp\/v2\/posts\/6776\/revisions\/6811"}],"wp:attachment":[{"href":"https:\/\/technobabble.us.to\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6776"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6776"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/technobabble.us.to\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}