Table of Contents

Simple uCarp lab

This lab use the fixed ucarp rc script (introduced in BSDRP 0.34).

Network Diagram

Creating the lab with VirtualBox

Start a lab using the virtualbox-lab script:

[root@d630]./virtualbox.sh -i BSDRP_0.34_full_i386_serial.img.bz2 -n 4 -l 2
Bzipped image detected, unzip it...
filename guests a i386 image
filename guests a serial image
Image file given… rebuilding BSDRP router template
Creating lab with 4 router(s):
- 2 LAN between all routers
- Full mesh ethernet point-to-point link between each routers

Router1 have the following NIC:
em0 connected to Router2.
em1 connected to Router3.
em2 connected to Router4.
em3 connected to LAN number 1.
em4 connected to LAN number 2.
Router2 have the following NIC:
em0 connected to Router1.
em1 connected to Router3.
em2 connected to Router4.
em3 connected to LAN number 1.
em4 connected to LAN number 2.
Router3 have the following NIC:
em0 connected to Router1.
em1 connected to Router2.
em2 connected to Router4.
em3 connected to LAN number 1.
em4 connected to LAN number 2.
Router4 have the following NIC:
em0 connected to Router1.
em1 connected to Router2.
em2 connected to Router3.
em3 connected to LAN number 1.
em4 connected to LAN number 2.
Connect to the router 1 by telneting to localhost on port 8001
Connect to the router 2 by telneting to localhost on port 8002
Connect to the router 3 by telneting to localhost on port 8003
Connect to the router 4 by telneting to localhost on port 8004
Connect to the router 4 by telneting to localhost on port 8005
Here is how to use a serial terminal software for connecting to the routers:
1. Create a bridge between the socat port and a local PTY link
   socat TCP-CONNECT:localhost:8001 PTY,link=/tmp/router1 &
2. Open your serial terminal software using the local PTY link just created
   Using screen/byobu:
       screen /tmp/router1 38400
   Or using tip (FreeBSD):
       echo "router1:dv=/tmp/router1:br#38400:pa=none:" >> /etc/remote
       tip router1
Warning: Closing your session will close socat on both end

Configuring Routers

Router 1 (R1)

sysrc hostname=R1
sysrc gateway_enable=NO
sysrc ipv6_gateway_enable=NO
sysrc defaultrouter="192.168.10.254"
sysrc ifconfig_em3="192.168.10.1/24"
service netif restart
service routing restart

Router 2 (R2)

sysrc hostname=R2
sysrc ifconfig_em3="192.168.10.2/24"
sysrc ifconfig_em4="10.0.0.2/24"
sysrc ucarp_enable=YES
sysrc ucarp_3_if="em3"
sysrc ucarp_3_src="192.168.10.2"
sysrc ucarp_3_pass="passcarp3"
sysrc ucarp_3_preempt="NO"
sysrc ucarp_3_addr="192.168.10.254"
sysrc ucarp_4_if="em4"
sysrc ucarp_4_src="10.0.0.2"
sysrc ucarp_4_pass="passcarp4"
sysrc ucarp_4_preempt="NO"
sysrc ucarp_4_addr="10.0.0.254"
service netif restart
service routing restart
service ucarp start

Router 3 (R3)

sysrc hostname=R3
sysrc ifconfig_em3="192.168.10.3/24"
sysrc ifconfig_em4="10.0.0.3/24"
sysrc ucarp_enable="YES"
sysrc ucarp_3_if="em3"
sysrc ucarp_3_src="192.168.10.3"
sysrc ucarp_3_pass="passcarp3"
sysrc ucarp_3_preempt="NO"
sysrc ucarp_3_addr="192.168.10.254"
sysrc ucarp_3_advskew="100"
sysrc ucarp_4_if="em4"
sysrc ucarp_4_src="10.0.0.3"
sysrc ucarp_4_pass="passcarp4"
sysrc ucarp_4_preempt="NO"
sysrc ucarp_4_addr="10.0.0.254"
sysrc ucarp_4_advskew="100"
service netif restart
service routing restart
service ucarp start

Router 4 (R4)

sysrc hostname=R4
sysrc gateway_enable=NO
sysrc defaultrouter="10.0.0.254"
sysrc ifconfig_em4="10.0.0.4/24"
service netif restart
service routing restart
config save

Checking configuration

uCarp state

On R2:

[root@R2]~#cat /var/log/messages | grep ucarp
Jul 27 17:54:02 R2 ucarp[1815]: [WARNING] Switching to state: MASTER
Jul 27 17:54:02 R2 ucarp[1815]: [WARNING] Spawning [/usr/local/sbin/ucarp-up em3 192.168.10.254]
Jul 27 17:54:02 R2 ucarp[1819]: [WARNING] Switching to state: MASTER
Jul 27 17:54:02 R2 ucarp[1819]: [WARNING] Spawning [/usr/local/sbin/ucarp-up em4 10.0.0.254]

R2 is the uCarp master for vrid 3 and 4.

On R3:

[root@R3]~#cat /var/log/messages | grep ucarp
Jul 29 01:03:11 R3 ucarp[1228]: [WARNING] Switching to state: BACKUP
Jul 29 01:03:11 R3 ucarp[1228]: [WARNING] Spawning [/usr/local/sbin/ucarp-down em4 10.0.0.254]
k to BACKUP state
Jul 29 01:03:11 R3 ucarp[1225]: [WARNING] Switching to state: BACKUP
Jul 29 01:03:11 R3 ucarp[1225]: [WARNING] Spawning [/usr/local/sbin/ucarp-down em3 192.168.10.254]
Jul 29 01:03:11 R3 ucarp[1225]: [WARNING] Preferred master advertised: going back to BACKUP state

R3 is the uCarp backup for vrid 3 and 4.

Forwarding and ARP state

Pinging R4 from R1:

[root@R1]~#ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: icmp_seq=0 ttl=63 time=2.932 ms
64 bytes from 10.0.0.4: icmp_seq=1 ttl=63 time=2.360 ms

And checking ARP cache:

[root@R1]~#arp -a | grep 192.168.10.254
? (192.168.10.254) at cc:cc:00:00:01:02 on em3 expires in 1186 seconds [ethernet]
The MAC address of the virtual CARP IP is the real MAC of the interface in MASTER state (and not a virtual MAC adress) due to the IP alias creation on the MASTER node: Gratious ARP is needed when switching carp state between two node

Testing uCarp failover

Disable one interface on R2 for changing the VRRP states:

[root@R2]~#ifconfig em3 down
[root@R2]~#cat /var/log/messages | grep ucarp
Jul 27 17:53:59 R2 ucarp[1815]: [WARNING] Switching to state: BACKUP
Jul 27 17:53:59 R2 ucarp[1815]: [WARNING] Spawning [/usr/local/sbin/ucarp-down e
Jul 29 01:03:11 R2 ucarp[1815]: [WARNING] Non-preferred master advertising: reasserting control of VIP with another gratuitous arp
Jul 29 01:03:12 R2 ucarp[1819]: [WARNING] Non-preferred master advertising: reasserting control of VIP with another gratuitous arp
Jul 29 01:03:12 R2 ucarp[1815]: [WARNING] Non-preferred master advertising: reasserting control of VIP with another gratuitous arp

And check that R3 became the master:

[root@R3]~#tail -f /var/log/messages
Jul 29 00:56:37 R3 ucarp[1225]: [WARNING] Switching to state: MASTER
Jul 29 00:56:37 R3 ucarp[1225]: [WARNING] Spawning [/usr/local/sbin/ucarp-up em3 192.168.10.254]

And check that R1 still can reach R4:

[root@R1]~#ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4): 56 data bytes
64 bytes from 10.0.0.4: icmp_seq=0 ttl=63 time=2.321 ms
64 bytes from 10.0.0.4: icmp_seq=1 ttl=63 time=2.450 ms