====== Aggregating multiple ISP links ======
This lab shows an example of aggregating multiple independent ISP links with [[https://zehome.github.io/MLVPN/|MLVPN]].
===== Network diagram ====
Here is the concept:
{{:documentation:examples:bsdrp-lab-mlvpn-global.png|}}
And here is this lab detailed diagram:
{{:documentation:examples:bsdrp-lab-mlvpn-details.png|}}
===== Virtual Lab setup =====
This chapter will describe how to start each routers and configuring the 4 centrals routers.
More information on these BSDRP lab scripts available on [[documentation:examples:How to build a BSDRP router lab]].
Start the Virtual lab (example using bhyve):
# ./tools/BSDRP-lab-bhyve.sh -n 6
BSD Router Project (http://bsdrp.net) - bhyve full-meshed lab script
Setting-up a virtual lab with 6 VM(s):
- Working directory: /root/BSDRP-VMs
- Each VM has a total of 1 (1 cores and 1 threads) and 512M RAM
- Emulated NIC: virtio-net
- Switch mode: bridge + tap
- 0 LAN(s) between all VM
- Full mesh Ethernet links between each VM
VM 1 has the following NIC:
- vtnet0 connected to VM 2
- vtnet1 connected to VM 3
- vtnet2 connected to VM 4
- vtnet3 connected to VM 5
- vtnet4 connected to VM 6
VM 2 has the following NIC:
- vtnet0 connected to VM 1
- vtnet1 connected to VM 3
- vtnet2 connected to VM 4
- vtnet3 connected to VM 5
- vtnet4 connected to VM 6
VM 3 has the following NIC:
- vtnet0 connected to VM 1
- vtnet1 connected to VM 2
- vtnet2 connected to VM 4
- vtnet3 connected to VM 5
- vtnet4 connected to VM 6
VM 4 has the following NIC:
- vtnet0 connected to VM 1
- vtnet1 connected to VM 2
- vtnet2 connected to VM 3
- vtnet3 connected to VM 5
- vtnet4 connected to VM 6
VM 5 has the following NIC:
- vtnet0 connected to VM 1
- vtnet1 connected to VM 2
- vtnet2 connected to VM 3
- vtnet3 connected to VM 4
- vtnet4 connected to VM 6
VM 6 has the following NIC:
- vtnet0 connected to VM 1
- vtnet1 connected to VM 2
- vtnet2 connected to VM 3
- vtnet3 connected to VM 4
To connect VM'serial console, you can use:
- VM 1 : cu -l /dev/nmdm-BSDRP.1B
- VM 2 : cu -l /dev/nmdm-BSDRP.2B
- VM 3 : cu -l /dev/nmdm-BSDRP.3B
- VM 4 : cu -l /dev/nmdm-BSDRP.4B
- VM 5 : cu -l /dev/nmdm-BSDRP.5B
- VM 6 : cu -l /dev/nmdm-BSDRP.6B
==== Backbone routers configuration ====
=== Router 2 ===
Router 2 is configured for rate-limiting traffic at 10 Mb/s on interface to/from VM1.
sysrc hostname=VM2 \
ifconfig_vtnet0="inet 10.0.12.2/24" \
ifconfig_vtnet3="inet 10.0.25.2/24" \
defaultrouter="10.0.25.5" \
firewall_enable=YES \
firewall_script="/etc/ipfw.rules"
cat > /etc/ipfw.rules <
=== Router 3 ===
Router 3 is configured for rate-limiting traffic at 10 Mb/s on interface to/from VM1.
sysrc hostname=VM3 \
ifconfig_vtnet0="inet 10.0.13.3/24" \
ifconfig_vtnet3="inet 10.0.35.3/24" \
defaultrouter="10.0.35.5" \
firewall_enable=YES \
firewall_script="/etc/ipfw.rules"
cat > /etc/ipfw.rules <
=== Router 4 ===
Router 4 is configured for rate-limiting traffic at 10 Mb/s on interface to/from VM1.
sysrc hostname=VM4 \
ifconfig_vtnet0="inet 10.0.14.4/24" \
ifconfig_vtnet3="inet 10.0.45.4/24" \
defaultrouter="10.0.45.5" \
firewall_enable=YES \
firewall_script="/etc/ipfw.rules"
cat > /etc/ipfw.rules <
=== Router 5 ===
Router 5 is the aggregating server's default gateway.
sysrc hostname=R5 \
ifconfig_vtnet1="inet 10.0.25.5/24" \
ifconfig_vtnet2="inet 10.0.35.5/24" \
ifconfig_vtnet3="inet 10.0.45.5/24" \
ifconfig_vtnet4="inet 10.0.56.5/24" \
static_routes="ISP1 ISP2 ISP3" \
route_ISP1="-host 10.0.12.1 10.0.25.2" \
route_ISP2="-host 10.0.13.1 10.0.35.3" \
route_ISP3="-host 10.0.14.1 10.0.45.4"
service netif restart
service routing restart
hostname VM5
config save
==== Router 1 : MLVPN client ====
Router 1 is configured as a MLVPN client router connected to 3 different Internet links.
We need a default routes for each ISP links, then a minimum of 4 different routing tables.
sysrc hostname=VM1 \
cloned_interfaces="lo1" \
ifconfig_lo1="inet 10.1.1.1/32" \
ifconfig_vtnet0="inet 10.0.12.1/24 fib 2" \
ifconfig_vtnet1="inet 10.0.13.1/24 fib 3" \
ifconfig_vtnet2="inet 10.0.14.1/24 fib 4" \
static_routes="ISP1 ISP2 ISP3" \
route_ISP1="-fib 2 default 10.0.12.2" \
route_ISP2="-fib 3 default 10.0.13.3" \
route_ISP3="-fib 4 default 10.0.14.4"
cat < /usr/local/etc/mlvpn/mlvpn.conf
[general]
statuscommand = "/usr/local/etc/mlvpn/mlvpn_updown.sh"
mode = "client"
mtu = 1452
tuntap = "tun"
ip4 = "10.0.16.1/30"
ip4_gateway = "10.0.16.2"
ip4_routes = "10.6.6.6/32"
timeout = 30
password = "pleasechangeme!"
#reorder_buffer_size = 64
loss_tolerence = 10
[dsl2]
bindhost = "10.0.12.1"
bindport = 5082
bindfib = 2
remotehost = "10.0.56.6"
remoteport = 5082
[dsl3]
bindhost = "10.0.13.1"
bindport = 5083
bindfib = 3
remotehost = "10.0.56.6"
remoteport = 5083
[dsl4]
bindhost = "10.0.14.1"
bindport = 5084
bindfib = 4
remotehost = "10.0.56.6"
remoteport = 5084
EOF
service mlvpn enable
service netif restart
service routing restart
service mlvpn start
hostname VM1
config save
==== Router 6 : MLVPN server ====
Router 6 is configured as a aggregating server.
sysrc hostname=VM6 \
cloned_interfaces="lo1" \
ifconfig_lo1="inet 10.6.6.6/32" \
ifconfig_vtnet4="inet 10.0.56.6/24" \
defaultrouter="10.0.56.5"
cat > /usr/local/etc/mlvpn/mlvpn.conf <
===== Basic Tests =====
==== FIB test ====
Start by checking that R5 is reacheable from each R1's fib (2, 3):
[root@VM1]~# setfib 2 ping -c 2 10.0.56.6
PING 10.0.56.6 (10.0.56.6): 56 data bytes
64 bytes from 10.0.56.6: icmp_seq=0 ttl=62 time=16.473 ms
64 bytes from 10.0.56.6: icmp_seq=1 ttl=62 time=20.017 ms
--- 10.0.56.6 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 16.473/18.245/20.017/1.772 ms
[root@VM1]~# setfib 3 ping -c 2 10.0.56.6
PING 10.0.56.6 (10.0.56.6): 56 data bytes
64 bytes from 10.0.56.6: icmp_seq=0 ttl=62 time=18.202 ms
64 bytes from 10.0.56.6: icmp_seq=1 ttl=62 time=11.193 ms
--- 10.0.56.6 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.193/14.698/18.202/3.504 ms
[root@VM1]~# setfib 4 ping -c 2 10.0.56.6
PING 10.0.56.6 (10.0.56.6): 56 data bytes
64 bytes from 10.0.56.6: icmp_seq=0 ttl=62 time=10.973 ms
64 bytes from 10.0.56.6: icmp_seq=1 ttl=62 time=14.465 ms
--- 10.0.56.6 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 10.973/12.719/14.465/1.746 ms
==== Links bandwidth ====
Test bandwidth of each link by starting an iperf on MLVPN server:
[root@VM6]# iperf3 -s
Then from the MLVPN client, test bandwidth for each ISP links:
[root@VM1]~# setfib 2 iperf3 -c 10.0.56.6
(...)
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 11.5 MBytes 9.62 Mbits/sec 0 sender
[ 5] 0.00-10.06 sec 11.4 MBytes 9.53 Mbits/sec receiver
[root@VM1]~# setfib 3 iperf3 -c 10.0.56.6
(...)
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 11.4 MBytes 9.57 Mbits/sec 3 sender
[ 5] 0.00-10.06 sec 11.4 MBytes 9.47 Mbits/sec receiver
[root@VM1]~# setfib 4 iperf3 -c 10.0.56.6
Connecting to host 10.0.56.6, port 5201
(...)
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 11.5 MBytes 9.62 Mbits/sec 0 sender
[ 5] 0.00-10.06 sec 11.4 MBytes 9.53 Mbits/sec receiver
===== MLVPN tests =====
==== tunnel ====
MLVPN can be started in debug mode:
[root@VM1]~# mlvpn --debug -n mlvpn -u mlvpn --config /usr/local/etc/mlvpn/mlvpn.conf
2020-02-21T21:25:12 [INFO/config] new password set
2020-02-21T21:25:12 [INFO/config] dsl2 tunnel added
2020-02-21T21:25:12 [INFO/config] dsl3 tunnel added
2020-02-21T21:25:12 [INFO/config] dsl4 tunnel added
2020-02-21T21:25:12 [INFO] created interface `tun0'
2020-02-21T21:25:12 [INFO] dsl2 bind to 10.0.12.1
2020-02-21T21:25:12 [INFO] dsl3 bind to 10.0.13.1
2020-02-21T21:25:12 [INFO] dsl4 bind to 10.0.14.1
2020-02-21T21:25:12 [INFO/protocol] dsl2 authenticated
2020-02-21T21:25:12 [INFO/protocol] dsl3 authenticated
2020-02-21T21:25:12 [INFO/protocol] dsl4 authenticated
tun interface need to be check (correct IP address and non-1500 MTU):
[root@VM1]~# ifconfig tun0
tun0: flags=8051 metric 0 mtu 1452
options=80000
inet6 fe80::5a9c:fcff:fe01:201%tun0 prefixlen 64 scopeid 0x9
inet 10.0.16.1 --> 10.0.16.2 netmask 0xfffffffc
groups: tun
nd6 options=21
Opened by PID 92891
And static route(s) needs to be installed (10.5.5.5/32 in this example):
[root@VM1]~# route get 10.6.6.6
route to: 10.6.6.6
destination: 10.6.6.6
mask: 255.255.255.255
gateway: 10.0.16.2
fib: 0
interface: tun0
flags:
recvpipe sendpipe ssthresh rtt,msec mtu weight expire
0 0 0 0 1452 1 0
==== Aggregated bandwidth ====
Check that aggregated bandwitdh is 10+10+10 = 30Mbit/s on this lab.
[root@VM1]~# iperf3 -B 10.1.1.1 -c 10.6.6.6
(...)
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 7.89 MBytes 6.62 Mbits/sec 428 sender
[ 5] 0.00-10.01 sec 7.85 MBytes 6.58 Mbits/sec receiver
Ouch, not the expected performance :-(