vrrp

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 19, 2022 License: MIT Imports: 14 Imported by: 0

README

vrrp-go

由golang实现的VRRP-v3, 点击超链接获取关于VRRP的信息。

VRRP-v3 implemented by golang,click hyperlink get details about VRRP

Platforms support

Only linux is currently supported and tested.

Dependencies

In order to forward virtual IP traffic to local IP, iptables binary is required.

Example

package main

import (
	"context"
	"flag"
	"fmt"
	"net"
	"net/http"
	"os"
	"os/signal"
	"time"

	"github.com/sirupsen/logrus"

	vrrp "go.linka.cloud/vrrp-go"
)

var (
	vrid     int
	priority int
	iface    string
	preemt   bool
)

func init() {
	flag.IntVar(&vrid, "vrid", 233, "virtual router id")
	flag.IntVar(&priority, "pri", 100, "router priority")
	flag.StringVar(&iface, "iface", "eth0", "network interface")
	flag.BoolVar(&preemt, "preempt", false, "set preempt mode")
}

func main() {
	vips := []string{"172.17.0.42", "172.17.0.43"}
	log := logrus.StandardLogger()
	flag.Parse()
	vrrp.SetLogLevel(logrus.InfoLevel)
	var ips []net.IP
	for _, v := range vips {
		ips = append(ips, net.ParseIP(v))
	}
	vr, err := vrrp.NewVirtualRouter(
		vrrp.WithVRID(byte(vrid)),
		vrrp.WithInterface(iface),
		vrrp.WithAdvInterval(100*time.Millisecond),
		vrrp.WithPriority(byte(priority)),
		vrrp.WithMasterAdvInterval(100*time.Millisecond),
		vrrp.WithPreemtpMode(preemt),
		vrrp.WithIPvXAddr(ips...),
	)
	if err != nil {
		log.Fatal(err)
	}
	var hctx context.Context
	var hcancel func()
	handle := func(t vrrp.Transition) {
		switch t {
		case vrrp.Backup2Master:
			log.Info("init to master")
			hctx, hcancel = context.WithCancel(context.Background())
			go run(hctx)
		case vrrp.Master2Init:
			log.Info("master to init")
			hcancel()
		case vrrp.Master2Backup:
			log.Info("master to backup")
			hcancel()
		}
	}
	ch := make(chan vrrp.Transition, 10)
	go vr.StartWithEventSelector(ch)
	sigs := make(chan os.Signal)
	signal.Notify(sigs, os.Kill, os.Interrupt)
	for {
		select {
		case t := <-ch:
			handle(t)
		case s := <-sigs:
			fmt.Println()
			if hcancel != nil {
				hcancel()
			}
			log.Warnf("received: %v", s)
			log.Warn("exiting...")
			vr.Stop()
			os.Exit(1)
		}
	}

}

func run(ctx context.Context) {
	errs := make(chan error, 1)
	mux := http.NewServeMux()
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		logrus.Infof(r.RemoteAddr)
		w.Write([]byte("ok"))
	})
	srv := http.Server{
		Addr:    ":8888",
		Handler: mux,
	}
	go func() {
		errs <- srv.ListenAndServe()
	}()
	for {
		select {
		case err := <-errs:
			logrus.WithError(err).Error("web server stopped")
		case <-ctx.Done():
			logrus.Warn(ctx.Err())
			srv.Shutdown(context.Background())
			return
		}
	}
}

GOOS=linux go build -o vr example/main.go
#execute on host1
./vr -vrid=200 -pri=150
#execute on host2
./vr -vrid=200 -pri=230

Documentation

Index

Constants

View Source
const (
	IPv4 = 4
	IPv6 = 6
)
View Source
const (
	INIT = iota
	MASTER
	BACKUP
)
View Source
const (
	MultiTTL         = 255
	IPProtocolNumber = 112
)
View Source
const EventChannelSize = 1
View Source
const PacketQueueSize = 1000

Variables

View Source
var BroadcastHADDR, _ = net.ParseMAC("ff:ff:ff:ff:ff:ff")
View Source
var MultiAddrIPv4 = net.IPv4(224, 0, 0, 18)
View Source
var MultiAddrIPv6 = net.ParseIP("FF02:0:0:0:0:0:0:12")

Functions

func SetLogLevel

func SetLogLevel(level logrus.Level)

Types

type AddrAnnouncer

type AddrAnnouncer interface {
	AnnounceAll(vr *VirtualRouter) error
}

type AddrResponder added in v0.2.0

type AddrResponder interface {
	Respond(ctx context.Context, vr *VirtualRouter) error
}

type AddrSpeaker added in v0.2.0

type AddrSpeaker interface {
	AddrAnnouncer
	AddrResponder
}

type Event

type Event byte
const (
	EventShutdown Event = iota
	EventStart
)

func (Event) String

func (e Event) String() string

type IPConnection

type IPConnection interface {
	WriteMessage(*VRRPPacket) error
	ReadMessage() (*VRRPPacket, error)
}

func NewIPv4Conn

func NewIPv4Conn(local, remote net.IP) (IPConnection, error)

type IPv4AddrAnnouncer

type IPv4AddrAnnouncer struct {
	// contains filtered or unexported fields
}

func NewIPv4AddrAnnouncer

func NewIPv4AddrAnnouncer(nif *net.Interface) (*IPv4AddrAnnouncer, error)

func (*IPv4AddrAnnouncer) AnnounceAll

func (ar *IPv4AddrAnnouncer) AnnounceAll(vr *VirtualRouter) error

AnnounceAll send gratuitous ARP response for all protected IPv4 addresses

func (*IPv4AddrAnnouncer) Respond added in v0.2.0

func (ar *IPv4AddrAnnouncer) Respond(ctx context.Context, vr *VirtualRouter) error

type IPv4Con

type IPv4Con struct {
	SendCon    *net.IPConn
	ReceiveCon *net.IPConn
	// contains filtered or unexported fields
}

func (*IPv4Con) ReadMessage

func (conn *IPv4Con) ReadMessage() (*VRRPPacket, error)

func (*IPv4Con) WriteMessage

func (conn *IPv4Con) WriteMessage(packet *VRRPPacket) error

type IPv6AddrAnnouncer

type IPv6AddrAnnouncer struct {
	// contains filtered or unexported fields
}

func NewIPv6AddrAnnouncer

func NewIPv6AddrAnnouncer(nif *net.Interface) (*IPv6AddrAnnouncer, error)

func (*IPv6AddrAnnouncer) AnnounceAll

func (nd *IPv6AddrAnnouncer) AnnounceAll(vr *VirtualRouter) error

func (*IPv6AddrAnnouncer) Respond added in v0.2.0

func (nd *IPv6AddrAnnouncer) Respond(ctx context.Context, vr *VirtualRouter) error

type IPv6Con

type IPv6Con struct {
	Con *net.IPConn
	// contains filtered or unexported fields
}

func NewIPv6Con

func NewIPv6Con(local, remote net.IP) (*IPv6Con, error)

func (*IPv6Con) ReadMessage

func (con *IPv6Con) ReadMessage() (*VRRPPacket, error)

func (*IPv6Con) WriteMessage

func (con *IPv6Con) WriteMessage(packet *VRRPPacket) error

type Option

type Option func(r *VirtualRouter) error

func WithAdvInterval

func WithAdvInterval(interval time.Duration) Option

func WithIPvX

func WithIPvX(ipvx byte) Option

func WithIPvXAddr

func WithIPvXAddr(ips ...net.IP) Option

func WithInterface

func WithInterface(iface string) Option

func WithMasterAdvInterval

func WithMasterAdvInterval(interval time.Duration) Option

func WithOwner

func WithOwner(owner bool) Option

func WithPreemtpMode

func WithPreemtpMode(flag bool) Option

func WithPriority

func WithPriority(priority byte) Option

func WithVRID

func WithVRID(id byte) Option

type PseudoHeader

type PseudoHeader struct {
	SAddr    net.IP
	DAddr    net.IP
	Zero     uint8
	Protocol uint8
	Len      uint16
}

func (*PseudoHeader) ToBytes

func (psh *PseudoHeader) ToBytes() []byte

type Transition

type Transition int
const (
	Master2Backup Transition = iota
	Backup2Master
	Init2Master
	Init2Backup
	Master2Init
	Backup2Init
)

func (Transition) String

func (t Transition) String() string

type VRRPPacket

type VRRPPacket struct {
	Header    [8]byte
	IPAddress [][4]byte
	Pshdr     *PseudoHeader
}

func FromBytes

func FromBytes(IPvXVersion byte, octets []byte) (*VRRPPacket, error)

func (*VRRPPacket) AddIPvXAddr

func (packet *VRRPPacket) AddIPvXAddr(version byte, ip net.IP) error

func (*VRRPPacket) GetAdvertisementInterval

func (packet *VRRPPacket) GetAdvertisementInterval() uint16

func (*VRRPPacket) GetCheckSum

func (packet *VRRPPacket) GetCheckSum() uint16

func (*VRRPPacket) GetIPvXAddr

func (packet *VRRPPacket) GetIPvXAddr(version byte) (addrs []net.IP)

func (*VRRPPacket) GetIPvXAddrCount

func (packet *VRRPPacket) GetIPvXAddrCount() byte

func (*VRRPPacket) GetPriority

func (packet *VRRPPacket) GetPriority() byte

func (*VRRPPacket) GetType

func (packet *VRRPPacket) GetType() byte

func (*VRRPPacket) GetVersion

func (packet *VRRPPacket) GetVersion() byte

func (*VRRPPacket) GetVirtualRouterID

func (packet *VRRPPacket) GetVirtualRouterID() byte

func (*VRRPPacket) SetAdvertisementInterval

func (packet *VRRPPacket) SetAdvertisementInterval(interval uint16)

func (*VRRPPacket) SetCheckSum

func (packet *VRRPPacket) SetCheckSum(pshdr *PseudoHeader)

func (*VRRPPacket) SetPriority

func (packet *VRRPPacket) SetPriority(Priority byte)

func (*VRRPPacket) SetType

func (packet *VRRPPacket) SetType()

func (*VRRPPacket) SetVersion

func (packet *VRRPPacket) SetVersion(Version Version)

func (*VRRPPacket) SetVirtualRouterID

func (packet *VRRPPacket) SetVirtualRouterID(VirtualRouterID byte)

func (*VRRPPacket) ToBytes

func (packet *VRRPPacket) ToBytes() []byte

func (*VRRPPacket) ValidateCheckSum

func (packet *VRRPPacket) ValidateCheckSum(pshdr *PseudoHeader) bool

type Version

type Version byte
const (
	VRRPv1 Version = 1
	VRRPv2 Version = 2
	VRRPv3 Version = 3
)

func (Version) String

func (v Version) String() string

type VirtualRouter

type VirtualRouter struct {
	// contains filtered or unexported fields
}

func NewVirtualRouter

func NewVirtualRouter(opts ...Option) (*VirtualRouter, error)

NewVirtualRouter create a new virtual router with designated parameters

func (*VirtualRouter) StartWithEventLoop

func (r *VirtualRouter) StartWithEventLoop()

func (*VirtualRouter) StartWithEventSelector

func (r *VirtualRouter) StartWithEventSelector(ch chan Transition)

func (*VirtualRouter) Stop

func (r *VirtualRouter) Stop()

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
JackTT - Gopher 🇻🇳