mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 08:47:35 +08:00
added udp holepunching
This commit is contained in:
@@ -1,23 +1,24 @@
|
||||
package functions
|
||||
|
||||
import (
|
||||
"google.golang.org/grpc/credentials"
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"errors"
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"math/rand"
|
||||
"net"
|
||||
"time"
|
||||
"github.com/gravitl/netmaker/netclient/config"
|
||||
"github.com/gravitl/netmaker/netclient/wireguard"
|
||||
"github.com/gravitl/netmaker/netclient/server"
|
||||
"github.com/gravitl/netmaker/netclient/local"
|
||||
nodepb "github.com/gravitl/netmaker/grpc"
|
||||
|
||||
nodepb "github.com/gravitl/netmaker/grpc"
|
||||
"github.com/gravitl/netmaker/netclient/config"
|
||||
"github.com/gravitl/netmaker/netclient/local"
|
||||
"github.com/gravitl/netmaker/netclient/server"
|
||||
"github.com/gravitl/netmaker/netclient/wireguard"
|
||||
"golang.zx2c4.com/wireguard/wgctrl"
|
||||
"google.golang.org/grpc"
|
||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/credentials"
|
||||
//homedir "github.com/mitchellh/go-homedir"
|
||||
)
|
||||
|
||||
@@ -25,7 +26,7 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
|
||||
hasnet := local.HasNetwork(cfg.Network)
|
||||
if hasnet {
|
||||
err := errors.New("ALREADY_INSTALLED. Netclient appears to already be installed for " + cfg.Network + ". To re-install, please remove by executing 'sudo netclient leave -n " + cfg.Network + "'. Then re-run the install command.")
|
||||
err := errors.New("ALREADY_INSTALLED. Netclient appears to already be installed for " + cfg.Network + ". To re-install, please remove by executing 'sudo netclient leave -n " + cfg.Network + "'. Then re-run the install command.")
|
||||
return err
|
||||
}
|
||||
log.Println("attempting to join " + cfg.Network + " at " + cfg.Server.GRPCAddress)
|
||||
@@ -34,73 +35,73 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
return err
|
||||
}
|
||||
|
||||
wgclient, err := wgctrl.New()
|
||||
if err != nil {
|
||||
wgclient, err := wgctrl.New()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer wgclient.Close()
|
||||
}
|
||||
defer wgclient.Close()
|
||||
if cfg.Node.Network == "" {
|
||||
return errors.New("no network provided")
|
||||
}
|
||||
if cfg.Node.LocalRange != "" {
|
||||
if cfg.Node.LocalAddress == "" {
|
||||
log.Println("local vpn, getting local address from range: " + cfg.Node.LocalRange)
|
||||
ifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, localrange, err := net.ParseCIDR(cfg.Node.LocalRange)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var local string
|
||||
found := false
|
||||
for _, i := range ifaces {
|
||||
if i.Flags&net.FlagUp == 0 {
|
||||
continue // interface down
|
||||
}
|
||||
if i.Flags&net.FlagLoopback != 0 {
|
||||
continue // loopback interface
|
||||
}
|
||||
addrs, err := i.Addrs()
|
||||
if cfg.Node.LocalAddress == "" {
|
||||
log.Println("local vpn, getting local address from range: " + cfg.Node.LocalRange)
|
||||
ifaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, localrange, err := net.ParseCIDR(cfg.Node.LocalRange)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
if !found {
|
||||
ip = v.IP
|
||||
local = ip.String()
|
||||
if cfg.Node.IsLocal == "yes" {
|
||||
found = localrange.Contains(ip)
|
||||
} else {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
case *net.IPAddr:
|
||||
if !found {
|
||||
ip = v.IP
|
||||
local = ip.String()
|
||||
if cfg.Node.IsLocal == "yes" {
|
||||
found = localrange.Contains(ip)
|
||||
|
||||
} else {
|
||||
found = true
|
||||
var local string
|
||||
found := false
|
||||
for _, i := range ifaces {
|
||||
if i.Flags&net.FlagUp == 0 {
|
||||
continue // interface down
|
||||
}
|
||||
if i.Flags&net.FlagLoopback != 0 {
|
||||
continue // loopback interface
|
||||
}
|
||||
addrs, err := i.Addrs()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, addr := range addrs {
|
||||
var ip net.IP
|
||||
switch v := addr.(type) {
|
||||
case *net.IPNet:
|
||||
if !found {
|
||||
ip = v.IP
|
||||
local = ip.String()
|
||||
if cfg.Node.IsLocal == "yes" {
|
||||
found = localrange.Contains(ip)
|
||||
} else {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
case *net.IPAddr:
|
||||
if !found {
|
||||
ip = v.IP
|
||||
local = ip.String()
|
||||
if cfg.Node.IsLocal == "yes" {
|
||||
found = localrange.Contains(ip)
|
||||
|
||||
} else {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cfg.Node.LocalAddress = local
|
||||
}
|
||||
cfg.Node.LocalAddress = local
|
||||
}
|
||||
}
|
||||
if cfg.Node.Password == "" {
|
||||
cfg.Node.Password = GenPass()
|
||||
}
|
||||
if cfg.Node.Endpoint == "" {
|
||||
if cfg.Node.Endpoint == "" {
|
||||
if cfg.Node.IsLocal == "yes" && cfg.Node.LocalAddress != "" {
|
||||
cfg.Node.Endpoint = cfg.Node.LocalAddress
|
||||
} else {
|
||||
@@ -111,9 +112,9 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cfg.Node.Endpoint = cfg.Node.Endpoint
|
||||
}
|
||||
} else {
|
||||
cfg.Node.Endpoint = cfg.Node.Endpoint
|
||||
}
|
||||
if cfg.Node.PrivateKey == "" {
|
||||
privatekey, err := wgtypes.GeneratePrivateKey()
|
||||
if err != nil {
|
||||
@@ -130,7 +131,7 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
} else if len(macs) == 0 {
|
||||
log.Fatal()
|
||||
} else {
|
||||
cfg.Node.MacAddress = macs[0]
|
||||
cfg.Node.MacAddress = macs[0]
|
||||
}
|
||||
}
|
||||
if cfg.Node.Port == 0 {
|
||||
@@ -148,48 +149,48 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
}
|
||||
conn, err := grpc.Dial(cfg.Server.GRPCAddress, requestOpts)
|
||||
|
||||
if err != nil {
|
||||
log.Fatalf("Unable to establish client connection to " + cfg.Server.GRPCAddress + ": %v", err)
|
||||
}
|
||||
if err != nil {
|
||||
log.Fatalf("Unable to establish client connection to "+cfg.Server.GRPCAddress+": %v", err)
|
||||
}
|
||||
|
||||
wcclient = nodepb.NewNodeServiceClient(conn)
|
||||
wcclient = nodepb.NewNodeServiceClient(conn)
|
||||
|
||||
postnode := &nodepb.Node{
|
||||
Password: cfg.Node.Password,
|
||||
Macaddress: cfg.Node.MacAddress,
|
||||
Accesskey: cfg.Server.AccessKey,
|
||||
Nodenetwork: cfg.Network,
|
||||
Listenport: cfg.Node.Port,
|
||||
Postup: cfg.Node.PostUp,
|
||||
Postdown: cfg.Node.PostDown,
|
||||
Keepalive: cfg.Node.KeepAlive,
|
||||
postnode := &nodepb.Node{
|
||||
Password: cfg.Node.Password,
|
||||
Macaddress: cfg.Node.MacAddress,
|
||||
Accesskey: cfg.Server.AccessKey,
|
||||
Nodenetwork: cfg.Network,
|
||||
Listenport: cfg.Node.Port,
|
||||
Postup: cfg.Node.PostUp,
|
||||
Postdown: cfg.Node.PostDown,
|
||||
Keepalive: cfg.Node.KeepAlive,
|
||||
Localaddress: cfg.Node.LocalAddress,
|
||||
Interface: cfg.Node.Interface,
|
||||
Publickey: cfg.Node.PublicKey,
|
||||
Name: cfg.Node.Name,
|
||||
Endpoint: cfg.Node.Endpoint,
|
||||
}
|
||||
err = config.ModConfig(postnode)
|
||||
if err != nil {
|
||||
Interface: cfg.Node.Interface,
|
||||
Publickey: cfg.Node.PublicKey,
|
||||
Name: cfg.Node.Name,
|
||||
Endpoint: cfg.Node.Endpoint,
|
||||
}
|
||||
err = config.ModConfig(postnode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
res, err := wcclient.CreateNode(
|
||||
context.TODO(),
|
||||
&nodepb.CreateNodeReq{
|
||||
Node: postnode,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
res, err := wcclient.CreateNode(
|
||||
context.TODO(),
|
||||
&nodepb.CreateNodeReq{
|
||||
Node: postnode,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Println("node created on remote server...updating configs")
|
||||
node := res.Node
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
node := res.Node
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if node.Dnsoff==true {
|
||||
if node.Dnsoff == true {
|
||||
cfg.Node.DNS = "yes"
|
||||
}
|
||||
if !(cfg.Node.IsLocal == "yes") && node.Islocal && node.Localrange != "" {
|
||||
@@ -199,15 +200,15 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
}
|
||||
node.Endpoint = node.Localaddress
|
||||
}
|
||||
err = config.ModConfig(node)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = config.ModConfig(node)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if node.Ispending {
|
||||
fmt.Println("Node is marked as PENDING.")
|
||||
fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
|
||||
if cfg.Daemon != "off" {
|
||||
if cfg.Daemon != "off" {
|
||||
err = local.ConfigureSystemD(cfg.Network)
|
||||
return err
|
||||
}
|
||||
@@ -217,23 +218,23 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
|
||||
if err != nil {
|
||||
log.Println("failed to retrieve peers")
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
err = wireguard.StorePrivKey(cfg.Node.PrivateKey, cfg.Network)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Println("starting wireguard")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Println("starting wireguard")
|
||||
err = wireguard.InitWireguard(node, cfg.Node.PrivateKey, peers, hasGateway, gateways)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if cfg.Daemon != "off" {
|
||||
err = local.ConfigureSystemD(cfg.Network)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
@@ -241,16 +242,15 @@ func JoinNetwork(cfg config.ClientConfig) error {
|
||||
//generate an access key value
|
||||
func GenPass() string {
|
||||
|
||||
var seededRand *rand.Rand = rand.New(
|
||||
rand.NewSource(time.Now().UnixNano()))
|
||||
var seededRand *rand.Rand = rand.New(
|
||||
rand.NewSource(time.Now().UnixNano()))
|
||||
|
||||
length := 16
|
||||
charset := "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
length := 16
|
||||
charset := "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
|
||||
b := make([]byte, length)
|
||||
for i := range b {
|
||||
b[i] = charset[seededRand.Intn(len(charset))]
|
||||
}
|
||||
return string(b)
|
||||
b := make([]byte, length)
|
||||
for i := range b {
|
||||
b[i] = charset[seededRand.Intn(len(charset))]
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user