Skip to content

Commit 14e27de

Browse files
committed
virtual router: Add route-maps to BGP peers for Routed Mode
It is best practice, and mandatory in newer version of FRR, that route-maps should be applied to BGP peers. This is to prevent that mistakes can propogate through a network and cause outages. This change changes the route-maps where the VR will only accept IPv4 and IPv4 default gateways (0.0.0.0/0 and ::/0) to be sent by the upstream router to the VR. The other way around this change makes sure that FRR will not allow announcing anything else than the locally defined subnets to the upstream BGP router.
1 parent 8a2c0f3 commit 14e27de

File tree

1 file changed

+51
-1
lines changed

1 file changed

+51
-1
lines changed

systemvm/debian/opt/cloud/bin/cs/CsBgpPeers.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ def process(self):
5454
self.frr_conf = CsFile(FRR_CONFIG)
5555
self.frr_conf.repopulate()
5656
self._pre_set()
57+
self._access_list_set()
5758
self._process_peers()
59+
self._route_map_set()
5860
self._post_set()
5961
if self.frr_conf.commit():
6062
restart_frr = True
@@ -75,13 +77,35 @@ def _process_dbag_item(self, item):
7577
self.peers[as_number]['ip6_peers'].append(item)
7678

7779
def _pre_set(self):
78-
self.frr_conf.add("frr version 6.0")
7980
self.frr_conf.add("frr defaults traditional")
8081
self.frr_conf.add("hostname {}".format(CsHelper.get_hostname()))
8182
self.frr_conf.add("service integrated-vtysh-config")
8283
self.frr_conf.add("ip nht resolve-via-default")
8384
return
8485

86+
def _access_list_set(self):
87+
self.frr_conf.add("ip prefix-list all-v4 seq 1 permit any")
88+
self.frr_conf.add("ip prefix-list default-v4 seq 1 permit 0.0.0.0/0")
89+
self.frr_conf.add("ipv6 prefix-list all-v6 seq 1 permit any")
90+
self.frr_conf.add("ipv6 prefix-list default-v6 seq 1 permit ::/0")
91+
92+
for as_number in self.peers.keys():
93+
if self.peers[as_number]['ip4_peers']:
94+
seq = 1
95+
ip4_cidrs = set({ip4_peer['guest_ip4_cidr'] for ip4_peer in self.peers[as_number]['ip4_peers']})
96+
for ip4_cidr in ip4_cidrs:
97+
self.frr_conf.add("ip prefix-list local-v4 seq {} permit {}".format(seq, ip4_cidr))
98+
seq += 1
99+
100+
if self.peers[as_number]['ip6_peers']:
101+
seq = 1
102+
ip6_cidrs = set({ip6_peer['guest_ip6_cidr'] for ip6_peer in self.peers[as_number]['ip6_peers']})
103+
for ip6_cidr in ip6_cidrs:
104+
self.frr_conf.add("ipv6 prefix-list local-v6 seq {} permit {}".format(seq, ip6_cidr))
105+
seq += 1
106+
107+
return
108+
85109
def _process_peers(self):
86110
for as_number in self.peers.keys():
87111
self.frr_conf.add("router bgp {}".format(as_number))
@@ -90,13 +114,17 @@ def _process_peers(self):
90114
self.frr_conf.add(" bgp default ipv6-unicast")
91115
for ip4_peer in self.peers[as_number]['ip4_peers']:
92116
self.frr_conf.add(" neighbor {} remote-as {}".format(ip4_peer['ip4_address'], ip4_peer['peer_as_number']))
117+
self.frr_conf.add(" neighbor {} route-map upstream-v4-in in")
118+
self.frr_conf.add(" neighbor {} route-map upstream-v4-out out")
93119
if 'peer_password' in ip4_peer:
94120
self.frr_conf.add(" neighbor {} password {}".format(ip4_peer['ip4_address'], ip4_peer['peer_password']))
95121
if 'details' in ip4_peer:
96122
if 'EBGP_MultiHop' in ip4_peer['details']:
97123
self.frr_conf.add(" neighbor {} ebgp-multihop {}".format(ip4_peer['ip4_address'], ip4_peer['details']['EBGP_MultiHop']))
98124
for ip6_peer in self.peers[as_number]['ip6_peers']:
99125
self.frr_conf.add(" neighbor {} remote-as {}".format(ip6_peer['ip6_address'], ip6_peer['peer_as_number']))
126+
self.frr_conf.add(" neighbor {} route-map upstream-v6-in in")
127+
self.frr_conf.add(" neighbor {} route-map upstream-v6-out out")
100128
if 'peer_password' in ip6_peer:
101129
self.frr_conf.add(" neighbor {} password {}".format(ip6_peer['ip6_address'], ip6_peer['peer_password']))
102130
if 'details' in ip6_peer:
@@ -115,5 +143,27 @@ def _process_peers(self):
115143
self.frr_conf.add(" network {}".format(ip6_cidr))
116144
self.frr_conf.add(" exit-address-family")
117145

146+
def _route_map_set(self):
147+
self.frr_conf.add("route-map upstream-v4-in permit 10")
148+
self.frr_conf.add(" match ip address prefix-list default-v4")
149+
self.frr_conf.add("route-map upstream-v4-in deny 1000")
150+
self.frr_conf.add(" match ip address prefix-list all-v4")
151+
152+
self.frr_conf.add("route-map upstream-v4-out permit 10")
153+
self.frr_conf.add(" match ip address prefix-list local-v4")
154+
self.frr_conf.add("route-map upstream-v4-out deny 1000")
155+
self.frr_conf.add(" match ip address prefix-list all-v4")
156+
157+
self.frr_conf.add("route-map upstream-v6-in permit 10")
158+
self.frr_conf.add(" match ipv6 address prefix-list default-v6")
159+
self.frr_conf.add("route-map upstream-v6-in deny 1000")
160+
self.frr_conf.add(" match ipv6 address prefix-list all-v6")
161+
162+
self.frr_conf.add("route-map upstream-v6-out permit 10")
163+
self.frr_conf.add(" match ipv6 address prefix-list local-v6")
164+
self.frr_conf.add("route-map upstream-v6-out deny 1000")
165+
self.frr_conf.add(" match ipv6 address prefix-list all-v6")
166+
return
167+
118168
def _post_set(self):
119169
self.frr_conf.add("line vty")

0 commit comments

Comments
 (0)