]> git.proxmox.com Git - pve-network.git/commitdiff
controllers: evpn: fix multiple exit-nodes with route-map filtering
authorAlexandre Derumier <aderumier@odiso.com>
Wed, 20 Apr 2022 14:19:30 +0000 (16:19 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 27 Apr 2022 08:31:30 +0000 (10:31 +0200)
Currently, when multiple exit-nodes are defined, each exit-nodes exchanges
their own default route, so traffic is looping between both exit nodes
instead going out.

This add a new route-map to filter received type-5 on exit node

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
16 files changed:
PVE/Network/SDN/Controllers/BgpPlugin.pm
PVE/Network/SDN/Controllers/EvpnPlugin.pm
test/zones/evpn/advertise_subnets/expected_controller_config
test/zones/evpn/disable_arp_nd_suppression/expected_controller_config
test/zones/evpn/ebgp/expected_controller_config
test/zones/evpn/ebgp_loopback/expected_controller_config
test/zones/evpn/exitnode/expected_controller_config
test/zones/evpn/exitnode_local_routing/expected_controller_config
test/zones/evpn/exitnode_primary/expected_controller_config
test/zones/evpn/exitnode_snat/expected_controller_config
test/zones/evpn/ipv4/expected_controller_config
test/zones/evpn/ipv4ipv6/expected_controller_config
test/zones/evpn/ipv4ipv6nogateway/expected_controller_config
test/zones/evpn/ipv6/expected_controller_config
test/zones/evpn/multipath_relax/expected_controller_config
test/zones/evpn/rt_import/expected_controller_config

index 73ed17199a8fa6e02591387456a1f96a45185d44..6e69f677a39edef67e3be35be33be9ae459e073d 100644 (file)
@@ -121,10 +121,11 @@ sub generate_controller_config {
        push(@{$config->{frr}->{''}}, "ip prefix-list loopbacks_ips seq 10 permit 0.0.0.0/0 le 32");
        push(@{$config->{frr}->{''}}, "ip protocol bgp route-map correct_src");
 
-       my $routemap_config = [];
+       my $routemap_config = ();
        push @{$routemap_config}, "match ip address prefix-list loopbacks_ips";
        push @{$routemap_config}, "set src $ifaceip";
-       push(@{$config->{frr_routemap}->{'correct_src'}}, $routemap_config);
+       my $routemap = { rule => $routemap_config, action => "permit" };
+       push(@{$config->{frr_routemap}->{'correct_src'}}, $routemap);
     }
 
     return $config;
index 0c498939dc09431dd131e806f7643eedb09b045a..22480d41547ebd2d8c60ccef83fcd0d7bc73b38a 100644 (file)
@@ -99,13 +99,16 @@ sub generate_controller_config {
 
     # address-family l2vpn
     @controller_config = ();
+    push @controller_config, "neighbor VTEP route-map MAP_VTEP_IN in";
     push @controller_config, "neighbor VTEP route-map MAP_VTEP_OUT out";
     push @controller_config, "neighbor VTEP activate";
     push @controller_config, "advertise-all-vni";
     push @controller_config, "autort as $autortas" if $autortas;
     push(@{$bgp->{"address-family"}->{"l2vpn evpn"}}, @controller_config);
 
-    push(@{$config->{frr_routemap}->{'MAP_VTEP_OUT'}}, []);
+    my $routemap = { rule => undef, action => "permit" };
+    push(@{$config->{frr_routemap}->{'MAP_VTEP_IN'}}, $routemap );
+    push(@{$config->{frr_routemap}->{'MAP_VTEP_OUT'}}, $routemap );
 
     return $config;
 }
@@ -160,14 +163,22 @@ sub generate_controller_zone_config {
 
     if ($is_gateway) {
 
-        if($exitnodes_primary && $exitnodes_primary ne $local_node) {
+       if(!$exitnodes_primary || $exitnodes_primary eq $local_node) {
+           #filter default type5 route coming from other exit nodes on primary node or both nodes if no primary is defined.
+           my $routemap_config = ();
+           push @{$routemap_config}, "match evpn route-type prefix";
+           my $routemap = { rule => $routemap_config, action => "deny" };
+           unshift(@{$config->{frr_routemap}->{'MAP_VTEP_IN'}}, $routemap);
+       } elsif ($exitnodes_primary ne $local_node) {
            my $routemap_config = ();
            push @{$routemap_config}, "match evpn vni $vrfvxlan";
            push @{$routemap_config}, "match evpn route-type prefix";
            push @{$routemap_config}, "set metric 200";
-           unshift(@{$config->{frr_routemap}->{'MAP_VTEP_OUT'}}, $routemap_config);
+           my $routemap = { rule => $routemap_config, action => "permit" };
+           unshift(@{$config->{frr_routemap}->{'MAP_VTEP_OUT'}}, $routemap);
         }
 
+
        if (!$exitnodes_local_routing) {
            @controller_config = ();
            #import /32 routes of evpn network from vrf1 to default vrf (for packet return)
@@ -355,10 +366,12 @@ sub generate_frr_routemap {
        my $order = 0;
        foreach my $seq (@$routemap) {
                $order++;
+               next if !defined($seq->{action});
                my @config = ();
                push @config, "!";
-               push @config, "route-map $id permit $order";
-               push @config, map { " $_" } @$seq;
+               push @config, "route-map $id $seq->{action} $order";
+               my $rule = $seq->{rule};
+               push @config, map { " $_" } @$rule;
                push @{$final_config}, @config;
        }
    }
index c9545bc0f679c4efc046e933cebc95a52d10278a..742bbf4e7c72b7da2fe01d40718c6b5ede320ce7 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -41,6 +42,8 @@ router bgp 65000 vrf vrf_myzone
   advertise ipv6 unicast
  exit-address-family
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5a8fb9998151315352b51e45a80262750b21e302..2f819e519e8515ded03daa4f9613e31de08c0da3 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -28,6 +29,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5c9a7c6b78e40d7de8023dff33b4208b6f9c63b5..d1956df55fcd3375a8d0a9a087ec12f9c599643f 100644 (file)
@@ -31,6 +31,7 @@ router bgp 65001
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -45,6 +46,8 @@ router bgp 65001 vrf vrf_myzone
   route-target export 65000:1000
  exit-address-family
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5ec19a81663de42e2a9e619f2d4b2c1cc18db88c..905433bcf25ab5a4ef743cba8d128408f16cc7f5 100644 (file)
@@ -36,6 +36,7 @@ router bgp 65001
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -50,6 +51,8 @@ router bgp 65001 vrf vrf_myzone
   route-target export 65000:1000
  exit-address-family
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 route-map correct_src permit 1
index 96d89f332c844cb52e0c986d9b609b44f6e8a51c..0ee4b8ad7fb55e746ef6349ecb8ece936993829b 100644 (file)
@@ -28,6 +28,7 @@ router bgp 65000
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -49,6 +50,11 @@ router bgp 65000 vrf vrf_myzone
   default-originate ipv6
  exit-address-family
 !
+route-map MAP_VTEP_IN deny 1
+ match evpn route-type prefix
+!
+route-map MAP_VTEP_IN permit 2
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 812043e7ff083a7fd7c4c7a3f375d051f6cf6767..6ceaca77ad26e097370bc74ff7720a3f287ab62d 100644 (file)
@@ -21,6 +21,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -34,6 +35,11 @@ router bgp 65000 vrf vrf_myzone
   default-originate ipv6
  exit-address-family
 !
+route-map MAP_VTEP_IN deny 1
+ match evpn route-type prefix
+!
+route-map MAP_VTEP_IN permit 2
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5f23bdc759f4f8fe7522aeb975cbb2dab69f963a..dfa158de7afeebcbc4fbe5926422c1454ed394b8 100644 (file)
@@ -28,6 +28,7 @@ router bgp 65000
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -49,6 +50,8 @@ router bgp 65000 vrf vrf_myzone
   default-originate ipv6
  exit-address-family
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
  match evpn vni 1000
  match evpn route-type prefix
index 96d89f332c844cb52e0c986d9b609b44f6e8a51c..0ee4b8ad7fb55e746ef6349ecb8ece936993829b 100644 (file)
@@ -28,6 +28,7 @@ router bgp 65000
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -49,6 +50,11 @@ router bgp 65000 vrf vrf_myzone
   default-originate ipv6
  exit-address-family
 !
+route-map MAP_VTEP_IN deny 1
+ match evpn route-type prefix
+!
+route-map MAP_VTEP_IN permit 2
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5a8fb9998151315352b51e45a80262750b21e302..2f819e519e8515ded03daa4f9613e31de08c0da3 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -28,6 +29,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5a8fb9998151315352b51e45a80262750b21e302..2f819e519e8515ded03daa4f9613e31de08c0da3 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -28,6 +29,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5a8fb9998151315352b51e45a80262750b21e302..2f819e519e8515ded03daa4f9613e31de08c0da3 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -28,6 +29,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index 5a8fb9998151315352b51e45a80262750b21e302..2f819e519e8515ded03daa4f9613e31de08c0da3 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -28,6 +29,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index ec3ce69e725ed205d15022e0e90bf1f68b595b79..4f8d7de9fa7ebc4d6c5c5328a2a1ad7067b9f146 100644 (file)
@@ -32,6 +32,7 @@ router bgp 65000
  exit-address-family
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -40,6 +41,8 @@ router bgp 65000
 router bgp 65000 vrf vrf_myzone
  bgp router-id 192.168.0.1
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty
index bcd2479922a9dbe7eafbfce635df59b05fe53a6e..60d22e3551b56d26d8829ec76ae81f7cd3a6b53b 100644 (file)
@@ -20,6 +20,7 @@ router bgp 65000
  neighbor 192.168.0.3 peer-group VTEP
  !
  address-family l2vpn evpn
+  neighbor VTEP route-map MAP_VTEP_IN in
   neighbor VTEP route-map MAP_VTEP_OUT out
   neighbor VTEP activate
   advertise-all-vni
@@ -34,6 +35,8 @@ router bgp 65000 vrf vrf_myzone
   route-target import 65003:1000
  exit-address-family
 !
+route-map MAP_VTEP_IN permit 1
+!
 route-map MAP_VTEP_OUT permit 1
 !
 line vty