Fix some port overlap problems

This commit is contained in:
Owen Schwartz 2024-12-08 20:49:26 -05:00
parent e99853422c
commit 49580f1a3c
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
2 changed files with 26 additions and 8 deletions

22
main.go
View file

@ -297,6 +297,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey(
if len(wgData.Targets.UDP) > 0 { if len(wgData.Targets.UDP) > 0 {
updateTargets(pm, "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP}) updateTargets(pm, "add", wgData.TunnelIP, "udp", TargetData{Targets: wgData.Targets.UDP})
} }
err = pm.Start()
if err != nil {
logger.Error("Failed to start proxy manager: %v", err)
}
}) })
client.RegisterHandler("newt/tcp/add", func(msg websocket.WSMessage) { client.RegisterHandler("newt/tcp/add", func(msg websocket.WSMessage) {
@ -317,6 +322,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey(
if len(targetData.Targets) > 0 { if len(targetData.Targets) > 0 {
updateTargets(pm, "add", wgData.TunnelIP, "tcp", targetData) updateTargets(pm, "add", wgData.TunnelIP, "tcp", targetData)
} }
err = pm.Start()
if err != nil {
logger.Error("Failed to start proxy manager: %v", err)
}
}) })
client.RegisterHandler("newt/udp/add", func(msg websocket.WSMessage) { client.RegisterHandler("newt/udp/add", func(msg websocket.WSMessage) {
@ -337,6 +347,11 @@ persistent_keepalive_interval=5`, fixKey(fmt.Sprintf("%s", privateKey)), fixKey(
if len(targetData.Targets) > 0 { if len(targetData.Targets) > 0 {
updateTargets(pm, "add", wgData.TunnelIP, "udp", targetData) updateTargets(pm, "add", wgData.TunnelIP, "udp", targetData)
} }
err = pm.Start()
if err != nil {
logger.Error("Failed to start proxy manager: %v", err)
}
}) })
client.RegisterHandler("newt/udp/remove", func(msg websocket.WSMessage) { client.RegisterHandler("newt/udp/remove", func(msg websocket.WSMessage) {
@ -456,13 +471,6 @@ func updateTargets(pm *proxy.ProxyManager, action string, tunnelIP string, proto
// Add the new target // Add the new target
pm.AddTarget(proto, tunnelIP, port, target) pm.AddTarget(proto, tunnelIP, port, target)
// Start just this target by calling Start() on the proxy manager
// The Start() function is idempotent and will only start new targets
err = pm.Start()
if err != nil {
logger.Error("Failed to start proxy manager after adding target: %v", err)
return err
}
} else if action == "remove" { } else if action == "remove" {
logger.Info("Removing target with port %d", port) logger.Info("Removing target with port %d", port)
err := pm.RemoveTarget(proto, tunnelIP, port) err := pm.RemoveTarget(proto, tunnelIP, port)

View file

@ -22,6 +22,8 @@ func (pm *ProxyManager) AddTarget(protocol, listen string, port int, target stri
pm.Lock() pm.Lock()
defer pm.Unlock() defer pm.Unlock()
logger.Info("Adding target: %s://%s:%d -> %s", protocol, listen, port, target)
newTarget := ProxyTarget{ newTarget := ProxyTarget{
Protocol: protocol, Protocol: protocol,
Listen: listen, Listen: listen,
@ -99,12 +101,20 @@ func (pm *ProxyManager) Start() error {
for i := range pm.targets { for i := range pm.targets {
target := &pm.targets[i] target := &pm.targets[i]
// Skip already running targets
target.Lock() target.Lock()
// If target is already running, skip it
if target.listener != nil || target.udpConn != nil { if target.listener != nil || target.udpConn != nil {
target.Unlock() target.Unlock()
continue continue
} }
// Mark the target as starting by creating a nil listener/connection
// This prevents other goroutines from trying to start it
if strings.ToLower(target.Protocol) == "tcp" {
target.listener = nil
} else {
target.udpConn = nil
}
target.Unlock() target.Unlock()
switch strings.ToLower(target.Protocol) { switch strings.ToLower(target.Protocol) {