Proxmox VE 9.2 added route maps and prefix lists to the SDN stack. Before this, if you wanted to filter BGP or EVPN routes, you had to edit frr.conf.local manually. Now you can create these filters in the web UI, and Proxmox writes the FRR config for you on every node.
How to Filter BGP and EVPN Routes in Proxmox VE 9.2
Table of Contents
- What You Will Build
- Requirements and Planning
- Check the Proxmox VE version
- Check the cluster
- Step 1: Prepare the Nodes
- Install and enable FRR
- Check the SDN include line
- Set the underlay MTU
- Open the firewall ports
- Step 2: Build the Base EVPN Fabric
- Create the EVPN controller
- Create the EVPN zone
- Create the VNets and subnets
- Apply the changes and Check the base fabric
- Test with two guests
- Step 3: Create the Prefix Lists
- List 1: default-only
- List 2: tenant-nets
- List 3: lab-net
- Step 4: Create the Route Maps
- Route map: from-upstream
- Route map: to-upstream
- Route map: evpn-in
- Step 5: Peer with the Upstream Router
- Create the BGP controllers
- Fix the EVPN controller
- Apply the changes and Configure the upstream router
- Step 6: Apply Proxmox BGP EVPN Configuration
- Step 7: Verify the Result
- Check the BGP sessions
- Check what we accept
- Check what we announce
- Check the EVPN routes and the VRF
- Check that the maps are used
- Test from a guest
- Change a rule and re-check
- Running EVPN Over a WireGuard Tunnel
- How to Fix Common BGP EVPN Issues
- Missing routes
- Wrong ASNs
- MTU issues
- Asymmetric reachability
- Conclusion

What You Will Build
In this guide, you will learn to build a three-node EVPN network, connect it to an upstream router with BGP, and then use prefix lists and route maps to control which routes come in and go out.
The goals of the filters are simple:
- The upstream router can send us only the default route (
0.0.0.0/0). - We send the upstream router only the
webanddbsubnets. Thelabsubnet stays private. - Remote EVPN peers cannot announce the
labprefix to us.
The IP ranges and names here are examples. Replace them with your own values.
Requirements and Planning
Check these items before you start your Proxmox BGP EVPN configuration with route maps:
- Three Proxmox VE 9.2 nodes in one cluster.
- A private or routed network between the nodes with working IP connectivity.
- Root SSH access to all nodes.
- A router that can run BGP. A Linux box with FRR works well.
- Open ports: TCP
179(BGP) and UDP4789(VXLAN) between the nodes, plus TCP179to the upstream router.
Remember to use private ASNs only. The private ranges are 64512 to 65534 and 4200000000 to 4294967294. A public ASN can break real routing by mistake.
Check the Proxmox VE version
Before you build the EVPN fabric, make sure every node runs Proxmox VE 9.2. Route maps and prefix lists do not exist in older versions, so the menus will be missing in the UI. Run this on every node:
You should see pve-manager/9.2.x. If not, update your server:
You must reboot the server if a new kernel was installed.
Check the cluster
EVPN settings are stored in the shared SDN config, so all three nodes must be in one healthy cluster. If a node is out of sync or the cluster has no quorum, the SDN changes will not apply to every node. Run this check first to confirm all nodes are online:
Look for Quorate: Yes and three nodes. If you have no cluster yet, create it on pve1 and join the others:
Step 1: Prepare the Nodes
In this step, you get all three nodes ready for EVPN. You will install FRR, check the network file, set the right MTU, and open the ports that BGP and VXLAN need. Do every part on each node, so the fabric starts clean.
Install and enable FRR
FRR (FRRouting) is the routing software that runs BGP and EVPN on each Proxmox node. Proxmox SDN writes the FRR config for you, but FRR must be installed and running first. Install it on all three nodes with the commands below:
Check the SDN include line
SDN writes its network files to /etc/network/interfaces.d/. This line must be at the end of /etc/network/interfaces:
If it prints nothing, make a backup and add it:
On a fresh Proxmox VE install, this line is already there.
Set the underlay MTU
VXLAN adds 50 bytes to every packet. So the MTU inside the overlay must be 50 bytes smaller than the MTU on the underlay. With a normal 1500 MTU on the underlay, the zone MTU is 1450. Open the network file:
Make sure the bridge that carries the node IP has the MTU set. This example is for pve1. Change the address and the port name (eno1) to match your node:
Apply the change and check it with the commands below:
Note: Be careful when you change network files over SSH. A wrong line can lock you out. If your provider allows jumbo frames (for example, MTU 9000), you can set mtu 9000 here and use 8950 in the zone later.
Open the firewall ports
If you use the Proxmox firewall, edit the cluster rules file. Because /etc/pve is shared, the rules reach all nodes:
Add these lines under the [RULES] section. Create the section if it does not exist:
If you turn on the firewall for the first time, keep SSH (port 22) and the web UI (port 8006) open, so you do not lock yourself out.
Step 2: Build the Base EVPN Fabric
First, you must build EVPN without filters. Then, you must add the filters later. This order makes problems easy to find in your Proxmox BGP EVPN configuration with route maps.
Create the EVPN controller
In the web UI, go to Datacenter > SDN > Options > Controllers > Add > EVPN, and fill in:
The peer list must include every node, including the local one. Peers can also be external nodes or route reflectors.
If you prefer a CLI option, you can use the command below instead:
Create the EVPN zone
From the web UI, go to Datacenter > SDN > Zones > Add > EVPN, and fill in:
The VRF VXLAN ID must be different from the VXLAN IDs (tags) of the VNets. Exit nodes are the gateways to the real network, and they announce a default route inside EVPN. The primary exit node forces all outside traffic through pve1. This is needed when your upstream router does not support ECMP, or when you use SNAT. Advertise Subnets helps when a VM is silent, because it announces the full subnet.
If you prefer a CLI option, you can use the command below instead:
Create the VNets and subnets
At this point, go to Datacenter > SDN > VNets > Create. VNet IDs can have up to 8 characters:
After you create a VNet, select it and add the subnet in the Subnets panel. In an EVPN zone, the gateway is deployed on the VNet on every node, so VMs can use it as an anycast gateway.
If you prefer a CLI option, you can use the command below instead:
Apply the changes and Check the base fabric
SDN changes stay pending until you apply them. In the UI, go to Datacenter > SDN and click Apply. Or use the CLI:
To check the base fabric, run these on each node:
You should see two established neighbors in the EVPN summary, a web bridge, a vxlan_web device with MTU 1450, and a VRF named vrf_evpnz1.
You can also see the generated files with the following commands:
Test with two guests
Create two VMs or containers. Put one on pve2 and one on pve3. Set their network bridge to web. Inside each guest, set a static IP and the right MTU. On Debian, edit /etc/network/interfaces in the guest:
Use 172.16.10.12/24 for the second guest. Restart the network, then test:
The last ping sends the biggest packet that fits: 1422 bytes of data plus 28 bytes of headers equals 1450. If it works, the overlay MTU is correct.
Step 3: Create the Prefix Lists
This is the main part of the Proxmox BGP EVPN configuration with route maps setup. You must create the prefix lists. Go to Datacenter > SDN > Prefix Lists > Add. Create three lists.
The names only_default, only_default_v6, and loopbacks_ips are reserved. Proxmox creates them itself, so do not use them.
List 1: default-only
This first prefix list matches only the default route (0.0.0.0/0). We will use it later to accept nothing else from the upstream router. Create it with the values below:
With no ge or le, this matches exactly 0.0.0.0/0. It does not match other routes.
List 2: tenant-nets
This second prefix list matches the web and db subnets. We will use it to control which networks we send to the upstream router. Leave the lab subnet out of this list:
List 3: lab-net
This third prefix list matches the lab subnet and every smaller route inside it, such as host routes. We will use it later to block the lab network from remote EVPN peers. Create it with the values below:
Here ge 24 and le 32 match the /24 itself and also smaller routes inside it, such as /32 host routes. Proxmox checks that ge is not bigger than le, and that neither is smaller than the prefix length.
Leave gaps in the sequence numbers (10, 20, 30). This leaves room to add lines later.
Step 4: Create the Route Maps
Route maps use the prefix lists to decide what to do with each route. Go to Datacenter > SDN > Route Maps > Add. Each entry has an Order (0 to 65535), an Action, and optional Match and Set values. You must create these entries.
Route map: from-upstream
This map controls what we accept from the upstream router. Create it with the values below:
Only the default route passes. Every other route is dropped automatically. The route also gets a higher local preference.
Route map: to-upstream
This map controls what we announce to the upstream router. Create it with the values below:
Only 172.16.10.0/24 and 172.16.20.0/24 can leave. The lab subnet is dropped automatically, so it stays private.
Route map: evpn-in
This map controls what we accept from other EVPN peers. Create it with the values below:
An entry applies only when all of its match rules are true. Entry 10 drops only prefix routes (EVPN type-5) that match the lab network. Entry 20 lets all other routes pass. Without entry 20, every other EVPN route would be dropped, and the fabric would break.
This map blocks the lab prefix route from remote peers. VM-level routes (type-2) are not touched, so VMs in lab can still talk to each other.
Step 5: Peer with the Upstream Router
Exit nodes talk to the upstream router with BGP. This part of the Proxmox BGP EVPN configuration with route maps guide adds that link. You must create one BGP controller per exit node.
Create the BGP controllers
Go to Datacenter > SDN > Options > Controllers > Add > BGP and fill in:
The ASN here is the local ASN of the node. EBGP is on because the upstream router has a different ASN (65001). The peer is directly connected, so you do not need ebgp-multihop.
If you prefer the CLI option, you can use the command below:
Fix the EVPN controller
When a BGP controller exists, and the EVPN controller is in auto mode, the EVPN peers reuse the BGP session type. That makes the node-to-node sessions eBGP, and they will fail because all nodes use the same ASN. To avoid this, you must set the type manually.
Open Datacenter > SDN > Options > Controllers, edit evpnctl, and set:
The nodes now use iBGP between each other (same ASN 65000) and eBGP to the upstream router.
Apply the changes and Configure the upstream router
To apply the changes, go to Datacenter > SDN and click Apply. Or, run the command below:
To configure the upstream router, you can use a Linux router with FRR. Install it and turn on the BGP daemon:
Then, open the FRR shell and add the config:
The default-originate lines send a default route to both exit nodes. The line no bgp ebgp-requires-policy is for the lab only. Newer FRR blocks eBGP routes if no route map is set on the session. In production, use route maps on the router too.
Step 6: Apply Proxmox BGP EVPN Configuration
Proxmox now has the full filter set. This is what each node does after you apply. The EVPN controller keeps its own built-in MAP_VTEP_IN and MAP_VTEP_OUT maps and calls your map from them.
On exit nodes, Proxmox also keeps a built-in rule that denies default routes inside EVPN. This stops traffic loops between exit nodes, and your map does not remove it.
Use the commands below to look at what Proxmox stored:
You should see the files prefix-lists.cfg and route-maps.cfg in that folder. Do not edit them manually. Use the UI or the API.
Now you must look at what FRR got. Run this on pve1:
If the lines are missing, you forgot to click Apply, or the map is not attached to a controller.
Step 7: Verify the Result
Now you must check that everything works as planned. In this step, you should look at the BGP sessions, the routes you accept and announce, and the EVPN routes. Also, you should confirm that your route maps are being used.
Check the BGP sessions
First, make sure the BGP sessions are up. If a session is down, no routes can move, and the route maps have nothing to filter. Run these commands on each node:
On the exit nodes, the neighbor 192.168.50.1 must be in the Established state, and it must show 1 prefix received. The two EVPN peers must be established too.
Check what we accept
Next, check which routes the exit nodes accept from the upstream router. The from-upstream route map should let only the default route through. Run these commands on pve1 and pve2:
The first command shows routes before the incoming map. The second shows routes after it. Only 0.0.0.0/0 should be in the second list, with local preference 200.
Check what we announce
Now check which routes the exit nodes send to the upstream router. The to-upstream route map should allow only the web and db subnets. Run this command on pve1 and pve2:
You should see 172.16.10.0/24 and 172.16.20.0/24 with metric 100. You must not see 172.16.30.0/24. On the upstream router, check the same:
Check the EVPN routes and the VRF
At this point, you must look at the EVPN side. These commands show the routes shared between nodes, the routes inside the VRF, and the VNIs that are active. Run them on each node and compare the output:
Check that the maps are used
Finally, you must confirm that FRR is really using your prefix lists and route maps. Each route map shows a counter that goes up every time it is used. Run these commands on each node:
The route map output has an Invoked counter. If a map is never invoked, it is not attached to the session.
Test from a guest
From a guest in web, check outside access and that the lab subnet is not visible upstream:
Outside traffic needs the upstream router to know the way back to 172.16.10.0/24. If it does not, enable SNAT on the subnet, or add routes on the router.
Change a rule and re-check
When you change a map, you must apply the SDN, and then ask FRR to resend routes without resetting the session:
Running EVPN Over a WireGuard Tunnel
This guide builds one site on a private routed network. If your nodes are in different data centers and you need an encrypted link, you must build the tunnel first. You can check our guide on how to build a multi-site Proxmox SDN with a WireGuard fabric. In that setup, the tunnel is the underlay.
If you want to run this EVPN design over that tunnel, you must follow these rules:
- Use the WireGuard addresses as the EVPN controller peers.
- Use the tunnel MTU rule from that guide:
1370in the zone and in the guests. - Use different IP ranges for the tenant networks. Do not reuse the ranges of the tunnel.
- Do not open UDP
4789on public interfaces. Allow it only on the tunnel interface.
How to Fix Common BGP EVPN Issues
Even with a good setup, things can go wrong. In this section, you can find the most common problems, such as missing routes, wrong ASNs, MTU issues, and one-way traffic. Each problem comes with simple checks and fixes.
Missing routes
Most Proxmox BGP EVPN configuration issues come from the session or the map. Start with the session, then the map.
Common causes and fixes include:
- You did not click Apply. Check with
pvesh get /cluster/sdn/route-mapsandvtysh -c "show running-config". - The implicit deny drops the route. Add a final
permitentry if you want everything else to pass. - The prefix does not match. A line without
georlematches one exact network. A/24route does not match a/16entry unless you setle 24orge 24. - The sequence is wrong. The first match wins, so a
denywith a low number can hide a laterpermit. - The default route is missing inside EVPN. On exit nodes, Proxmox's built-in rule drops default routes from other EVPN peers on purpose. The default route comes from the exit nodes themselves.
- The session shows
(Policy)inshow bgp summary. FRR blocks eBGP routes when no route map is set. Attach a map to the session. - The route was filtered in the past, and you changed the map. Run
clear bgp ... soft in.
Wrong ASNs
When a BGP session will not come up, the state and the last error usually tell you why. Run these commands to see both:
Common causes and fixes include:
- The state is
IdleorActive. The peer is not reachable; the firewall blocks TCP179, or the ASN does not match. - The log says
Bad Peer AS. The remote ASN on one side is wrong. Check theneighbor ... remote-asline on the router. - All EVPN controllers on one node must use the same ASN.
- If a node has two iBGP sessions with different ASNs, Proxmox rejects the config. One FRR instance has only one local ASN.
- The EVPN peers are eBGP when they should be iBGP. Set BGP Mode to
internalon the EVPN controller. - You used a public ASN. Use private ASNs only.
MTU issues
Use this section to check for MTU problems when ping works but SSH, HTTPS, or file transfers hang. Test the network between the nodes, then test from inside a guest.
Common causes and fixes include:
- The zone MTU is bigger than the underlay MTU minus 50.
- The guest MTU is still
1500. Set it to the zone MTU in the guest network file. - A switch or the provider network has a smaller MTU than you think.
- The MTU on the node bridge went back to default after a reload. Check
ip link show vmbr0.
Asymmetric reachability
Use this section when traffic works in one direction, but replies do not return. Check the routes on both sides, then review the route maps, exit nodes, and firewall rules.
Run these on both nodes and compare. Common causes and fixes include:
- A route map filters routes on one node only. Check the maps on both sides with
show route-map. - You have two exit nodes, but the upstream router sends replies to the other one. Use a primary exit node, or make sure the upstream router uses ECMP.
- The upstream router has no route back to the tenant subnet. Check
show bgp ipv4 unicaston it. Fix theto-upstreammap, enable SNAT, or add a static route. - A silent VM is not seen by the network. Turn on Advertise Subnets in the zone.
- A floating IP moves between VMs. Turn on Disable ARP ND Suppression in the zone.
- You want to reach a guest from an exit node itself. By default, exit nodes only forward. Turn on Exit Nodes Local Routing.
- A firewall sees only one direction of a flow and drops it. Check firewall rules on both nodes.
Conclusion
At this point, you have a Proxmox VE 9.2 EVPN fabric with BGP peers, VNets, and route filters. Prefix lists select the networks, and route maps control which routes you accept and announce. Before using the setup in production, check the BGP sessions, routes, MTU, and traffic in both directions.
Plan your ASNs, MTU, and exit nodes, then test each route map before going live. For this setup, you can use dedicated hosting for virtual networks.
Proxmox VE 9.2 can create route maps and prefix lists in the SDN. You can attach them to BGP and EVPN controllers.
In the web UI, under Datacenter > SDN > Prefix Lists and Datacenter > SDN > Route Maps.
In the shared folder /etc/pve/sdn/, in prefix-lists.cfg and route-maps.cfg.
No. A simple full mesh of nodes needs only an EVPN controller. Add a BGP controller when you peer with an outside router or use a different ASN per node.