uvrrpd is a VRRP daemon written in C, providing an implementation of VRRPv2 (rfc3768) and VRRPv3 (rfc5798), with IPv4 and IPv6 support.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jérémy Lecour 9f813eadc9 ignore build files 2 years ago
.gitignore ignore build files 2 years ago
COPYING Initializing uvrrpd repository 4 years ago
Makefile.am Add vrrp_ctrl.c/.h module 4 years ago
README.md Improve readability of README 2 years ago
bits.h Initializing uvrrpd repository 4 years ago
common.h Add vrrp_ctrl.c/.h module 4 years ago
configure.ac Check for IPv6 multicast support in autoconf 4 years ago
list.h Initializing uvrrpd repository 4 years ago
log.c Initializing uvrrpd repository 4 years ago
log.h Initializing uvrrpd repository 4 years ago
uvrrpd.c Fix unused-result 4 years ago
uvrrpd.h Set SCHED_RR 4 years ago
vrrp.c Add --start-delay option 4 years ago
vrrp.h Add --start-delay option 4 years ago
vrrp_adv.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_adv.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_arp.c Standardize log_* format 4 years ago
vrrp_arp.h Initializing uvrrpd repository 4 years ago
vrrp_ctrl.c vrrp_ctrl.c: Fix bad cleaning of ctrl buffers 4 years ago
vrrp_ctrl.h Move vrrp_net_listen() to vrrp.c:vrrp_listen() and listen control fifo fd. Add CTRL_FIFO event. Close #1715. 4 years ago
vrrp_exec.c Set SCHED_RR 4 years ago
vrrp_exec.h Initializing uvrrpd repository 4 years ago
vrrp_ip4.c Standardize log_* format 4 years ago
vrrp_ip6.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_ipx.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_na.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_na.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_net.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_net.h Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_options.c Add configure option to disable IPv6 at compile time. By default, autodetect and enable if supported (HAVE_IP6) 4 years ago
vrrp_options.h Initializing uvrrpd repository 4 years ago
vrrp_rfc.h Initializing uvrrpd repository 4 years ago
vrrp_state.c vrrp_switch.sh: Move sysctl call to init state and install hook in vrrp_state.c. Close #1948 and close #1949. 3 years ago
vrrp_state.h Initializing uvrrpd repository 4 years ago
vrrp_switch.sh remove useless line break 2 years ago
vrrp_timer.c Standardize log_* format 4 years ago
vrrp_timer.h Add --start-delay option 4 years ago

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 !