uvrrpd is a VRRP daemon written in C, providing a full implementation of VRRPv2 (rfc3768) and VRRPv3 (rfc5798), with IPv4 and IPv6 support.
uvrrpd is a project hosted at Evolix's forge
uvrrpd is written for GNU/Linux and use macvlan in order to derive multiple virtual NICs (virtual VRRP mac) from a single physical NIC.
uvrrpd is a simply VRRP state machine, and a script (vrrp_switch.sh) is in charge to create or destroy Virtual VRRP interfaces.
uvrrpd is designed to run a single VRRP instance, but you can run multiple instances of uvrrpd, each of them with a different VRRP id, on the same or different physical NIC.
Simple text authentication from deprecated RFC2332 may be used while running uvrrpd in version 2 (rfc3768), but not in version 3 (rfc5798).
It provides a network topology update by sending :
- an ARP gratuitous packet for each Virtual VRRP IPv4 address specified in the VRRP instance,
- an NDP neighbour advertisement for each Virtual VRRP IPv6 address.
uvrrpd uses the autotools, so to build it from the released tarball, follow the usual procedure.
./configure
make
sudo make install
If building from the git sources, run:
autoreconf -i
before that.
That's all. You need the binary uvrrpd
and the shell script vrrp_switch.sh
to start playing, they are installed in $prefix/sbin, the default prefix being
/usr/local.
$ ./uvrrpd -h
Usage: uvrrpd -v vrid -i ifname [OPTIONS] VIP1 [… VIPn]
Mandatory options:
-v, --vrid vrid Virtual router identifier
-i, --interface iface Interface
VIP Virtual IP(s), 1 to 255 VIPs
Optional arguments:
-p, --priority prio Priority of VRRP Instance, (0-255, default 100)
-t, --time delay Time interval between advertisements
Seconds in VRRPv2 (default 1s),
Centiseconds in VRRPv3 (default 100cs)
-T, --start-delay delay Use custom delay in INIT state, override masterdown
timer
Seconds in VRRPv2 (default 0s),
Centiseconds in VRRPv3 (default 0cs)
-P, --preempt on|off Switch preempt (default on)
-r, --rfc version Specify protocol 'version'
2 (VRRPv2, RFC3768) by default,
3 (VRRPv3, RFC5798)
-6, --ipv6 IPv6 support, (only in VRRPv3)
-a, --auth pass Simple text password (only in VRRPv2)
-f, --foreground Execute uvrrpd in foreground
-s, --script Path of hook script (default /usr/local/sbin/vrrp_switch.sh)
-F --pidfile name Use alternate pid file 'name'
Default /run/uvrrp_${vrid}.pid
-C --control name Use alternate control file 'name'
Default /run/uvrrpd_ctrl.${vrid}
-d, --debug
-h, --help
SIGHUP
: force uvrrpd to switch to init stateSIGUSR1
|SIGUSR2
: dump VRRP instance informations
User can send command through a control FIFO, by default in /var/run/uvrrpd_ctrl.${vrid}
Commands available:
- reload (force init state)
- stop (exit)
- state || status (dump vrrp status)
- prio X (change priority while running, and switch to init state)
# ./uvrrpd -v 42 -i eth0 10.0.0.254
# echo "prio 90" > /var/run/uvrrpd_ctrl.42
#
# tail -10 /var/log/daemon.log
[…]
uvrrpd[27820]: vrid 42 :: new prio 90 applied
uvrrpd[27820]: vrid 42 :: init
uvrrpd[27820]: vrid 42 :: init -> backup
uvrrpd[27820]: vrid 42 :: masterdown_timer expired
[…]
#
LOG_DAEMON facility
vrrp_switch.sh maintain a state file of the current instance in /tmp/state.vrrp_${vrid}_${ifname}
uvrrpd must be run as root.
- Start a VRRP instance on eth0 interface with VRID 42, default priority (100), with vrrp_switch.sh in /usr/local/sbin/ directory.
# ./uvrrpd -v 42 -i eth0 -s /usr/local/sbin/vrrp_switch.sh 10.0.0.254
In our example, no other VRRP instance, we are the master and we can see the new VRRP interface with the VIP 10.0.0.254 and the virtual VRRP mac address 00:00:5e:00:01:2a :
# ifconfig
eth0 Link encap:Ethernet HWaddr 52:54:00:4f:48:3f
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe4f:483f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4935 errors:0 dropped:0 overruns:0 frame:0
TX packets:3835 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:965166 (942.5 KiB) TX bytes:613308 (598.9 KiB)
eth0_42 Link encap:Ethernet HWaddr 00:00:5e:00:01:2a
inet addr:10.0.0.254 Bcast:0.0.0.0 Mask:255.255.255.255
inet6 addr: fe80::200:5eff:fe00:12a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3217 (3.1 KiB) TX bytes:520 (520.0 B)
[…]
See logs :
# tail -f /var/log/daemon.log
[…]
uvrrpd[2966]: vrid 42 :: init
uvrrpd[2966]: vrid 42 :: init -> backup
uvrrpd[2966]: vrid 42 :: masterdown_timer expired
uvrrpd[2966]: vrid 42 :: backup -> master
and /tmp/state.vrrp_42_eth0 :
# cat /tmp/state.vrrp_42_eth0
state master
vrid 42
ifname eth0
priority 100
adv_int 1
naddr 1
ips 10.0.0.254
You can start an another VRRP instance on another GNU/Linux box or a router with VRRP support, with the same VRID and different priority.
- uvrrpd support IPv6 (RFC5798) :
# ./uvrrpd -v 42 -i eth0 -p 90 -6 fe80::fada/64
- Multiple VIPs could be specified for a single VRRP instance (up to 255 VIPs) :
# ./uvrrpd -v 42 -i eth0 10.0.0.69 10.0.0.80
- more tests
- packaging
- ...
Any suggestions, ideas, patches or whatever are welcome and will be greatly appreciated !