adding gateway routes for peers

This commit is contained in:
afeiszli
2022-08-22 16:44:04 -04:00
parent ec40ea78d3
commit 4d9a07bf00
7 changed files with 159 additions and 7 deletions

View File

@@ -12,6 +12,17 @@ import (
// SetPeerRoutes - sets/removes ip routes for each peer on a network
func SetPeerRoutes(iface string, oldPeers map[string]bool, newPeers []wgtypes.PeerConfig) {
// get the default route
var hasRoute bool
gwIP, gwIface, err := GetDefaultRoute()
if err != nil {
logger.Log(0, "error getting default route:", err.Error())
}
if gwIP != "" && gwIface != "" && err == nil {
hasRoute = true
}
// traverse through all recieved peers
for _, peer := range newPeers {
for _, allowedIP := range peer.AllowedIPs {
@@ -23,6 +34,13 @@ func SetPeerRoutes(iface string, oldPeers map[string]bool, newPeers []wgtypes.Pe
delete(oldPeers, allowedIP.String())
}
}
if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
if err != nil {
logger.Log(0, "error parsing ip:", err.Error())
}
setRoute(gwIface, &ipNet, gwIP)
}
}
// traverse through all remaining existing peers
for i := range oldPeers {
@@ -37,19 +55,55 @@ func SetPeerRoutes(iface string, oldPeers map[string]bool, newPeers []wgtypes.Pe
// SetCurrentPeerRoutes - sets all the current peers
func SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.PeerConfig) {
// get the default route
var hasRoute bool
gwIP, gwIface, err := GetDefaultRoute()
if err != nil {
logger.Log(0, "error getting default route:", err.Error())
}
if gwIP != "" && gwIface != "" && err == nil {
hasRoute = true
}
// traverse through all recieved peers
for _, peer := range peers {
for _, allowedIP := range peer.AllowedIPs {
setRoute(iface, &allowedIP, currentAddr)
}
if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
if err != nil {
logger.Log(0, "error parsing ip:", err.Error())
}
setRoute(gwIface, &ipNet, gwIP)
}
}
}
// FlushPeerRoutes - removes all current peer routes
func FlushPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) {
// get the default route
var hasRoute bool
gwIP, gwIface, err := GetDefaultRoute()
if err != nil {
logger.Log(0, "error getting default route:", err.Error())
}
if gwIP != "" && gwIface != "" && err == nil {
hasRoute = true
}
for _, peer := range peers {
for _, allowedIP := range peer.AllowedIPs {
deleteRoute(iface, &allowedIP, currentAddr)
}
if hasRoute && !ncutils.IpIsPrivate(peer.Endpoint.IP) {
ipNet, err := ncutils.GetIPNetFromString(peer.Endpoint.IP.String())
if err != nil {
logger.Log(0, "error parsing ip:", err.Error())
}
deleteRoute(gwIface, &ipNet, gwIP)
}
}
}