From 9fc692c090e0e4b779bca8701300b1b5830f0787 Mon Sep 17 00:00:00 2001 From: Owen Date: Fri, 25 Jul 2025 12:00:09 -0700 Subject: [PATCH] Proxy working? --- main.go | 28 ++++++++++++++++++++++++++++ proxy/manager.go | 17 +++++++++++++++++ wgnetstack/wgnetstack.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/main.go b/main.go index 8df5402..ff85cc2 100644 --- a/main.go +++ b/main.go @@ -419,10 +419,18 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub // add the targets if there are any if len(wgData.Targets.TCP) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "tcp", TargetData{Targets: wgData.Targets.TCP}) + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "add", wgData.TunnelIP, "tcp", TargetData{Targets: wgData.Targets.TCP}) + } } if len(wgData.Targets.UDP) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP}) + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP}) + } } clientsAddProxyTarget(pm, wgData.TunnelIP) @@ -637,6 +645,11 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub if len(targetData.Targets) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "tcp", targetData) + + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "add", wgData.TunnelIP, "tcp", targetData) + } } }) @@ -657,6 +670,11 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub if len(targetData.Targets) > 0 { updateTargets(pm, "add", wgData.TunnelIP, "udp", targetData) + + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "add", wgData.TunnelIP, "udp", targetData) + } } }) @@ -677,6 +695,11 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub if len(targetData.Targets) > 0 { updateTargets(pm, "remove", wgData.TunnelIP, "udp", targetData) + + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "remove", wgData.TunnelIP, "udp", targetData) + } } }) @@ -697,6 +720,11 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub if len(targetData.Targets) > 0 { updateTargets(pm, "remove", wgData.TunnelIP, "tcp", targetData) + + // Also update wgnetstack proxy manager + if wgService != nil && wgService.GetNetstackNet() != nil && wgService.GetProxyManager() != nil { + updateTargets(wgService.GetProxyManager(), "remove", wgData.TunnelIP, "tcp", targetData) + } } }) diff --git a/proxy/manager.go b/proxy/manager.go index 35d023a..43a7da7 100644 --- a/proxy/manager.go +++ b/proxy/manager.go @@ -41,6 +41,23 @@ func NewProxyManager(tnet *netstack.Net) *ProxyManager { } } +// init function without tnet +func NewProxyManagerWithoutTNet() *ProxyManager { + return &ProxyManager{ + tcpTargets: make(map[string]map[int]string), + udpTargets: make(map[string]map[int]string), + listeners: make([]*gonet.TCPListener, 0), + udpConns: make([]*gonet.UDPConn, 0), + } +} + +// Function to add tnet to existing ProxyManager +func (pm *ProxyManager) SetTNet(tnet *netstack.Net) { + pm.mutex.Lock() + defer pm.mutex.Unlock() + pm.tnet = tnet +} + // AddTarget adds as new target for proxying func (pm *ProxyManager) AddTarget(proto, listenIP string, port int, targetAddr string) error { pm.mutex.Lock() diff --git a/wgnetstack/wgnetstack.go b/wgnetstack/wgnetstack.go index 5c3410a..b5bc9b8 100644 --- a/wgnetstack/wgnetstack.go +++ b/wgnetstack/wgnetstack.go @@ -17,6 +17,7 @@ import ( "github.com/fosrl/newt/logger" "github.com/fosrl/newt/network" + "github.com/fosrl/newt/proxy" "github.com/fosrl/newt/websocket" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/curve25519" @@ -75,6 +76,30 @@ type WireGuardService struct { // Callback for when netstack is ready onNetstackReady func(*netstack.Net) othertnet *netstack.Net + // Proxy manager for tunnel + proxyManager *proxy.ProxyManager + // ...existing code... +} + +// GetProxyManager returns the proxy manager for this WireGuardService +func (s *WireGuardService) GetProxyManager() *proxy.ProxyManager { + return s.proxyManager +} + +// AddProxyTarget adds a target to the proxy manager +func (s *WireGuardService) AddProxyTarget(proto, listenIP string, port int, targetAddr string) error { + if s.proxyManager == nil { + return fmt.Errorf("proxy manager not initialized") + } + return s.proxyManager.AddTarget(proto, listenIP, port, targetAddr) +} + +// RemoveProxyTarget removes a target from the proxy manager +func (s *WireGuardService) RemoveProxyTarget(proto, listenIP string, port int) error { + if s.proxyManager == nil { + return fmt.Errorf("proxy manager not initialized") + } + return s.proxyManager.RemoveTarget(proto, listenIP, port) } // Add this type definition @@ -199,6 +224,7 @@ func NewWireGuardService(interfaceName string, mtu int, generateAndSaveKeyTo str stopHolepunch: make(chan struct{}), Port: port, dns: dnsAddrs, + proxyManager: proxy.NewProxyManagerWithoutTNet(), } // Register websocket handlers @@ -356,6 +382,8 @@ func (s *WireGuardService) ensureWireguardInterface(wgconfig WgConfig) error { return fmt.Errorf("failed to create TUN device: %v", err) } + s.proxyManager.SetTNet(s.tnet) + // Create WireGuard device s.device = device.NewDevice(s.tun, NewFixedPortBind(s.Port), device.NewLogger( device.LogLevelSilent, // Use silent logging by default - could be made configurable @@ -382,6 +410,9 @@ func (s *WireGuardService) ensureWireguardInterface(wgconfig WgConfig) error { logger.Info("WireGuard netstack device created and configured") + // Create ProxyManager for this tunnel + s.proxyManager.Start() + // Store callback and tnet reference before releasing mutex callback := s.onNetstackReady tnet := s.tnet