uvrrpd is a VRRP daemon written in C, providing an implementation of VRRPv2 (rfc3768) and VRRPv3 (rfc5798), with IPv4 and IPv6 support.
Go to file
Jérémy Lecour 9f813eadc9 ignore build files 2017-11-30 23:34:36 +01:00
.gitignore ignore build files 2017-11-30 23:34:36 +01:00
COPYING Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
Makefile.am Add vrrp_ctrl.c/.h module 2016-01-18 15:22:40 +01:00
README.md Improve readability of README 2017-11-30 23:30:48 +01:00
bits.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
common.h Add vrrp_ctrl.c/.h module 2016-01-18 15:22:40 +01:00
configure.ac Check for IPv6 multicast support in autoconf 2016-01-26 11:21:58 +01:00
list.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
log.c Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
log.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
uvrrpd.c Fix unused-result 2016-01-29 00:06:20 +01:00
uvrrpd.h Set SCHED_RR 2016-01-24 21:45:18 +01:00
vrrp.c Add --start-delay option 2016-01-18 18:44:39 +01:00
vrrp.h Add --start-delay option 2016-01-18 18:44:39 +01:00
vrrp_adv.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_adv.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_arp.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_arp.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_ctrl.c vrrp_ctrl.c: Fix bad cleaning of ctrl buffers 2016-01-19 16:31:18 +01:00
vrrp_ctrl.h Move vrrp_net_listen() to vrrp.c:vrrp_listen() and listen control fifo fd. Add CTRL_FIFO event. Close #1715. 2016-01-18 15:33:41 +01:00
vrrp_exec.c Set SCHED_RR 2016-01-24 21:45:18 +01:00
vrrp_exec.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_ip4.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_ip6.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_ipx.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_na.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_na.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_net.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_net.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_options.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 2016-01-25 21:38:29 +01:00
vrrp_options.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_rfc.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_state.c vrrp_switch.sh: Move sysctl call to init state and install hook in vrrp_state.c. Close #1948 and close #1949. 2016-08-20 14:13:40 +02:00
vrrp_state.h Initializing uvrrpd repository 2015-09-10 00:45:29 +02:00
vrrp_switch.sh remove useless line break 2017-11-30 23:31:07 +01:00
vrrp_timer.c Standardize log_* format 2015-09-16 01:03:04 +02:00
vrrp_timer.h Add --start-delay option 2016-01-18 18:44:39 +01:00

README.md

uvrrpd

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.

Building

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.

Usage

$ ./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

Signals

  • SIGHUP : force uvrrpd to switch to init state
  • SIGUSR1|SIGUSR2 : dump VRRP instance informations

Control fifo

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

LOG_DAEMON facility

vrrp_switch.sh maintain a state file of the current instance in /tmp/state.vrrp_${vrid}_${ifname}

Examples

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

TODOs

  • more tests
  • packaging
  • ...

Any suggestions, ideas, patches or whatever are welcome and will be greatly appreciated !