Giter Club home page Giter Club logo

uvrrpd's Introduction

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 !

uvrrpd's People

Contributors

jlecour avatar o0n avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.