diff --git a/controllers/network_test.go b/controllers/network_test.go index c7fc967f..c14b0d5b 100644 --- a/controllers/network_test.go +++ b/controllers/network_test.go @@ -289,6 +289,7 @@ func TestIpv6Network(t *testing.T) { database.InitializeDatabase() os.Setenv("MASTER_KEY", "secretkey") + deleteAllNetworks() createNet() createNetDualStack() network, err := logic.GetNetwork("skynet6") @@ -300,7 +301,7 @@ func TestIpv6Network(t *testing.T) { nodeErr := logic.CreateNode(&node1) t.Run("Test node on network IPv6", func(t *testing.T) { assert.Nil(t, nodeErr) - assert.Equal(t, node1.Address6, "fde6:be04:fa5e:d076::1") + assert.Equal(t, "fde6:be04:fa5e:d076::", node1.Address6) }) } diff --git a/go.mod b/go.mod index ca669c9d..7e51612e 100644 --- a/go.mod +++ b/go.mod @@ -32,11 +32,11 @@ require ( require ( filippo.io/edwards25519 v1.0.0-rc.1 fyne.io/fyne/v2 v2.1.4 + github.com/c-robinson/iplib v1.0.3 github.com/cloverstd/tcping v0.1.1 github.com/guumaster/hostctl v1.1.2 github.com/kr/pretty v0.3.0 github.com/posthog/posthog-go v0.0.0-20211028072449-93c17c49e2b0 - github.com/seancfoley/ipaddress-go v1.1.2 ) require ( @@ -73,7 +73,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.8.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/seancfoley/bintree v1.0.1 // indirect github.com/spf13/afero v1.3.2 // indirect github.com/srwiley/oksvg v0.0.0-20200311192757-870daf9aa564 // indirect github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9 // indirect diff --git a/go.sum b/go.sum index 1f14d235..42dffd2b 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ github.com/antzucaro/matchr v0.0.0-20210222213004-b04723ef80f0/go.mod h1:v3ZDlfV github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/c-robinson/iplib v1.0.3 h1:NG0UF0GoEsrC1/vyfX1Lx2Ss7CySWl3KqqXh3q4DdPU= +github.com/c-robinson/iplib v1.0.3/go.mod h1:i3LuuFL1hRT5gFpBRnEydzw8R6yhGkF4szNDIbF8pgo= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloverstd/tcping v0.1.1 h1:3Yp9nvSDI7Z63zoVQDJzVk1PUczrF9tJoOrKGV30iOk= @@ -200,10 +202,6 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/seancfoley/bintree v1.0.1 h1:rCb5DEugf2B2DtkrxJ80CP6HT24yohDEcXPOqkQRizo= -github.com/seancfoley/bintree v1.0.1/go.mod h1:CtE6qO6/n9H3V2CAGEC0lpaYr6/OijhNaMG/dt7P70c= -github.com/seancfoley/ipaddress-go v1.1.2 h1:zeAUfL7foAPe1pIlT2agp17tgpwzU6YKuEAa2VrRKOw= -github.com/seancfoley/ipaddress-go v1.1.2/go.mod h1:gR/Gr3Sx+pzusadtM9s98e/tZjvL4YnumYTPcKoHWec= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= diff --git a/logic/ips/ips.go b/logic/ips/ips.go deleted file mode 100644 index e691b773..00000000 --- a/logic/ips/ips.go +++ /dev/null @@ -1,62 +0,0 @@ -package ips - -import ( - "fmt" - "strings" - - "github.com/seancfoley/ipaddress-go/ipaddr" -) - -// GetFirstAddr - gets the first valid address in a given IPv4 CIDR -func GetFirstAddr(cidr4 string) (*ipaddr.IPAddress, error) { - currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress() - if !currentCidr.IsIPv4() { - return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetFirstAddr") - } - lower := currentCidr.GetLower() - ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), ".") - if ipParts[len(ipParts)-1] == "0" { - lower = lower.Increment(1) - } - return lower, nil -} - -// GetLastAddr - gets the last valid address in a given IPv4 CIDR -func GetLastAddr(cidr4 string) (*ipaddr.IPAddress, error) { - currentCidr := ipaddr.NewIPAddressString(cidr4).GetAddress() - if !currentCidr.IsIPv4() { - return nil, fmt.Errorf("invalid IPv4 CIDR provided to GetLastAddr") - } - upper := currentCidr.GetUpper() - ipParts := strings.Split(upper.GetNetIPAddr().IP.String(), ".") - if ipParts[len(ipParts)-1] == "255" { - upper = upper.Increment(-1) - } - return upper, nil -} - -// GetFirstAddr6 - gets the first valid IPv6 address in a given IPv6 CIDR -func GetFirstAddr6(cidr6 string) (*ipaddr.IPAddress, error) { - currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress() - if !currentCidr.IsIPv6() { - return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetFirstAddr6") - } - lower := currentCidr.GetLower() - ipParts := strings.Split(lower.GetNetIPAddr().IP.String(), "::") - if len(ipParts) == 2 { - if len(ipParts[len(ipParts)-1]) == 0 { - lower = lower.Increment(1) - } - } - return lower, nil -} - -// GetLastAddr6 - gets the last valid IPv6 address in a given IPv6 CIDR -func GetLastAddr6(cidr6 string) (*ipaddr.IPAddress, error) { - currentCidr := ipaddr.NewIPAddressString(cidr6).GetAddress() - if !currentCidr.IsIPv6() { - return nil, fmt.Errorf("invalid IPv6 CIDR provided to GetLastAddr6") - } - upper := currentCidr.GetUpper() - return upper, nil -} diff --git a/logic/ips/ips_test.go b/logic/ips/ips_test.go deleted file mode 100644 index b98e896b..00000000 --- a/logic/ips/ips_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package ips_test - -import ( - "testing" - - "github.com/gravitl/netmaker/logic/ips" - "github.com/stretchr/testify/assert" -) - -func TestIp4(t *testing.T) { - const ipv4Cidr = "192.168.0.0/16" - const ipv6Cidr = "fde6:be04:fa5e:d076::/64" - //delete all current users - t.Run("Valid Ipv4", func(t *testing.T) { - _, err := ips.GetFirstAddr(ipv4Cidr) - assert.Nil(t, err) - }) - t.Run("Invalid Ipv4", func(t *testing.T) { - _, err := ips.GetFirstAddr(ipv6Cidr) - assert.NotNil(t, err) - }) - t.Run("Valid IPv6", func(t *testing.T) { - _, err := ips.GetFirstAddr6(ipv6Cidr) - assert.Nil(t, err) - }) - t.Run("Invalid IPv6", func(t *testing.T) { - _, err := ips.GetFirstAddr6(ipv4Cidr) - assert.NotNil(t, err) - }) - t.Run("Last IPv4", func(t *testing.T) { - addr, err := ips.GetLastAddr(ipv4Cidr) - assert.Nil(t, err) - assert.Equal(t, addr.GetNetIPAddr().IP.String(), "192.168.255.254") - }) - t.Run("First IPv4", func(t *testing.T) { - addr, err := ips.GetFirstAddr(ipv4Cidr) - assert.Nil(t, err) - assert.Equal(t, addr.GetNetIPAddr().IP.String(), "192.168.0.1") - }) - t.Run("Last IPv6", func(t *testing.T) { - last, err := ips.GetLastAddr6(ipv6Cidr) - assert.Nil(t, err) - assert.Equal(t, last.GetNetIPAddr().IP.String(), "fde6:be04:fa5e:d076:ffff:ffff:ffff:ffff") - }) - t.Run("First IPv6", func(t *testing.T) { - first, err := ips.GetFirstAddr6(ipv6Cidr) - assert.Nil(t, err) - assert.Equal(t, first.GetNetIPAddr().IP.String(), "fde6:be04:fa5e:d076::1") - }) -} diff --git a/logic/networks.go b/logic/networks.go index 278548a1..a1b01de5 100644 --- a/logic/networks.go +++ b/logic/networks.go @@ -8,11 +8,11 @@ import ( "os/exec" "strings" + "github.com/c-robinson/iplib" "github.com/go-playground/validator/v10" "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic/acls/nodeacls" - "github.com/gravitl/netmaker/logic/ips" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/validation" @@ -185,29 +185,30 @@ func UniqueAddress(networkName string, reverse bool) (string, error) { if network.IsIPv4 == "no" { return "", fmt.Errorf("IPv4 not active on network " + networkName) } - - newAddr, err := ips.GetFirstAddr(network.AddressRange) - if err != nil { + //ensure AddressRange is valid + if _, _, err := net.ParseCIDR(network.AddressRange); err != nil { logger.Log(0, "UniqueAddress encountered an error") return "666", err } + net4 := iplib.Net4FromStr(network.AddressRange) + newAddrs := net4.FirstAddress() - incVal := 1 if reverse { - incVal = -1 - newAddr, err = ips.GetLastAddr(network.AddressRange) - if err != nil { - if err != nil { - logger.Log(0, "UniqueAddressServer encountered an error") - return "666", err - } - } + newAddrs = net4.LastAddress() } - for ; newAddr.ToAddressString().IsValid(); newAddr = newAddr.Increment(int64(incVal)) { - if IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, false) && - IsIPUnique(networkName, newAddr.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, false) { - return newAddr.GetNetIPAddr().IP.String(), nil + for { + if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, false) && + IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, false) { + return newAddrs.String(), nil + } + if reverse { + newAddrs, err = net4.PreviousIP(newAddrs) + } else { + newAddrs, err = net4.NextIP(newAddrs) + } + if err != nil { + break } } @@ -256,27 +257,30 @@ func UniqueAddress6(networkName string, reverse bool) (string, error) { return "", fmt.Errorf("IPv6 not active on network " + networkName) } - newAddr6, err := ips.GetFirstAddr6(network.AddressRange6) - if err != nil { + //ensure AddressRange is valid + if _, _, err := net.ParseCIDR(network.AddressRange6); err != nil { return "666", err } + net6 := iplib.Net6FromStr(network.AddressRange6) + newAddrs := net6.FirstAddress() - incVal := 1 if reverse { - incVal = -1 - newAddr6, err = ips.GetLastAddr6(network.AddressRange6) - if err != nil { - if err != nil { - logger.Log(0, "UniqueAddress6Server encountered an error") - return "666", err - } - } + newAddrs = net6.LastAddress() } - for ; newAddr6.ToAddressString().IsValid(); newAddr6 = newAddr6.Increment(int64(incVal)) { - if IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.NODES_TABLE_NAME, true) && - IsIPUnique(networkName, newAddr6.GetNetIPAddr().IP.String(), database.EXT_CLIENT_TABLE_NAME, true) { - return newAddr6.GetNetIPAddr().IP.String(), nil + for { + + if IsIPUnique(networkName, newAddrs.String(), database.NODES_TABLE_NAME, true) && + IsIPUnique(networkName, newAddrs.String(), database.EXT_CLIENT_TABLE_NAME, true) { + return newAddrs.String(), nil + } + if reverse { + newAddrs, err = net6.PreviousIP(newAddrs) + } else { + newAddrs, err = net6.NextIP(newAddrs) + } + if err != nil { + break } } diff --git a/logic/peers.go b/logic/peers.go index 11059e18..f8db3e3b 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -8,13 +8,13 @@ import ( "strings" "time" + "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic/acls" "github.com/gravitl/netmaker/logic/acls/nodeacls" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/servercfg" - "github.com/seancfoley/ipaddress-go/ipaddr" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) @@ -318,8 +318,7 @@ func GetAllowedIPs(node, peer *models.Node) []net.IPNet { // handle manually set peers for _, allowedIp := range peer.AllowedIPs { - currentAddr := ipaddr.NewIPAddressString(allowedIp).GetAddress() - if currentAddr.IsIPv4() { + if iplib.Version(net.ParseIP(allowedIp)) == 4 { if _, ipnet, err := net.ParseCIDR(allowedIp); err == nil { nodeEndpointArr := strings.Split(node.Endpoint, ":") if !ipnet.Contains(net.IP(nodeEndpointArr[0])) && ipnet.IP.String() != peer.Address { // don't need to add an allowed ip that already exists.. @@ -332,7 +331,7 @@ func GetAllowedIPs(node, peer *models.Node) []net.IPNet { } allowedips = append(allowedips, ipnet) } - } else if currentAddr.IsIPv6() { + } else if iplib.Version(net.ParseIP(allowedIp)) == 6 { ipnet := net.IPNet{ IP: net.ParseIP(allowedIp), Mask: net.CIDRMask(128, 128), diff --git a/logic/server.go b/logic/server.go index ade7404d..eafe0fce 100644 --- a/logic/server.go +++ b/logic/server.go @@ -10,13 +10,13 @@ import ( "strings" "time" + "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/logic/acls" "github.com/gravitl/netmaker/logic/acls/nodeacls" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/servercfg" - "github.com/seancfoley/ipaddress-go/ipaddr" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) @@ -261,8 +261,7 @@ func GetServerPeers(serverNode *models.Node) ([]wgtypes.PeerConfig, bool, []stri // handle manually set peers for _, allowedIp := range node.AllowedIPs { - currentIP := ipaddr.NewIPAddressString(allowedIp).GetAddress() - if currentIP.IsIPv4() { + if iplib.Version(net.ParseIP(allowedIp)) == 4 { if _, ipnet, err := net.ParseCIDR(allowedIp); err == nil { nodeEndpointArr := strings.Split(node.Endpoint, ":") if !ipnet.Contains(net.IP(nodeEndpointArr[0])) && ipnet.IP.String() != node.Address { // don't need to add an allowed ip that already exists.. @@ -275,9 +274,10 @@ func GetServerPeers(serverNode *models.Node) ([]wgtypes.PeerConfig, bool, []stri } allowedips = append(allowedips, ipnet) } - } else if currentIP.IsIPv6() { + } else if iplib.Version(net.ParseIP(allowedIp)) == 6 { + //ipnet : = iplib.Net6FromStr(allowedIp).IP() ipnet := net.IPNet{ - IP: currentIP.GetNetIP(), + IP: iplib.Net6FromStr(allowedIp).IP(), Mask: net.CIDRMask(128, 128), } allowedips = append(allowedips, ipnet) diff --git a/netclient/local/routes_darwin.go b/netclient/local/routes_darwin.go index d94df2a8..d6886c51 100644 --- a/netclient/local/routes_darwin.go +++ b/netclient/local/routes_darwin.go @@ -4,9 +4,9 @@ import ( "net" "strings" + "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/netclient/ncutils" - "github.com/seancfoley/ipaddress-go/ipaddr" ) // route -n add -net 10.0.0.0/8 192.168.0.254 @@ -35,10 +35,9 @@ func deleteRoute(iface string, addr *net.IPNet, address string) error { } func setCidr(iface, address string, addr *net.IPNet) { - cidr := ipaddr.NewIPAddressString(addr.String()).GetAddress() - if cidr.IsIPv4() { + if iplib.Version(addr.IP) == 4 { ncutils.RunCmd("route -q -n add -net "+addr.String()+" "+address, false) - } else if cidr.IsIPv6() { + } else if iplib.Version(addr.IP) == 6 { ncutils.RunCmd("route -A inet6 -q -n add -net "+addr.String()+" "+address, false) } else { logger.Log(1, "could not parse address: "+addr.String()) diff --git a/netclient/local/routes_freebsd.go b/netclient/local/routes_freebsd.go index 138f5769..0e71e714 100644 --- a/netclient/local/routes_freebsd.go +++ b/netclient/local/routes_freebsd.go @@ -3,9 +3,9 @@ package local import ( "net" + "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/netclient/ncutils" - "github.com/seancfoley/ipaddress-go/ipaddr" ) func setRoute(iface string, addr *net.IPNet, address string) error { @@ -21,10 +21,9 @@ func deleteRoute(iface string, addr *net.IPNet, address string) error { } func setCidr(iface, address string, addr *net.IPNet) { - cidr := ipaddr.NewIPAddressString(addr.String()).GetAddress() - if cidr.IsIPv4() { + if iplib.Version(addr.IP) == 4 { ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, false) - } else if cidr.IsIPv6() { + } else if iplib.Version(addr.IP) == 6 { ncutils.RunCmd("route add -net -inet6 "+addr.String()+" -interface "+iface, false) } else { logger.Log(1, "could not parse address: "+addr.String()) diff --git a/netclient/local/routes_linux.go b/netclient/local/routes_linux.go index bd8c2623..d6854f68 100644 --- a/netclient/local/routes_linux.go +++ b/netclient/local/routes_linux.go @@ -7,9 +7,9 @@ import ( "net" "strings" + "github.com/c-robinson/iplib" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/netclient/ncutils" - "github.com/seancfoley/ipaddress-go/ipaddr" ) func setRoute(iface string, addr *net.IPNet, address string) error { @@ -30,10 +30,9 @@ func deleteRoute(iface string, addr *net.IPNet, address string) error { } func setCidr(iface, address string, addr *net.IPNet) { - cidr := ipaddr.NewIPAddressString(addr.String()).GetAddress() - if cidr.IsIPv4() { + if iplib.Version(addr.IP) == 4 { ncutils.RunCmd("ip -4 route add "+addr.String()+" dev "+iface, false) - } else if cidr.IsIPv6() { + } else if iplib.Version(addr.IP) == 6 { ncutils.RunCmd("ip -6 route add "+addr.String()+" dev "+iface, false) } else { logger.Log(1, "could not parse address: "+addr.String())