diff --git a/Readme.md b/Readme.md index 08b2795..fed1dfd 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,11 @@ -test -Easy to use wireguard abstraction for linux -# Used -* github.com/vishvananda/netlink -* golang.zx2c4.com/wireguard/wgctrl +#GoWgPKG + +git.keks.cloud/kekskurse/gowgpkg + +Go Package to configure Wireguard on Linux + +* Create Devices +* Configure Device +* Create Wireguard +* Configure wireguard +* Provides Structs with all needed information \ No newline at end of file diff --git a/peer.go b/peer.go new file mode 100644 index 0000000..0cc6d0b --- /dev/null +++ b/peer.go @@ -0,0 +1,57 @@ +package gowgpkg + +import ( + "fmt" + "net" + "golang.zx2c4.com/wireguard/wgctrl" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" +) + +func PeerAdd(deviceName string, PeerPublicKey string, PeerPresharedKey string, ipList []net.IPNet, endpoint *net.UDPAddr) (error) { + client, err := wgctrl.New() + if err != nil { + return fmt.Errorf("Cant create wgctrl: %w", err) + } + + pubKey, err := wgtypes.ParseKey(PeerPublicKey) + if err != nil { + return fmt.Errorf("Cant parse public key: %e", err) + } + + var preKey *wgtypes.Key + if PeerPresharedKey != "" { + presharedKey, err := wgtypes.ParseKey(PeerPresharedKey) + if err != nil { + return fmt.Errorf("Cant parse preshared key: %e", err) + } + preKey = &presharedKey + } + + peerConfig := wgtypes.PeerConfig{ + PublicKey: pubKey, + Remove: false, + UpdateOnly: false, + PresharedKey: preKey, + Endpoint: endpoint, + PersistentKeepaliveInterval: nil, + ReplaceAllowedIPs: true, + AllowedIPs: ipList, + } + var peerConfigs []wgtypes.PeerConfig + peerConfigs = append(peerConfigs, peerConfig) + + config := wgtypes.Config{ + PrivateKey: nil, + ListenPort: nil, + FirewallMark: nil, + ReplacePeers: false, + Peers: peerConfigs, + } + + err = client.ConfigureDevice(deviceName, config) + if err != nil { + return fmt.Errorf("Cant add peer: %e", err) + } + + return nil +} \ No newline at end of file