- About this repository
- Requirements to run this repository
- Instructions to use this repository
- Credit
Free Range Routing (FRR) demo using Docker Compose
There are two ways of configuring FRR:
- Traditionally each of the daemons had its own config file. For example, zebra’s config file was
zebra.conf
. This method is deprecated. - Most deployments now use the integrated configuration mode. All configuration goes into a single file (
frr.conf
), for all daemons. This replaces the individual files likezebra.conf
orbgpd.conf
.
This repository has 2 demo. The 2 demos uses the same Dockerfile file.
- demo 1:
- Integrated configuration mode
- The docker-compose file is docker-compose-demo1.yml
- 2 FRR containers configured with these files demo1
- demo 2:
- Old configuration mode
- The docker-compose file is docker-compose-demo2.yml
- 2 FRR containers configured with these files demo2
- Install Docker
- Install Docker Compose
docker --version
Docker version 20.10.1, build 831ebea
docker-compose --version
docker-compose version 1.27.4, build 40524192
- Clone this repository
git clone https://gitlab.aristanetworks.com/emea-se-team/frrouting_demo.git
- Move to the local directory
cd frrouting_demo
- Run this command to:
- Create the networks
- Build the docker image
- Create the containers
- Start the containers
docker-compose -f docker-compose-demo1.yml up -d
Creating network "frrouting_demo_net1" with driver "bridge"
Creating network "frrouting_demo_net100" with driver "bridge"
Creating network "frrouting_demo_net200" with driver "bridge"
Creating frr200 ... done
Creating frr100 ... done
- Run these commands on the host to verify:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a74da765af56 ksator/frr:1.0 "/bin/bash /etc/frr/…" 12 seconds ago Up 10 seconds frr100
31bb4043bd89 ksator/frr:1.0 "/bin/bash /etc/frr/…" 12 seconds ago Up 9 seconds frr200
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ksator/frr 1.0 335df45c9368 About an hour ago 311MB
ubuntu 20.04 9873176a8ff5 46 hours ago 72.7MB
docker network ls | grep frr
165c0c408e97 frrouting_demo_net1 bridge local
fe458082cac9 frrouting_demo_net100 bridge local
bcaea070a399 frrouting_demo_net200 bridge local
docker-compose -f docker-compose-demo1.yml ps
Name Command State Ports
-------------------------------------------------------
frr100 /bin/bash /etc/frr/start_f ... Up
frr200 /bin/bash /etc/frr/start_f ... Up
- Run this command to get into frr100 container shell
docker exec -it frr100 bash
- Run these commands on the frr100 container
root@ad7ea78b29dd:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
358: eth1@if359: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:64:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.100.100/24 brd 192.168.100.255 scope global eth1
valid_lft forever preferred_lft forever
362: eth0@if363: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:01:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
root@ad7ea78b29dd:/# ls -l /etc/frr/
total 20
-rw-rw-r-- 1 frr frr 2580 Jun 19 21:33 daemons
-rw-rw-r-- 1 frr frr 647 Jun 19 21:33 frr.conf
-rw-rw-r-- 1 frr frr 60 Jun 19 21:33 start_frr.sh
-rw-rw-r-- 1 frr frr 3581 Jun 19 21:33 support_bundle_commands.conf
-rw-rw-r-- 1 frr frr 32 Jun 19 21:33 vtysh.conf
root@ad7ea78b29dd:/# more /etc/frr/daemons | grep bgpd=
bgpd=yes
root@ad7ea78b29dd:/# service frr status
* Status of watchfrr: running
* Status of zebra: running
* Status of bgpd: running
* Status of staticd: running
root@ad7ea78b29dd:/# ps -ef | grep frr
root 1 0 0 09:44 ? 00:00:00 /bin/bash /etc/frr/start_frr.sh
root 19 1 0 09:44 ? 00:00:00 /usr/lib/frr/watchfrr -d -F traditional zebra bgpd staticd
frr 35 1 0 09:44 ? 00:00:00 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
frr 42 1 0 09:44 ? 00:00:00 /usr/lib/frr/bgpd -d -F traditional -A 127.0.0.1
frr 51 1 0 09:44 ? 00:00:00 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
root 94 69 0 09:45 pts/0 00:00:00 grep --color=auto frr
vtysh
provides a combined frontend to all FRR daemons in a single combined session
root@ad7ea78b29dd:/# vtysh
Hello, this is FRRouting (version 7.5.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
ad7ea78b29dd# show int brief
Interface Status VRF Addresses
--------- ------ --- ---------
eth0 up default 192.168.1.100/24
eth1 up default 192.168.100.100/24
lo up default
ad7ea78b29dd# sho bgp summary
IPv4 Unicast Summary:
BGP router identifier 192.168.100.100, local AS number 65100 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 1, using 21 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
192.168.1.200 4 65200 19 18 0 0 0 00:13:28 1 1
Total number of neighbors 1
ad7ea78b29dd# sho ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
K>* 0.0.0.0/0 [0/0] via 192.168.1.1, eth0, 00:13:32
C>* 192.168.1.0/24 is directly connected, eth0, 00:13:32
C>* 192.168.100.0/24 is directly connected, eth1, 00:13:32
B>* 192.168.200.0/24 [20/0] via 192.168.1.200, eth0, weight 1, 00:13:26
ad7ea78b29dd# ping 192.168.200.200
PING 192.168.200.200 (192.168.200.200) 56(84) bytes of data.
64 bytes from 192.168.200.200: icmp_seq=1 ttl=64 time=0.382 ms
64 bytes from 192.168.200.200: icmp_seq=2 ttl=64 time=0.758 ms
^C
--- 192.168.200.200 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1018ms
rtt min/avg/max/mdev = 0.382/0.570/0.758/0.188 ms
ad7ea78b29dd# show running-config
Building configuration...
Current configuration:
!
frr version 7.5.1
frr defaults traditional
hostname ad7ea78b29dd
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
password arista
enable password arista
!
interface eth0
description to bgp peer
!
interface eth1
description LAN
!
router bgp 65100
neighbor 192.168.1.200 remote-as 65200
neighbor 192.168.1.200 password arista
!
address-family ipv4 unicast
redistribute connected
neighbor 192.168.1.200 route-map IMPORT in
neighbor 192.168.1.200 route-map EXPORT out
exit-address-family
!
route-map EXPORT permit 10
match interface eth1
!
route-map EXPORT deny 100
!
route-map IMPORT permit 10
!
line vty
!
end
ad7ea78b29dd# exit
you can telnet a daemon (if the daemon config has a password)
root@ad7ea78b29dd:/# more /etc/services | grep zebra
zebrasrv 2600/tcp # zebra service
zebra 2601/tcp # zebra vty
ripd 2602/tcp # ripd vty (zebra)
ripngd 2603/tcp # ripngd vty (zebra)
ospfd 2604/tcp # ospfd vty (zebra)
bgpd 2605/tcp # bgpd vty (zebra)
ospf6d 2606/tcp # ospf6d vty (zebra)
isisd 2608/tcp # ISISd vty (zebra)
telnet bgpd
root@ad7ea78b29dd:/# telnet localhost 2605
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello, this is FRRouting (version 7.5.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password:
ad7ea78b29dd> en
Password:
ad7ea78b29dd# sh bgp summary
IPv4 Unicast Summary:
BGP router identifier 192.168.100.100, local AS number 65100 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 1, using 21 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
192.168.1.200 4 65200 11 10 0 0 0 00:05:17 1 1
Total number of neighbors 1
ad7ea78b29dd# sho running-config
Current configuration:
!
frr version 7.5.1
frr defaults traditional
!
hostname 54124bfdab91
password arista
enable password arista
log syslog informational
!
!
!
router bgp 65100
neighbor 192.168.1.200 remote-as 65200
neighbor 192.168.1.200 password arista
!
address-family ipv4 unicast
redistribute connected
neighbor 192.168.1.200 route-map IMPORT in
neighbor 192.168.1.200 route-map EXPORT out
exit-address-family
!
!
!
route-map EXPORT permit 10
match interface eth1
route-map EXPORT deny 100
!
route-map IMPORT permit 10
!
!
line vty
!
end
ad7ea78b29dd# exit
Connection closed by foreign host.
telnet zebra
root@ad7ea78b29dd:/# telnet localhost 2601
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello, this is FRRouting (version 7.5.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password:
ad7ea78b29dd> en
Password:
ad7ea78b29dd# sh ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
K>* 0.0.0.0/0 [0/0] via 192.168.1.1, eth0, 00:06:26
C>* 192.168.1.0/24 is directly connected, eth0, 00:06:26
C>* 192.168.100.0/24 is directly connected, eth1, 00:06:26
B>* 192.168.200.0/24 [20/0] via 192.168.1.200, eth0, weight 1, 00:06:20
ad7ea78b29dd# show running-config
Current configuration:
!
frr version 7.5.1
frr defaults traditional
!
hostname 54124bfdab91
password arista
enable password arista
log syslog informational
!
!
!
!
interface eth0
description to bgp peer
!
interface eth1
description LAN
!
!
route-map EXPORT permit 10
match interface eth1
route-map EXPORT deny 100
!
route-map IMPORT permit 10
!
!
no ipv6 forwarding
!
!
!
line vty
!
end
ad7ea78b29dd# exit
Connection closed by foreign host.
root@ad7ea78b29dd:/#
Run this command to exit the frr100 container shell
root@ad7ea78b29dd:/# exit
exit
Run this command on the host to:
- Stop the containers
- Remove the containers
- Remove the networks
docker-compose -f docker-compose-demo1.yml down
Stopping frr100 ... done
Stopping frr200 ... done
Removing frr100 ... done
Removing frr200 ... done
Removing network frrouting_demo_net1
Removing network frrouting_demo_net100
Removing network frrouting_demo_net200
- Run this command to:
- Create the networks
- Build the docker image
- Create the containers
- Start the containers
docker-compose -f docker-compose-demo2.yml up -d
Creating network "frrouting_demo_net1" with driver "bridge"
Creating network "frrouting_demo_net100" with driver "bridge"
Creating network "frrouting_demo_net200" with driver "bridge"
Creating frr200 ... done
Creating frr100 ... done
- Run this command to get into frr100 container shell
docker exec -it frr100 bash
- Run these commands on the frr100 container
root@81bb8c310df9:/# ls -l /etc/frr/
total 28
-rw-rw-r-- 1 frr frr 593 Jun 19 21:33 bgpd.conf
-rw-rw-r-- 1 frr frr 2580 Jun 19 21:33 daemons
-rw-rw-r-- 1 frr frr 60 Jun 19 21:33 start_frr.sh
-rw-rw-r-- 1 frr frr 213 Jun 19 21:33 staticd.conf
-rw-rw-r-- 1 frr frr 3581 Jun 19 21:33 support_bundle_commands.conf
-rw-rw-r-- 1 frr frr 35 Jun 19 21:33 vtysh.conf
-rw-rw-r-- 1 frr frr 426 Jun 19 21:33 zebra.conf
root@81bb8c310df9:/#
vtysh
provides a combined frontend to all FRR daemons in a single combined session
root@81bb8c310df9:/# vtysh
Hello, this is FRRouting (version 7.5.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
81bb8c310df9# show bgp summary
IPv4 Unicast Summary:
BGP router identifier 192.168.100.100, local AS number 65100 vrf-id 0
BGP table version 3
RIB entries 5, using 960 bytes of memory
Peers 1, using 21 KiB of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt
192.168.1.200 4 65200 8 9 0 0 0 00:03:11 1 1
Total number of neighbors 1
81bb8c310df9# sho ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
K>* 0.0.0.0/0 [0/0] via 192.168.1.1, eth0, 00:03:16
C>* 192.168.1.0/24 is directly connected, eth0, 00:03:16
C>* 192.168.100.0/24 is directly connected, eth1, 00:03:16
B>* 192.168.200.0/24 [20/0] via 192.168.1.200, eth0, weight 1, 00:03:09
81bb8c310df9# ping 192.168.200.200
PING 192.168.200.200 (192.168.200.200) 56(84) bytes of data.
64 bytes from 192.168.200.200: icmp_seq=1 ttl=64 time=0.446 ms
64 bytes from 192.168.200.200: icmp_seq=2 ttl=64 time=0.712 ms
64 bytes from 192.168.200.200: icmp_seq=3 ttl=64 time=0.670 ms
^C
--- 192.168.200.200 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2034ms
rtt min/avg/max/mdev = 0.446/0.609/0.712/0.116 ms
81bb8c310df9# show running-config
Building configuration...
Current configuration:
!
frr version 7.5.1
frr defaults traditional
hostname 11e2fca915a9
log syslog informational
no ipv6 forwarding
hostname 81bb8c310df9
no service integrated-vtysh-config
!
password arista
enable password arista
!
interface eth0
description to bgp peer
!
interface eth1
description LAN
!
router bgp 65100
neighbor 192.168.1.200 remote-as 65200
neighbor 192.168.1.200 password arista
!
address-family ipv4 unicast
redistribute connected
neighbor 192.168.1.200 route-map IMPORT in
neighbor 192.168.1.200 route-map EXPORT out
exit-address-family
!
route-map EXPORT permit 10
match interface eth1
!
route-map EXPORT deny 100
!
route-map IMPORT permit 10
!
line vty
!
end
81bb8c310df9# exit
Run this command to exit the frr100 container shell
root@81bb8c310df9:/# exit
exit
Run this command on the host to:
- Stop the containers
- Remove the containers
- Remove the networks
docker-compose -f docker-compose-demo2.yml down
Stopping frr100 ... done
Stopping frr200 ... done
Removing frr100 ... done
Removing frr200 ... done
Removing network frrouting_demo_net1
Removing network frrouting_demo_net100
Removing network frrouting_demo_net200
Credit goes to Pierre Dezitter for his works on this topic.