IPv4 Static Routing
Introduction
As a L3-enabled SDN controller, baseboxd can be configured for routing purposes. Examples in this part are added to show how IP addresses (IPv4 and IPv6) and routes can be attached to certain interfaces. Managing static routes is done typically via iproute2 and systemd-networkd, and the following sections will describe this in more detail. For dynamic routing, BISDN adopted FRRouting, to support routing protocols such as BGP and OSPF.
WARNING: Configuring a Linux box to work as a router assumes that sysctl net.ipv4.conf.all.forwarding=1. BISDN Linux has this sysctl already enabled by default, but routing issues should be debugged first by checking the value for this configuration.
iproute2
Adding an IP address to a baseboxd interface is done simply by
ip link set ${PORT} up
ip address add ${IPADDRESS} dev ${PORT}
Configuring a static route on the interface via ip route:
ip route add ${DESTINATION_NETWORK}/${DESTINATION_MASK} dev ${PORT} via ${GATEWAY}
Route and IP address deletion is done via
ip address del ${IPADDRESS} dev ${PORT}
ip route del ${DESTINATION_NETWORK}/${DESTINATION_MASK} dev ${PORT} via ${GATEWAY}
systemd-networkd
IPv4 routing in systemd-networkd is done using the [Network] and [Route] sections to the port .network file. In the [Route] section, the Gateway= section must be present in the case when DHCP is not used.
10-port1.network:
[Match]
Name=${PORT}
[Network]
Address=${IPADDRESS}
[Route]
Gateway=${GATEWAY}
Destination=${DESTINATION_NETWORK}/${DESTINATION_MASK}
IPv6 Static Routing
Introduction
IPv6 is supported in BISDN Linux and baseboxd. It provides simpler network provisioning mechanism, due to address auto-configuration and the advantage of building more recent and stable networks.
IPv6 addresses are composed of 128 bits, separated by eight groups of four hexadecimal digits, for example:
FE80:0000:0000:0000:0202:B3FF:FE1E:8329 : long version
FE80::202:B3FF:FE1E:8329 : short version
Prefixes for IPv6 addresses can then be represented similarly to network masks in IPv4, with the notation
There are some specific reserved network addresses, like the fe80::/10 address family. This block is reserved to be used in Link-Local Unicast addresses, and, in combination with the MAC address of an interface is used to generate a non-routable address used to exchange Router and Neighbor Advertisements, for example.
Similarly to IPv4, there are also some Linux sysctls present to control IPv6 behavior. The forwarding sysctl, net.ipv6.conf.all.forwarding, is in BISDN Linux as well 1, allowing for the switch to forward IPv6 packets. This affects as well the net.ipv6.conf.
iproute2
Configuring IPv6 addresses in BISDN Linux, using iproute2 is done via the following commands
ip link set ${PORT} up
ip address add ${IPADDRESS} dev ${PORT}
Configuring the router to transmit RA messages is possible in several ways. One of the supported ways to transmit these messages is via the Router Advertisement Deamon (radvd). The configuration file for this daemon is present on /etc/radvd.conf.
/etc/radvd.conf:
interface ${PORT}
{
AdvSendAdvert on;
MinRtrAdvInterval 30;
MaxRtrAdvInterval 100;
prefix 2001:db8:1:0::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr off;
};
};
This configuration example selects the interface where to send the advertisements on, and the prefix it should announce. The interval between each message can also be fine tuned. For more information please read the official radvd daemon man pages.
Adding a static IPv6 route is done via
ip route add ${DESTINATION_NETWORK}/${DESTINATION_MASK} dev ${PORT} via ${GATEWAY}
So, addition and deletion of IP addresses and routes follow the same workflow as in the IPv4 case. In order to check the configured IPv6 routes, the following command must be run
ip -6 route list
Adding the -4/6 argument to the call allows to show only the desired routes/ addresses by IP protocol.
For ‘systemd-networkd’ the configuration file is done the same way.
Static route example
Here we show a simple example of using systemd-networkd to configure static routes on two switches and two servers.
+-------------------------------------------+ +-------------------------------------------+
| switch-1 | | switch-2 |
| | | |
| 10.0.1.1/24 10.0.3.1/24 | | 10.0.3.2/24 10.0.2.1/24 |
|+------------------+ +------------------+| |+------------------+ +------------------+|
|| port2 | | port54 || || port54 | | port2 ||
++------------------+---+------------------++ ++------------------+---+------------------++
| | | |
| | | |
| +-----------------------+ |
| |
| |
| |
++-----------------------------+ +----------+-------+----------++
|| eno2 | | | | eno2 ||
|+------------------+ | | +------------------+|
| 10.0.1.2/24 | | 10.0.2.2/24 |
| | | |
| server-1 | | server-2 |
+------------------------------+ +------------------------------+
The port eno2
on each server is connected to port2
on its respective switch. Both switches are connected via port54
. Simply change the port names to fit your setup.
Setup switch-1
Set port2
up and add the IP address 10.0.1.1/24.
switch-1 /etc/systemd/network/30-port2.network
[Match]
Name=port2
[Network]
Address=10.0.1.1/24
Set port54
up, add IP address 10.0.3.1 and add a route to the 10.0.2.0/24 subnet (which is on server-2
) via 10.0.3.2.
switch-1 /etc/systemd/network/30-port54.network
[Match]
Name=port54
[Network]
Address=10.0.3.1/24
[Route]
Destination=10.0.2.0/24
Gateway=10.0.3.2
Setup switch-2
Set port2
up and add IP address 10.0.2.1/24.
switch-2 /etc/systemd/network/30-port2.network
[Match]
Name=port2
[Network]
Address=10.0.2.1/24
Set port54
up, add IP address 10.0.3.2 and add a route to the 10.0.1.0/24 subnet (which is on sever-1
) via 10.0.3.1.
switch-2 /etc/systemd/network/30-port54.network
[Match]
Name=port54
[Network]
Address=10.0.3.2/24
[Route]
Destination=10.0.1.0/24
Gateway=10.0.3.1
Setup server-1
Add IP address 10.0.1.2/24 to eno2
and a route to the subnet 10.0.2.0/24 (which is on server-2
) via 10.0.1.1.
server-1 /etc/systemd/network/30-eno2.network
[Match]
Name=eno2
[Network]
Address=10.0.1.2/24
[Route]
Destination=10.0.2.0/24
Gateway=10.0.1.1
Setup server-2
Add IP address 10.0.2.2/24 to eno2
and a route to the subnet 10.0.1.0/24 (which is on server-1
) via 10.0.2.1.
server-2 /etc/systemd/network/30-eno2.network
[Match]
Name=eno2
[Network]
Address=10.0.2.2/24
[Route]
Destination=10.0.1.0/24
Gateway=10.0.2.1
Restart systemd-networkd or reboot all nodes to apply network configuration.