|
@@ -1,14 +1,11 @@
|
|
|
package wireguard
|
|
|
|
|
|
import (
|
|
|
- "errors"
|
|
|
"fmt"
|
|
|
"io/ioutil"
|
|
|
"log"
|
|
|
- "net"
|
|
|
"os"
|
|
|
"os/exec"
|
|
|
- "strconv"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/gravitl/netmaker/models"
|
|
@@ -20,117 +17,6 @@ import (
|
|
|
//homedir "github.com/mitchellh/go-homedir"
|
|
|
)
|
|
|
|
|
|
-func InitGRPCWireguard(client models.IntClient) error {
|
|
|
-
|
|
|
- key, err := wgtypes.ParseKey(client.PrivateKey)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- serverkey, err := wgtypes.ParseKey(client.ServerKey)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- serverport, err := strconv.Atoi(client.ServerWGPort)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- wgclient, err := wgctrl.New()
|
|
|
- if err != nil {
|
|
|
- log.Fatalf("failed to open client: %v", err)
|
|
|
- }
|
|
|
- defer wgclient.Close()
|
|
|
-
|
|
|
- ifacename := "grpc-wg-001"
|
|
|
- if client.Address6 == "" && client.Address == "" {
|
|
|
- return errors.New("no address to configure")
|
|
|
- }
|
|
|
- currentiface, err := net.InterfaceByName(ifacename)
|
|
|
- if err != nil {
|
|
|
- _, err = local.RunCmd("ip link add dev " + ifacename + " type wireguard")
|
|
|
- if err != nil && !strings.Contains(err.Error(), "exists") {
|
|
|
- log.Println("Error creating interface")
|
|
|
- }
|
|
|
- }
|
|
|
- match := false
|
|
|
- match6 := false
|
|
|
- addrs, _ := currentiface.Addrs()
|
|
|
-
|
|
|
- //Add IPv4Address (make into separate function)
|
|
|
- for _, a := range addrs {
|
|
|
- if strings.Contains(a.String(), client.Address) {
|
|
|
- match = true
|
|
|
- }
|
|
|
- if strings.Contains(a.String(), client.Address6) {
|
|
|
- match6 = true
|
|
|
- }
|
|
|
- }
|
|
|
- if !match && client.Address != "" {
|
|
|
- _, err = local.RunCmd("ip address add dev " + ifacename + " " + client.Address + "/24")
|
|
|
- if err != nil {
|
|
|
- log.Println("Error adding ipv4 address")
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
- }
|
|
|
- if !match6 && client.Address6 != "" {
|
|
|
- _, err = local.RunCmd("ip address add dev" + ifacename + " " + client.Address6 + "/64")
|
|
|
- if err != nil {
|
|
|
- log.Println("Error adding ipv6 address")
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
- }
|
|
|
- var peers []wgtypes.PeerConfig
|
|
|
- var peeraddr = net.IPNet{
|
|
|
- IP: net.ParseIP(client.ServerPrivateAddress),
|
|
|
- Mask: net.CIDRMask(32, 32),
|
|
|
- }
|
|
|
- var allowedips []net.IPNet
|
|
|
- allowedips = append(allowedips, peeraddr)
|
|
|
- net.ParseIP(client.ServerPublicEndpoint)
|
|
|
- peer := wgtypes.PeerConfig{
|
|
|
- PublicKey: serverkey,
|
|
|
- Endpoint: &net.UDPAddr{
|
|
|
- IP: net.ParseIP(client.ServerPublicEndpoint),
|
|
|
- Port: serverport,
|
|
|
- },
|
|
|
- ReplaceAllowedIPs: true,
|
|
|
- AllowedIPs: allowedips,
|
|
|
- }
|
|
|
- peers = append(peers, peer)
|
|
|
- conf := wgtypes.Config{
|
|
|
- PrivateKey: &key,
|
|
|
- ReplacePeers: true,
|
|
|
- Peers: peers,
|
|
|
- }
|
|
|
- _, err = wgclient.Device(ifacename)
|
|
|
- if err != nil {
|
|
|
- if os.IsNotExist(err) {
|
|
|
- log.Println("Device does not exist: ")
|
|
|
- log.Println(err)
|
|
|
- } else {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
- err = wgclient.ConfigureDevice(ifacename, conf)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- if os.IsNotExist(err) {
|
|
|
- log.Println("Device does not exist: ")
|
|
|
- log.Println(err)
|
|
|
- } else {
|
|
|
- log.Printf("This is inconvenient: %v", err)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- _, err = local.RunCmd("ip link set up dev " + ifacename)
|
|
|
- _, err = local.RunCmd("ip link set down dev " + ifacename)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- return err
|
|
|
-}
|
|
|
-
|
|
|
func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig, hasGateway bool, gateways []string) error {
|
|
|
|
|
|
ipExec, err := exec.LookPath("ip")
|
|
@@ -370,7 +256,7 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) {
|
|
|
|
|
|
for _, currentPeer := range device.Peers {
|
|
|
if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
|
|
|
- currentPeer.PublicKey.String() == peer.PublicKey.String() {
|
|
|
+ currentPeer.PublicKey.String() != peer.PublicKey.String() {
|
|
|
_, err := local.RunCmd("wg set " + iface + " peer " + currentPeer.PublicKey.String() + " delete")
|
|
|
if err != nil {
|
|
|
log.Println("error setting peer", peer.Endpoint.String())
|