Proxy working?

This commit is contained in:
Owen
2025-07-25 12:00:09 -07:00
parent ccb7008579
commit 9fc692c090
3 changed files with 76 additions and 0 deletions

28
main.go
View File

@@ -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)
}
}
})

View File

@@ -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()

View File

@@ -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