What is FRRouting?

Free Range Routing (FRR) is a free and open source routing protocol suit for UNIX/Linux platforms forked from Quagga. FRR implements a variety of routing protocols such as BGP/OSPF/RIP/MPLS. It also supports Cisco’s own EIGRP.

Link

FRRouting Web Site

This article is based on the following article on the GNS3 website. “Create a Router with Docker and Free Range Routing”

You can add an FRR container to GNS3 and use it as a software router. This page explains how to add an FRR container and provides an example of interconnection with a Cisco IOS router.

Note that this article is based on the following environment.

Host OSWindows10 Pro
GNS3 version2.2.17
GNS3 VM version2.2.17
Virtualization hypervisorVMware Workstation 16.6.2

How to add FRR containers

The steps to add the FRR container in GNS3 and use it as a software router are as follows.

  1. Create the FRR Container Template
  2. Add an FRR container to the project
  3. Start the FRR container

Create the FRR Container Template

In order to use FRR containers in GNS3, first create a template. Go to [Edit]->[Preference]->[Docker Containers] and click [New].

Select [Run this Docker container on the GNS3 VM] and click [Next].

Select [New Image] and enter “frrouting/frr:latest” in the [Image name] field, then click [Next].

Then, enter the arbitrary display name for the template and click [Next].

Then, decide on the number of network interfaces (Adapters), and click [Next]. Since we will be using it as a router, we will make it more than two network interfaces.

Enter the command to be executed at startup. Enter “sh” to start a shell.

Specify the console type. You can leave the default “telnet”.

You can specify environment variables if necessary. Click [Finish] to finish creating the template.

Add an FRR container to the project

Once you have created a Docker container template for FRR, it will appear in the [End Device] toolbar.

Drag and drop the FRR template onto your workspace. The docker pull command will be automatically executed on the GNS3 VM and the specified container image will be downloaded from Docker Hub to the GNS3 VM. The container image will be downloaded only for the first time, and the log of the docker pull command being executed will be displayed on the GNS3 console.

After that, you just need to establish a link between your router or other devices and the FRR container.

Start the FRR container

Once you have placed the FRR container in your project, start it up. Then, double-click on the icon to connect to the console. Manually start the required routing daemon from the shell; the FRR library is located in /usr/lib/frr. Go to /usr/lib/frr and start the required routing daemon. Enter a command similar to the following

cd /usr/lib/frr
./watchfrr zebra ospfd &

The above command example starts three daemons. “watchfrr” monitors other daemons in FRR. “zebra” does basic IP routing. The “ospfd” daemon performs OSPFv2 routing. If there are any other routing daemons you need, start them as well. “&” to run the daemon in the background. After starting the daemon, press Enter to return to the shell.

FRR-1 console is now available... Press RETURN to get started.
/ # cd /usr/lib/frr
/usr/lib/frr # ./watchfrr zebra ospfd &
/usr/lib/frr # 2022/01/26 02:00:24 WATCHFRR: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/watchfrr.46": File exists
2022/01/26 02:00:24 WATCHFRR: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 WATCHFRR: [T83RR-8SM5G] watchfrr 8.1_git starting: vty@0
2022/01/26 02:00:24 WATCHFRR: [ZCJ3S-SPH5S] zebra state -> down : initial connection attempt failed
2022/01/26 02:00:24 WATCHFRR: [ZCJ3S-SPH5S] ospfd state -> down : initial connection attempt failed
2022/01/26 02:00:24 WATCHFRR: [YFT0P-5Q5YX] Forked background command [pid 47]: /usr/lib/frr/watchfrr.sh restart all
Cannot stop staticd: pid 65 not running
Cannot stop zebra: pid 60 not running
2022/01/26 02:00:24 ZEBRA: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/zebra.59": File exists
2022/01/26 02:00:24 ZEBRA: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 ZEBRA: [NNACN-54BDA][EC 4043309110] Disabling MPLS support (no kernel support)
2022/01/26 02:00:24 STATIC: [ZG9QC-QRCJZ] failed to mkdir "/var/tmp/frr/staticd.64": File exists
2022/01/26 02:00:24 STATIC: [M1DC0-ZDNYJ] crashlog and per-thread log buffering unavailable!
2022/01/26 02:00:24 WATCHFRR: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
2022/01/26 02:00:29 WATCHFRR: [YFT0P-5Q5YX] Forked background command [pid 67]: /usr/lib/frr/watchfrr.sh restart ospfd
Cannot stop ospfd: pid 88 not running
2022/01/26 02:00:29 WATCHFRR: [QDG3Y-BY5TN] ospfd state -> up : connect succeeded
2022/01/26 02:00:29 WATCHFRR: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify

/usr/lib/frr #

You can then use the vtysh command to launch a Cisco IOS-like interactive shell.

vtysh

The log when you enter the vtysh command will look like this

/usr/lib/frr # vtysh
% Can't open configuration file /etc/frr/vtysh.conf due to 'No such file or directory'.

Hello, this is FRRouting (version 8.1_git).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

FRR-1#

After that, you can configure the router with the same commands as Cisco IOS.

Link

For detailed information on how to configure FRRouting and the commands of each daemon, please refer to the official website.

Interconnecting FRR and Cisco IOS

The following simple network diagram will be used to interconnect FRR and Cisco IOS. Uses OSPFv2 as the routing protocol.

In my environment, EIGRP did not work well. Therefore, I am verifying the interconnection using OSPFv2.

Configuration of FRR-1

interface eth0
 ip address 192.168.0.1/24
exit
!
interface eth1
 ip address 192.168.1.254/24
exit
!
router ospf
 network 192.168.0.0/24 area 0
 network 192.168.1.0/24 area 0
exit

Configuration of IOS-1

interface FastEthernet0/0
 ip address 192.168.0.2 255.255.255.0
 no shutdown
!
interface FastEthernet0/1
 ip address 192.168.2.254 255.255.255.0
 no shutdown
!
router ospf 1
 log-adjacency-changes
 network 192.168.0.0 0.0.255.255 area 0

Verify routing table and communication

The routing table on FRR-1 looks like this

FRR-1# show 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, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

O   192.168.0.0/24 [110/10000] is directly connected, eth0, weight 1, 00:01:05
C>* 192.168.0.0/24 is directly connected, eth0, 00:01:53
O   192.168.1.0/24 [110/10000] is directly connected, eth1, weight 1, 00:01:48
C>* 192.168.1.0/24 is directly connected, eth1, 00:01:53
O>* 192.168.2.0/24 [110/10010] via 192.168.0.2, eth0, weight 1, 00:01:00

The routing table on IOS-1 looks like this

IOS-1#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

C    192.168.0.0/24 is directly connected, FastEthernet0/0
O    192.168.1.0/24 [110/10010] via 192.168.0.1, 00:01:44, FastEthernet0/0
C    192.168.2.0/24 is directly connected, FastEthernet0/1

The necessary OSPF routes have been registered in the routing tables of FRR-1 and IOS-1, so communication between PC1 and PC2 is possible. when a ping is executed from PC1 to PC2, a response is returned. Pinging from PC1 to PC2 will result in a response.

PC1> ping 192.168.2.100
84 bytes from 192.168.2.100 icmp_seq=1 ttl=62 time=31.817 ms
84 bytes from 192.168.2.100 icmp_seq=2 ttl=62 time=32.801 ms
84 bytes from 192.168.2.100 icmp_seq=3 ttl=62 time=31.506 ms
84 bytes from 192.168.2.100 icmp_seq=4 ttl=62 time=31.073 ms
84 bytes from 192.168.2.100 icmp_seq=5 ttl=62 time=30.563 ms