mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-25 08:09:30 +01:00
e6e9f0322f
Before this change, NetBird Agent wasn't handling peer interface configuration changes dynamically. Also, remote peer configuration changes have not been applied (e.g. AllowedIPs changed). Not a very common cause, but still it should be handled. Now, Agent reacts to PeerConfig changes sent from the management service and restarts remote connections if AllowedIps have been changed.
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
//go:build linux || darwin
|
|
// +build linux darwin
|
|
|
|
package iface
|
|
|
|
import (
|
|
log "github.com/sirupsen/logrus"
|
|
"golang.zx2c4.com/wireguard/conn"
|
|
"golang.zx2c4.com/wireguard/device"
|
|
"golang.zx2c4.com/wireguard/ipc"
|
|
"golang.zx2c4.com/wireguard/tun"
|
|
"net"
|
|
)
|
|
|
|
// createWithUserspace Creates a new Wireguard interface, using wireguard-go userspace implementation
|
|
func (w *WGIface) createWithUserspace() error {
|
|
|
|
tunIface, err := tun.CreateTUN(w.Name, w.MTU)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
w.Interface = tunIface
|
|
|
|
// We need to create a wireguard-go device and listen to configuration requests
|
|
tunDevice := device.NewDevice(tunIface, conn.NewDefaultBind(), device.NewLogger(device.LogLevelSilent, "[wiretrustee] "))
|
|
err = tunDevice.Up()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
uapi, err := getUAPI(w.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
go func() {
|
|
for {
|
|
uapiConn, uapiErr := uapi.Accept()
|
|
if uapiErr != nil {
|
|
log.Traceln("uapi Accept failed with error: ", uapiErr)
|
|
continue
|
|
}
|
|
go tunDevice.IpcHandle(uapiConn)
|
|
}
|
|
}()
|
|
|
|
log.Debugln("UAPI listener started")
|
|
|
|
err = w.assignAddr()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// getUAPI returns a Listener
|
|
func getUAPI(iface string) (net.Listener, error) {
|
|
tunSock, err := ipc.UAPIOpen(iface)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ipc.UAPIListen(iface, tunSock)
|
|
}
|
|
|
|
// UpdateAddr updates address of the interface
|
|
func (w *WGIface) UpdateAddr(newAddr string) error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
addr, err := parseAddress(newAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
w.Address = addr
|
|
return w.assignAddr()
|
|
}
|