How to deploy a BGP route generator? | Containerlab | ExaBGP
Hi all!
The blog post is sort of "How to ...?"
Introduction
Some time ago I needed to prepare a lab environment where I should have to simulate a huge amount of BGP updates between routers. How can we arrange that? The main thing is how to generate a lot of BGP updates? As I see we have two ways:
- VM with network OS from classic vendors (Cisco, Juniper, Nokia);
- Linux BGP daemon
Sure, BGP daemons are more scalable and suitable for lab purposes. And a lot of companies use them in production (in most cases as BGP RR). Of course, I knew about different Linux BGP daemons but didn't have experience with them. This time I followed the next simple workflow in the tech world - don't know something? Let's Googling! (don't use this way in the production environment - firstly, read tech books, user guides, RFC, etc :) )
This way I've found all that I need:
1) BGP daemon. I decided to use ExaBGP
2) Route generator. It's a simple python script route-smash that uses ExaBGP API.
As a lab environment, I'm using Containerlab. Don't know what more I can add about Containerlab. If you don't use it - I highly recommend trying. In my opinion and experience, it's the best tool for network labs. Kudos to the development team!
Lab steps
1) ExaBGP instance
Let's create ExaBGP instance. It will be a reference for the further route generators.
a) ExaBGP installation
The project has several installation ways. You can use a suitable way for you (check README).
I decided to clone the project.
Clone to any dir, further we will copy the project to Docker containers.
git clone https://github.com/Exa-Networks/exabgp exabgp
b) ExaBGP configuration
We're creating configuration as a template this time.
Config file has path:
exabgp/etc/exabgp.conf
Config file example (We will modify it for every BGP speaker.)
process gen_routes { run ./usr/bin/python3 /home/route_gen.py; encoder text; } template { neighbor test { local-as 65000; peer-as 65000; router-id 192.168.100.1; local-address 192.168.100.1; api { processes [ gen_routes ]; } } } neighbor 192.168.100.2 { inherit test; }
c) environment file
We should add one option to the environment file. Another way we will get stuck ExaBGP during route generation (I'd faced with the issue)
cat exabgp/etc/exabgp/exabgp.env [exabgp.api] ack = false
2) Route-smash
Clone route-smash project. The script is simple, but it's an advantage. Every engineer can modify it for any needs (e.g. modify route count or route generation speed). Thanks a lot, @Benjamin_Dale.
Just clone to any dir.
git clone https://github.com/dfex/route-smash.git
3) Lab environment
Containerlab has great documentation. I just mention some points of lab preparation.
Here's lab topology
a) lab description
The important point is adding "bind" parameter to the Linux container description. It helps to mount dirs from the host.
Let's mount host files to the container. The target path will be "/home
My example
name: BGP_gen topology: nodes: P1: kind: vr-sros image: vrnetlab/vr-sros:20.10.R1 type: sr-1 license: license.key P2: kind: vr-sros image: vrnetlab/vr-sros:20.10.R1 type: sr-1 license: license.key P3: kind: vr-sros image: vrnetlab/vr-sros:20.10.R1 type: sr-1 license: license.key P4: kind: vr-sros image: vrnetlab/vr-sros:20.10.R1 type: sr-1 license: license.key BGP_gen1: kind: linux image: alpine:latest binds: - BGP_gen1:/home BGP_gen2: kind: linux image: alpine:latest binds: - BGP_gen2:/home links: - endpoints: ["P1:eth1", "P2:eth1"] - endpoints: ["P1:eth2", "P3:eth1"] - endpoints: ["P2:eth2", "P4:eth1"] - endpoints: ["P3:eth2", "P4:eth2"] - endpoints: ["BGP_gen1:eth1", "P1:eth3"] - endpoints: ["BGP_gen2:eth1", "P4:eth3"]
b) project tree
We should create folders BGP_gen1 and BGP_gen2. We can put here any files that we need and they will be available inside containers:
- exabgp - it's ExaBGP project;
- route-gen.py - it's the script from route-smash
- deploy.sh - it's a tiny bash script for container deploying. It will be described further.
My example
. ├── BGP_gen1 │ ├── deploy.sh │ ├── exabgp │ └── route_gen.py ├── BGP_gen2 │ ├── deploy.sh │ ├── exabgp │ └── route_gen.py ├── BGP_gen.yml ├── clab-BGP_gen │ ├── ansible-inventory.yml │ ├── P1 │ ├── P2 │ ├── P3 │ └── P4 └── license.key
4) Container preparing
The linux node should have python3 and network configuration. Also, we should modify dir owner - /home.
We can create a simple script for every linux node.
My example
cat BGP_gen1/deploy.sh apk add python3 chown root:root /home ip address add 192.168.100.1/30 dev eth1 cat BGP_gen2/deploy.sh apk add python3 chown root:root /home ip address add 192.168.101.1/30 dev eth1
5) ExaBGP start
In this step, I just show how we can start ExaBGP daemon. As Containerlab successfully started we can jump inside containers.
sudo docker exec -it clab-BGP_gen-BGP_gen1 ash
exec deploy.sh
/ # /home/deploy.sh
Then we can start ExaBGP. At the first time, we can disable the route generation script for pure BGP testing. And after that come back to the API calls.
ExaBGP start
/home/exabgp/sbin/exabgp /home/exabgp/etc/exabgp.conf
6) Testing
Every case has its own goals. And I think my testing outputs and routers configuration couldn't be useful.
But as an example, I'll leave these here.
A:P1# show router 100 bgp summary neighbor 192.168.100.1 | match "BGP Summary" post-lines 15 BGP Summary =============================================================================== Legend : D - Dynamic Neighbor =============================================================================== Neighbor Description AS PktRcvd InQ Up/Down State|Rcv/Act/Sent (Addr Family) PktSent OutQ ------------------------------------------------------------------------------- 192.168.100.1 65000 10006 0 00h04m17s 250000/250000/0 (IPv4) 12 0 -------------------------------------------------------------------------------
250K BGP routes - not bad! :)
Conclusion
The architecture of my lab is simple, but it is suitable for my purposes. And I've made sure that Containerlab ideology is the best way for creating network environments. Especially when we use any Linux tools, daemons, etc. As a result, we get a reproducible and lightweight testing environment.
As for ExaBGP, I just looked inside a bit. It has more powerful possibilities for BGP steering than I use. I will come back to ExaBGP as required for any other investigation of BGP stack.
Comments
Post a Comment