govrrp

package module
v1.0.13 Latest Latest
Warning

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

Go to latest
Published: Feb 1, 2024 License: MIT Imports: 14 Imported by: 0

README

Go VRRP

Github CI Documentation GitHub go.mod Go version GitHub tag (latest SemVer)

Go实现的 Virtual Router Redundancy Protocol (VRRP) 协议(V3),协议详见 RFC 5798

VRRP协议用于路由器的冗余,协议通过组播的方式定期发送“心跳” 通知同组节点,组内各节点在心跳丢失后根据协议实现节点的选举。

虚拟IP使用 ARP协议中的Gratuitous ARP来实现,由主节点定期以广播形式发出。

img.png

快速开始

安装依赖

go get -u github.com/Trisia/govrrp

相关文档:

下面创建一个简单的VRRP实例,实现一个虚拟路由器。

package main

import (
	"github.com/Trisia/govrrp"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"
)


func main() {
	// 创建虚拟路由器,设置VRID为240,使用网卡eno1,采用IPv4协议
	vr, err := govrrp.NewVirtualRouter(240, "eno1", false, govrrp.IPv4)
	if err != nil {
		log.Fatal(err)
	}
    // 设置路由 优先级 和 心跳时间
	vr.SetAdvInterval(time.Millisecond * 800)
	vr.SetPriorityAndMasterAdvInterval(100, time.Millisecond*800)
	// 设置虚拟IP
	vr.AddIPvXAddr(net.ParseIP("192.168.0.230"))

	// 注册事件监听
	vr.AddEventListener(govrrp.Backup2Master, func(ctx *govrrp.VirtualRouter) {
		log.Printf("VRID [%d] init to master\n", vr.VRID())
	})
	vr.AddEventListener(govrrp.Master2Init, func(ctx *govrrp.VirtualRouter) {
		log.Printf("VRID [%d] master to init\n", vr.VRID())
	})
	vr.AddEventListener(govrrp.Master2Backup, func(ctx *govrrp.VirtualRouter) {
		log.Printf("VRID [%d] master to backup\n", vr.VRID())
	})
	
	go vr.Start()

	sigout := make(chan os.Signal, 1)
	signal.Notify(sigout, os.Kill, os.Interrupt, syscall.SIGTERM)
	<-sigout
	
	vr.Stop()

	log.Println("wait for virtual router to stop...")
	time.Sleep(time.Second)
}

若您开启了防火墙请允许VRRP协议的组播包通过。

iptables -I INPUT -p vrrp -j ACCEPT

Documentation

Index

Constants

View Source
const (
	IPv4 byte = 4
	IPv6 byte = 6
)
View Source
const (
	INIT   uint32 = 0
	MASTER uint32 = 1
	BACKUP uint32 = 2
)
View Source
const (
	VRRPMultiTTL         = 255
	VRRPIPProtocolNumber = 112 // IANA为VRRP分配的IPv4协议号为 112(十进制)。
)
View Source
const (
	Master2Backup transition = iota
	Backup2Master
	Init2Master
	Init2Backup
	Master2Init
	Backup2Init
)
View Source
const EVENT_CHANNEL_SIZE = 1
View Source
const PACKET_QUEUE_SIZE = 512

Variables

View Source
var BroadcastHADAR, _ = net.ParseMAC("ff:ff:ff:ff:ff:ff")

广播地址

View Source
var VRRPMultiAddrIPv4 = net.IPv4(224, 0, 0, 18)

VRRPMultiAddrIPv4 VRRP协议多播IPv4地址 (RFC5798 5.1.1.2) IANA为VRRP分配的IPv4多播地址为: 224.0.0.18

View Source
var VRRPMultiAddrIPv6 = net.ParseIP("FF02:0:0:0:0:0:0:12")

VRRPMultiAddrIPv6 VRRP协议多播IPv6地址 (RFC5798 5.1.2.2) IANA为VRRP分配的IPv6多播地址为 FF02:0:0:0:0:0:0:12

Functions

func SetDefaultLogger added in v1.0.2

func SetDefaultLogger(l *log.Logger)

SetDefaultLogger 设置默认日志记录器

Types

type AddrAnnouncer

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

type EVENT

type EVENT byte
const (
	SHUTDOWN EVENT = 0
	START    EVENT = 1
)

func (EVENT) String

func (e EVENT) String() string

type IPv4AddrAnnouncer

type IPv4AddrAnnouncer struct {
	ARPClient *arp.Client
}

IPv4AddrAnnouncer IPv4 Gratuitous ARP广播,在指定网口上广播Gratuitous ARP消息通知其他主机VIP地址

func NewIPv4AddrAnnouncer

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

NewIPv4AddrAnnouncer 创建IPv4 Gratuitous ARP广播

func (*IPv4AddrAnnouncer) AnnounceAll

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

AnnounceAll 广播 gratuitous ARP response 包含所有的IPv4虚拟IP地址

func (*IPv4AddrAnnouncer) Close added in v1.0.8

func (ar *IPv4AddrAnnouncer) Close() error

type IPv4VRRPMsgCon added in v1.0.1

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

IPv4VRRPMsgCon IPv4的VRRP消息组播连接

func (*IPv4VRRPMsgCon) Close added in v1.0.8

func (conn *IPv4VRRPMsgCon) Close() error

func (*IPv4VRRPMsgCon) ReadMessage added in v1.0.1

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

ReadMessage 读取VRRP数据包

func (*IPv4VRRPMsgCon) WriteMessage added in v1.0.1

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

WriteMessage 发送VRRP数据包

type IPv6AddrAnnouncer

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

IPv6AddrAnnouncer IPv6 NDP广播,在指定网口上广播NDP消息通知其他主机VIP地址

func NewIPIPv6AddrAnnouncer

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

NewIPIPv6AddrAnnouncer 创建IPv6 NDP广播

func (*IPv6AddrAnnouncer) AnnounceAll

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

AnnounceAll 广播 包含所有的IPv6虚拟IP地址

func (*IPv6AddrAnnouncer) Close added in v1.0.8

func (nd *IPv6AddrAnnouncer) Close() error

type IPv6VRRPMsgCon added in v1.0.1

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

IPv6VRRPMsgCon IPv6的VRRP消息组播连接

func (*IPv6VRRPMsgCon) Close added in v1.0.8

func (con *IPv6VRRPMsgCon) Close() error

func (*IPv6VRRPMsgCon) ReadMessage added in v1.0.1

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

ReadMessage 读取VRRP数据包

func (*IPv6VRRPMsgCon) WriteMessage added in v1.0.1

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

WriteMessage 发送VRRP数据包

type NetErr added in v1.0.13

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

NetErr 网络异常

type PseudoHeader

type PseudoHeader struct {
	Saddr    net.IP // 源地址
	Daddr    net.IP // 目的地址
	Zero     uint8
	Protocol uint8  // IP层协议号 VRRP为 112(十进制)
	Len      uint16 // VRRP报文总长
}

PseudoHeader 伪头部,用于记录IP层协议信息

func (*PseudoHeader) ToBytes

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

ToBytes 伪头部序列化为字节序列

type VRRPMsgConnection added in v1.0.1

type VRRPMsgConnection interface {
	io.Closer
	// WriteMessage 发送VRRP消息
	WriteMessage(*VRRPPacket) error
	// ReadMessage 接收VRRP消息
	ReadMessage() (*VRRPPacket, error)
}

VRRPMsgConnection IP层VRRP协议消息接口

func NewIPv4VRRPMsgConn added in v1.0.1

func NewIPv4VRRPMsgConn(itf *net.Interface, src, dst net.IP) (VRRPMsgConnection, error)

NewIPv4VRRPMsgConn 创建的IPv4 VRRP虚拟连接 ift: 工作网口 src: IP数据包中源地址,应该为工作网口的IP地址 dst: IP数据包中目的地址,应该为组播地址 VRRPMultiAddrIPv4

func NewIPv6VRRPMsgCon added in v1.0.1

func NewIPv6VRRPMsgCon(itf *net.Interface, src, dst net.IP) (VRRPMsgConnection, error)

NewIPv6VRRPMsgCon 创建的IPv6 VRRP虚拟连接

type VRRPPacket

type VRRPPacket struct {
	Header    [8]byte       // 头部
	IPAddress [][4]byte     // 报文中IP地址序列
	Pshdr     *PseudoHeader // 伪头部,用于记录IP层信息
}

VRRPPacket VRRP数据包

func FromBytes

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

FromBytes 解析VRRP数据包

func (*VRRPPacket) AddIPAddr

func (packet *VRRPPacket) AddIPAddr(ip netip.Addr)

AddIPAddr 向报文中追加IP

func (*VRRPPacket) AddIPvXAddr

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

AddIPvXAddr 向报文中追加IP

func (*VRRPPacket) GetAdvertisementInterval

func (packet *VRRPPacket) GetAdvertisementInterval() uint16

GetAdvertisementInterval 获取 最大播发间隔 12-bit的字段,用于表示2条VRRP消息发送的间隔时间,单位为 厘秒, 100 厘秒 = 1 秒。

func (*VRRPPacket) GetCheckSum

func (packet *VRRPPacket) GetCheckSum() uint16

GetCheckSum 获取 校验和 用于检测VRRP消息中的数据损坏。

func (*VRRPPacket) GetIPvXAddr

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

GetIPvXAddr 获取报文中的IP

func (*VRRPPacket) GetIPvXAddrCount

func (packet *VRRPPacket) GetIPvXAddrCount() byte

GetIPvXAddrCount 获取 报文中的IP数量,至少为1

func (*VRRPPacket) GetPriority

func (packet *VRRPPacket) GetPriority() byte

GetPriority 获取 优先级

func (*VRRPPacket) GetType

func (packet *VRRPPacket) GetType() byte

GetType 获取 VRRP数据包的类型

func (*VRRPPacket) GetVersion

func (packet *VRRPPacket) GetVersion() byte

GetVersion 获取 VRRP协议版本号

func (*VRRPPacket) GetVirtualRouterID

func (packet *VRRPPacket) GetVirtualRouterID() byte

GetVirtualRouterID 获取 虚拟路由ID

func (*VRRPPacket) PacketSize added in v1.0.1

func (packet *VRRPPacket) PacketSize() int

PacketSize 当前报文的长度

func (*VRRPPacket) SetAdvertisementInterval

func (packet *VRRPPacket) SetAdvertisementInterval(interval uint16)

SetAdvertisementInterval 设置 最大播发间隔,单位厘秒, 100 厘秒 = 1 秒。

func (*VRRPPacket) SetCheckSum

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

SetCheckSum 设置 校验和 校验和需要 伪头部 与 报文内容 进行计算,计算方式见 RFC1071

pshdr: 伪头部

func (*VRRPPacket) SetPriority

func (packet *VRRPPacket) SetPriority(Priority byte)

SetPriority 设置 优先级 0~255 最高优先

拥有与虚拟路由器关联的IPvX地址的VRRP路由器的优先级值必须为255(十进制)。

备份虚拟路由器的VRRP路由器必须使用1-254(十进制)之间的优先级值。备份虚拟路由器的VRRP路由器的默认优先级为 100 (十进制) 。

优先级值0具有特殊意义,表示当前主机已停止参与VRRP。这用于触发备份路由器快速过渡到主路由器,而无需等待当前主路由器超时。

func (*VRRPPacket) SetType

func (packet *VRRPPacket) SetType()

SetType 设置 VRRP数据包的类型,固定值 1 ADVERTISEMENT

func (*VRRPPacket) SetVersion

func (packet *VRRPPacket) SetVersion(Version VRRPVersion)

SetVersion 设置 VRRP协议版本号

func (*VRRPPacket) SetVirtualRouterID

func (packet *VRRPPacket) SetVirtualRouterID(VirtualRouterID byte)

SetVirtualRouterID 设置 虚拟路由ID

func (*VRRPPacket) String added in v1.0.1

func (packet *VRRPPacket) String() string

func (*VRRPPacket) ToBytes

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

ToBytes 序列化消息为字节序列

func (*VRRPPacket) ValidateCheckSum

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

ValidateCheckSum 验证 校验和

type VRRPVersion

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

func (VRRPVersion) String

func (v VRRPVersion) String() string

type VirtualRouter

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

VirtualRouter 虚拟路由器,实现了VRRP协议的状态机

func NewVirtualRouter

func NewVirtualRouter(VRID byte, nif string, Owner bool, IPvX byte) (*VirtualRouter, error)

NewVirtualRouter 创建虚拟路由器 VRID: 虚拟路由ID (0~255) nif: 工作网口接口名称 Owner: 是否为MASTER IPvX: IP协议类型(IPv4 或 IPv6)

func NewVirtualRouterSpec added in v1.0.3

func NewVirtualRouterSpec(VRID byte, ift *net.Interface, preferIP net.IP, priority byte) (*VirtualRouter, error)

NewVirtualRouterSpec 创建一个虚拟路由器实例 VRID: 虚拟路由ID ift: 工作网口接口 preferIP: 优先使用的源IP地址,请确保工作网口配置由该IP地址保持一致。 priority: 优先级,255 表示主节点,0 为特殊值不可使用,默认100。

func (*VirtualRouter) AddEventListener added in v1.0.1

func (r *VirtualRouter) AddEventListener(typ transition, handler func(*VirtualRouter)) bool

AddEventListener 添加状态机事件监听器 typ: 状态变更类型 handler: 状态变更时的回调函数

return: 如果已经存在该类型的监听器,那么返回 true,否则返回 false

func (*VirtualRouter) AddIPvXAddr

func (r *VirtualRouter) AddIPvXAddr(ip net.IP)

AddIPvXAddr 添加虚拟IP

func (*VirtualRouter) GetAdvInterval added in v1.0.3

func (r *VirtualRouter) GetAdvInterval() time.Duration

GetAdvInterval 获取 虚拟路由的心跳发送间隔

func (*VirtualRouter) GetInterface added in v1.0.3

func (r *VirtualRouter) GetInterface() *net.Interface

GetInterface 获取 虚拟路由的工作网口

func (*VirtualRouter) GetPreempt added in v1.0.3

func (r *VirtualRouter) GetPreempt() bool

GetPreempt 获取 虚拟路由的抢占模式

func (*VirtualRouter) GetPreferredSourceIP added in v1.0.3

func (r *VirtualRouter) GetPreferredSourceIP() net.IP

GetPreferredSourceIP 获取 虚拟路由的优先IP地址

func (*VirtualRouter) GetPriority added in v1.0.3

func (r *VirtualRouter) GetPriority() byte

GetPriority 获取 虚拟路由的优先级

func (*VirtualRouter) GetState added in v1.0.3

func (r *VirtualRouter) GetState() uint32

GetState 获取 虚拟路由的状态 return INIT | MASTER | BACKUP

func (*VirtualRouter) GetVIPs added in v1.0.3

func (r *VirtualRouter) GetVIPs() []net.IP

GetVIPs 获取 虚拟路由的保护IP地址

func (*VirtualRouter) RemoveIPvXAddr

func (r *VirtualRouter) RemoveIPvXAddr(ip net.IP)

RemoveIPvXAddr 移除 虚拟路由的虚拟IP地址

func (*VirtualRouter) SetAdvInterval

func (r *VirtualRouter) SetAdvInterval(Interval time.Duration) *VirtualRouter

SetAdvInterval 设置 VRRP消息发送间隔(心跳间隔),时间间隔不能小于 10 ms。

func (*VirtualRouter) SetPreemptMode

func (r *VirtualRouter) SetPreemptMode(flag bool) *VirtualRouter

SetPreemptMode 设置 抢占模式 高优先级备份路由器是否抢占低优先级主路由器。 值为 true 表示 允许抢占,值为 false 表示 禁止抢占。默认值为 true。

func (*VirtualRouter) SetPriorityAndMasterAdvInterval

func (r *VirtualRouter) SetPriorityAndMasterAdvInterval(priority byte, interval time.Duration) *VirtualRouter

SetPriorityAndMasterAdvInterval 设置 当前虚拟路由优先级 以及 心跳发送间隔

func (*VirtualRouter) Start added in v1.0.1

func (r *VirtualRouter) Start()

Start 启动虚拟路由器 虚拟路由器启动后,将开始监听VRRP消息,根据状态机的状态,切换至不同的状态。

func (*VirtualRouter) Stop

func (r *VirtualRouter) Stop()

Stop 停止虚拟路由器

func (*VirtualRouter) VRID added in v1.0.1

func (r *VirtualRouter) VRID() byte

VRID 返回 虚拟路由的 ID

Directories

Path Synopsis
example

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL