mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-03 11:59:36 +01:00
a78fd69f80
Added host configurators for Linux, Windows, and macOS. The host configurator will update the peer system configuration directing DNS queries according to its capabilities. Some Linux distributions don't support split (match) DNS or custom ports, and that will be reported to our management system in another PR
79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package iface
|
|
|
|
import (
|
|
"fmt"
|
|
log "github.com/sirupsen/logrus"
|
|
"golang.org/x/sys/windows"
|
|
"golang.zx2c4.com/wireguard/windows/driver"
|
|
"golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
|
|
"net"
|
|
)
|
|
|
|
// Create Creates a new Wireguard interface, sets a given IP and brings it up.
|
|
func (w *WGIface) Create() error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
WintunStaticRequestedGUID, _ := windows.GenerateGUID()
|
|
adapter, err := driver.CreateAdapter(w.Name, "WireGuard", &WintunStaticRequestedGUID)
|
|
if err != nil {
|
|
err = fmt.Errorf("error creating adapter: %w", err)
|
|
return err
|
|
}
|
|
w.Interface = adapter
|
|
luid := adapter.LUID()
|
|
err = adapter.SetAdapterState(driver.AdapterStateUp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
state, _ := luid.GUID()
|
|
log.Debugln("device guid: ", state.String())
|
|
return w.assignAddr(luid)
|
|
}
|
|
|
|
// assignAddr Adds IP address to the tunnel interface and network route based on the range provided
|
|
func (w *WGIface) assignAddr(luid winipcfg.LUID) error {
|
|
|
|
log.Debugf("adding address %s to interface: %s", w.Address.IP, w.Name)
|
|
err := luid.SetIPAddresses([]net.IPNet{{w.Address.IP, w.Address.Network.Mask}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// UpdateAddr updates address of the interface
|
|
func (w *WGIface) UpdateAddr(newAddr string) error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
luid := w.Interface.(*driver.Adapter).LUID()
|
|
addr, err := parseAddress(newAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
w.Address = addr
|
|
return w.assignAddr(luid)
|
|
}
|
|
|
|
// GetInterfaceGUIDString returns an interface GUID string
|
|
func (w *WGIface) GetInterfaceGUIDString() (string, error) {
|
|
if w.Interface == nil {
|
|
return "", fmt.Errorf("interface has not been initialized yet")
|
|
}
|
|
windowsDevice := w.Interface.(*driver.Adapter)
|
|
luid := windowsDevice.LUID()
|
|
guid, err := luid.GUID()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return guid.String(), nil
|
|
}
|
|
|
|
// WireguardModuleIsLoaded check if we can load wireguard mod (linux only)
|
|
func WireguardModuleIsLoaded() bool {
|
|
return false
|
|
}
|