From 6fe247ec07925d00586f8573a901a6efc019f327 Mon Sep 17 00:00:00 2001 From: Maycon Santos Date: Mon, 13 May 2024 11:32:29 +0200 Subject: [PATCH] validate-mtu, nexthop and tun address config --- client/internal/routemanager/client.go | 6 ++++++ client/internal/routemanager/systemops.go | 9 +++++++-- iface/iface.go | 2 +- iface/tun_darwin.go | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/client/internal/routemanager/client.go b/client/internal/routemanager/client.go index e82f4b1da..7d6314aeb 100644 --- a/client/internal/routemanager/client.go +++ b/client/internal/routemanager/client.go @@ -261,6 +261,12 @@ func (c *clientNetwork) recalculateRouteAndUpdatePeerAndSystem() error { return fmt.Errorf("remove route from peer: %v", err) } } else { + if c.network == netip.MustParsePrefix("0.0.0.0/0") { + s, err := c.statusRecorder.GetPeer(c.routes[chosen].Peer) + if err == nil && s.IP != "" { + exitIP = netip.MustParseAddr(s.IP) + } + } // otherwise add the route to the system if err := addVPNRoute(c.network, c.getAsInterface()); err != nil { return fmt.Errorf("route %s couldn't be added for peer %s, err: %v", diff --git a/client/internal/routemanager/systemops.go b/client/internal/routemanager/systemops.go index c7baead48..beca0419b 100644 --- a/client/internal/routemanager/systemops.go +++ b/client/internal/routemanager/systemops.go @@ -29,6 +29,7 @@ var ErrRouteNotFound = errors.New("route not found") var ErrRouteNotAllowed = errors.New("route not allowed") var tunIP netip.Addr +var exitIP netip.Addr // TODO: fix: for default our wg address now appears as the default gw func addRouteForCurrentDefaultGateway(prefix netip.Prefix) error { @@ -198,10 +199,14 @@ func addRouteToNonVPNIntf(prefix netip.Prefix, vpnIntf *iface.WGIface, initialNe // in two /1 prefixes to avoid replacing the existing default route func genericAddVPNRoute(prefix netip.Prefix, intf *net.Interface) error { if prefix == defaultv4 { - if err := addToRouteTable(splitDefaultv4_1, tunIP, intf); err != nil { + ip := tunIP + if exitIP.IsValid() { + ip = exitIP + } + if err := addToRouteTable(splitDefaultv4_1, ip, intf); err != nil { return err } - if err := addToRouteTable(splitDefaultv4_2, tunIP, intf); err != nil { + if err := addToRouteTable(splitDefaultv4_2, ip, intf); err != nil { if err2 := removeFromRouteTable(splitDefaultv4_1, netip.Addr{}, intf); err2 != nil { log.Warnf("Failed to rollback route addition: %s", err2) } diff --git a/iface/iface.go b/iface/iface.go index 3ae40ad4c..da72cb30a 100644 --- a/iface/iface.go +++ b/iface/iface.go @@ -13,7 +13,7 @@ import ( ) const ( - DefaultMTU = 1280 + DefaultMTU = 1420 DefaultWgPort = 51820 ) diff --git a/iface/tun_darwin.go b/iface/tun_darwin.go index bac14986f..408a520de 100644 --- a/iface/tun_darwin.go +++ b/iface/tun_darwin.go @@ -4,6 +4,7 @@ package iface import ( + "net/netip" "os/exec" "github.com/pion/transport/v3" @@ -119,7 +120,9 @@ func (t *tunDevice) Wrapper() *DeviceWrapper { // assignAddr Adds IP address to the tunnel interface and network route based on the range provided func (t *tunDevice) assignAddr() error { - cmd := exec.Command("ifconfig", t.name, "inet", t.address.IP.String(), t.address.IP.String()) + np := netip.MustParseAddr(t.address.IP.String()) + + cmd := exec.Command("ifconfig", t.name, "inet", t.address.IP.String(), np.Prev().String()) if out, err := cmd.CombinedOutput(); err != nil { log.Infof(`adding address command "%v" failed with output %s and error: `, cmd.String(), out) return err