Skip to content

Proxmox SDN / EVPN Routing Incident – Postmortem and Redesign

This document records a real-world routing failure encountered in a Proxmox + SDN (EVPN/BGP/VRF) environment, the investigative timeline, conclusions, and the resulting redesign.

The core issue was asymmetric routing caused by Linux kernel route selection when SDN VRFs and host-connected networks overlap, specifically when the hypervisor itself resides inside one of the destination subnets, resulting in the frames taking a different return path then comming back at the border router that handled the traffic in the first place.

The final decision was to move network 172.23.30.0/24 back to a classic VLAN, because it is trusted, owned infrastructure (DNS, AD, management), and Linux SDN is not equivalent to VMware NSX-style data-plane isolation.


  • Platform: Proxmox VE
  • SDN: Proxmox SDN with EVPN + BGP
  • Routing daemon: FRR
  • Firewall: OPNsense (ruled out later)
  • Overlay users: VMs, storage, services
NetworkPurposeNotes
172.23.30.0/24Infra / DNS / AD / VM mgmtInitially moved into SDN (mistake)
172.23.69.0/24SDN-managedWorked correctly
172.23.96.0/24Hypervisor managementHost is directly connected
172.23.97.0/24OOB / iDRACOut-of-band
10.0.0.0/24SDN fabricBGP underlay

DNS/DC lives in 172.23.30.0/24, connected to an SDN VNet.


  • DNS resolution failed only for some subnets
  • ICMP and TCP behaved inconsistently
  • Tailscale sometimes worked, sometimes not
  • Network 20 worked perfectly
  • Network 69 worked correctly
  • Networks 30 and 96 were flaky or broken

Key observation:

When traffic originated from 172.23.30.0/24 and targeted 172.23.96.0/24, replies bypassed the SDN fabric.


  • reply-to disabled
  • state types adjusted
  • asymmetric routing options tested
  • no effect

Conclusion: Not a firewall issue.


  • Tailscale traffic worked because:
    • source IP not present in host routing table
    • forced traversal via gateway/BGP

But:

  • could reach 96 and 30
  • could not reliably reach 69

Conclusion:

Tailscale bypassed host routing coincidence, masking the real problem.


C>* 172.23.96.0/24 is directly connected, vmbr0.2396
B>* 172.23.30.0/24 is directly connected, vrf_evpnzone
Terminal window
ip route show table 1001

Key finding:

  • 172.23.96.0/24 existed in BOTH main table (connected) and VRF (via BGP)

Terminal window
ip route get 172.23.96.21 from 172.23.69.1

Result:

via 10.0.0.11 dev vmbr_sdn table vrf_evpnzone
Terminal window
ip route get 172.23.96.21 from 172.23.30.1

Result:

local 172.23.96.21 dev lo table local

This showed kernel local table short-circuiting.


Rule existed for 69:

Terminal window
ip rule add from 172.23.69.0/24 lookup vrf_evpnzone priority 99

But not for 30.

After adding:

Terminal window
ip rule add from 172.23.30.0/24 lookup vrf_evpnzone priority 96

Routing lookup appeared correct, yet DNS still failed.


Linux routing is not VM-aware. It is host-aware.

Even with:

  • VRFs
  • policy routing
  • BGP-learned routes

The kernel will always:

  1. Prefer local table
  2. Prefer directly connected host addresses
  3. Short-circuit replies when destination IP belongs to the host

So when:

  • Proxmox host lives in 172.23.96.0/24
  • DNS server in 172.23.30.0/24 replies to 96

The packet:

  • never enters EVPN fabric
  • never reaches border router
  • exits via host interface

Result:

  • asymmetric routing
  • MTU mismatch
  • DNS response drops

This is not fixable cleanly in Linux without extreme hacks.


Reasoning:

  • It is mine
  • It is trusted
  • It is control-plane traffic
  • DNS must be symmetric

Quote-worthy conclusion:

Linux SDN is not VMware NSX. The kernel always wins.


Storage networks remain in SDN because:

  • 10G requirement
  • strict access control (NFS export control)
  • no dependency on DNS symmetry
  • no overlap with host-connected subnets

  1. Trusted infrastructure stays simple
  2. SDN is for isolation, not ownership
  3. DNS never crosses asymmetric paths
  4. Hypervisor routes must never overlap SDN tenant space

VLANNetworkPurpose
30172.23.30.0/24DNS, AD, infra VMs
96172.23.96.0/24Hypervisor mgmt
97172.23.97.0/24OOB / iDRAC

Routing: classic gateway, no VRFs


NetworkPurpose
Storage-ANFS bulk
Storage-BVM disks
Storage-CBackup

Characteristics:

  • 10G
  • EVPN
  • BGP-learned
  • no host IP overlap
  • no DNS dependency

  • Runs on trusted VLAN
  • Uses DNS from VLAN 30
  • No SDN dependency
  • Gigabit sufficient

If it must talk to DNS to function, keep it out of SDN.


  • Remove 172.23.30.0/24 from SDN entirely
  • Remove VRF rules for 30
  • Validate symmetric routing
  • Document SDN usage boundaries
  • Consider separate tenant-only Proxmox cluster if needed

This was not a misconfiguration. This was a design mismatch between Linux routing semantics and expectations shaped by enterprise SDN platforms.

The correct fix was architectural, not technical.