2021-05-01 12:45:37 +02:00
|
|
|
package iface
|
|
|
|
|
2021-06-24 11:46:33 +02:00
|
|
|
import (
|
|
|
|
"net"
|
2022-06-04 19:41:01 +02:00
|
|
|
"sync"
|
2023-02-13 18:34:56 +01:00
|
|
|
"time"
|
|
|
|
|
2023-04-13 17:00:01 +02:00
|
|
|
"github.com/netbirdio/netbird/iface/bind"
|
|
|
|
|
2023-02-13 18:34:56 +01:00
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
2021-06-24 11:46:33 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2022-05-08 11:04:57 +02:00
|
|
|
DefaultMTU = 1280
|
2022-03-01 14:07:33 +01:00
|
|
|
DefaultWgPort = 51820
|
2021-06-24 11:46:33 +02:00
|
|
|
)
|
|
|
|
|
2023-02-13 18:34:56 +01:00
|
|
|
// WGIface represents a interface instance
|
|
|
|
type WGIface struct {
|
2023-04-13 17:00:01 +02:00
|
|
|
tun *tunDevice
|
|
|
|
configurer wGConfigurer
|
|
|
|
mu sync.Mutex
|
|
|
|
userspaceBind bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsUserspaceBind indicates whether this interfaces is userspace with bind.ICEBind
|
|
|
|
func (w *WGIface) IsUserspaceBind() bool {
|
|
|
|
return w.userspaceBind
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetBind returns a userspace implementation of WireGuard Bind interface
|
|
|
|
func (w *WGIface) GetBind() *bind.ICEBind {
|
|
|
|
return w.tun.iceBind
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
// Create creates a new Wireguard interface, sets a given IP and brings it up.
|
|
|
|
// Will reuse an existing one.
|
|
|
|
func (w *WGIface) Create() error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
2023-04-13 17:00:01 +02:00
|
|
|
log.Debugf("create WireGuard interface %s", w.tun.DeviceName())
|
2023-03-17 10:37:27 +01:00
|
|
|
return w.tun.Create()
|
2021-06-24 11:46:33 +02:00
|
|
|
}
|
|
|
|
|
2023-02-13 18:34:56 +01:00
|
|
|
// Name returns the interface name
|
|
|
|
func (w *WGIface) Name() string {
|
2023-03-17 10:37:27 +01:00
|
|
|
return w.tun.DeviceName()
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Address returns the interface address
|
|
|
|
func (w *WGIface) Address() WGAddress {
|
2023-03-17 10:37:27 +01:00
|
|
|
return w.tun.WgAddress()
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Configure configures a Wireguard interface
|
|
|
|
// The interface must exist before calling this method (e.g. call interface.Create() before)
|
|
|
|
func (w *WGIface) Configure(privateKey string, port int) error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
2023-03-17 10:37:27 +01:00
|
|
|
log.Debugf("configuring Wireguard interface %s", w.tun.DeviceName())
|
|
|
|
return w.configurer.configureInterface(privateKey, port)
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateAddr updates address of the interface
|
|
|
|
func (w *WGIface) UpdateAddr(newAddr string) error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
|
|
|
|
|
|
|
addr, err := parseWGAddress(newAddr)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
return w.tun.UpdateAddr(addr)
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// UpdatePeer updates existing Wireguard Peer or creates a new one if doesn't exist
|
|
|
|
// Endpoint is optional
|
|
|
|
func (w *WGIface) UpdatePeer(peerKey string, allowedIps string, keepAlive time.Duration, endpoint *net.UDPAddr, preSharedKey *wgtypes.Key) error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
log.Debugf("updating interface %s peer %s: endpoint %s ", w.tun.DeviceName(), peerKey, endpoint)
|
|
|
|
return w.configurer.updatePeer(peerKey, allowedIps, keepAlive, endpoint, preSharedKey)
|
|
|
|
}
|
2023-02-13 18:34:56 +01:00
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
// RemovePeer removes a Wireguard Peer from the interface iface
|
|
|
|
func (w *WGIface) RemovePeer(peerKey string) error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
2023-02-13 18:34:56 +01:00
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
log.Debugf("Removing peer %s from interface %s ", peerKey, w.tun.DeviceName())
|
|
|
|
return w.configurer.removePeer(peerKey)
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// AddAllowedIP adds a prefix to the allowed IPs list of peer
|
|
|
|
func (w *WGIface) AddAllowedIP(peerKey string, allowedIP string) error {
|
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
log.Debugf("adding allowed IP to interface %s and peer %s: allowed IP %s ", w.tun.DeviceName(), peerKey, allowedIP)
|
|
|
|
return w.configurer.addAllowedIP(peerKey, allowedIP)
|
2021-06-24 11:46:33 +02:00
|
|
|
}
|
|
|
|
|
2023-02-13 18:34:56 +01:00
|
|
|
// RemoveAllowedIP removes a prefix from the allowed IPs list of peer
|
|
|
|
func (w *WGIface) RemoveAllowedIP(peerKey string, allowedIP string) error {
|
2022-06-04 19:41:01 +02:00
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
2023-02-13 18:34:56 +01:00
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
log.Debugf("removing allowed IP from interface %s and peer %s: allowed IP %s ", w.tun.DeviceName(), peerKey, allowedIP)
|
|
|
|
return w.configurer.removeAllowedIP(peerKey, allowedIP)
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|
|
|
|
|
2023-03-17 10:37:27 +01:00
|
|
|
// Close closes the tunnel interface
|
|
|
|
func (w *WGIface) Close() error {
|
2023-02-13 18:34:56 +01:00
|
|
|
w.mu.Lock()
|
|
|
|
defer w.mu.Unlock()
|
2023-03-17 10:37:27 +01:00
|
|
|
return w.tun.Close()
|
2023-02-13 18:34:56 +01:00
|
|
|
}
|