- 致谢 napw forked from github.com/napw/VRRP-go。
Go实现的 Virtual Router Redundancy Protocol (VRRP) 协议(V3),协议详见 RFC 5798。
VRRP协议用于路由器的冗余,协议通过组播的方式定期发送“心跳” 通知同组节点,组内各节点在心跳丢失后根据协议实现节点的选举。
虚拟IP使用 ARP协议中的Gratuitous ARP来实现,由主节点定期以广播形式发出。
安装依赖
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