@@ -272,6 +272,8 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
272272 var errs error
273273 var selectedTarget netip.AddrPort
274274
275+ portfwd := settings .PortForward .Load ()
276+ canportfwd := portfwd
275277 if mux {
276278 if muxpid := h .mux .pid (src ); len (muxpid ) > 0 && containsPid (pids , muxpid ) {
277279 if settings .Debug {
@@ -283,8 +285,8 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
283285 }
284286
285287 if settings .Debug {
286- log .VV ("udp: connect: %s [%s] proxying %s => %s [%v]; pids: %s, mux? %t" ,
287- cid , uid , src , target , actualTargets , pids , mux )
288+ log .VV ("udp: connect: %s [%s] proxying %s => %s [%v]; pids: %s, mux? %t / fwd? %t " ,
289+ cid , uid , src , target , actualTargets , pids , mux , canportfwd )
288290 }
289291
290292 // note: fake-dns-ips shouldn't be un-nated / un-alg'd
@@ -301,20 +303,22 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
301303 selectedTarget = dstipp
302304
303305 if err != nil || px == nil {
304- log .W ("udp: connect: #%d: %s [%s] failed to get proxy from %s: %v" , i , cid , uid , pidstr ( px ) , err )
306+ log .W ("udp: connect: #%d: %s [%s] failed to get proxy from %s: %v" , i , cid , uid , pxid , err )
305307 errs = err // disconnect if loop terminates
306308 continue
307309 }
308310
311+ canportfwd = portfwd && ipn .Remote (pxid )
312+
309313 if mux { // mux is not supported by all proxies (few like Exit, Base, WG support it)
310- pc , err = h .mux .associate (cid , pxid , uid , src , selectedTarget , px .Dialer ().Announce , vendor (dmx ))
314+ pc , err = h .mux .associate (cid , pxid , uid , src , selectedTarget , px .Dialer ().Announce , vendor (dmx ), canportfwd )
311315 } else {
312316 if settings .Debug {
313- log .VV ("udp: connect: #%d: attempt: %s [%s] proxy(%s) to dst(%s); mux? %t" ,
314- i , cid , uid , pxid , selectedTarget , mux )
317+ log .VV ("udp: connect: #%d: attempt: %s [%s] proxy(%s) to dst(%s); mux? %t / fwd? %t " ,
318+ i , cid , uid , pxid , selectedTarget , mux , canportfwd )
315319 }
316320
317- if settings . PortForward . Load () {
321+ if canportfwd {
318322 boundSrc := makeAnyAddrPort (src )
319323 pc , err = px .Dialer ().DialBind ("udp" , boundSrc .String (), selectedTarget .String ())
320324 } else {
@@ -329,8 +333,8 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
329333 errs = err // store just the last err; complicates logging
330334 end := time .Since (smm .start )
331335 smm .Rtt = time .Since (rttstart ).Milliseconds ()
332- log .W ("udp: connect: #%d: %s [%s] failed; mux? %t, addr(%s) / fallback? %t; (rtt:%dms, dur:%s) w err(%v)" ,
333- i , cid , uid , mux , dstipp , fallingback , smm .Rtt , core .FmtPeriod (end ), err )
336+ log .W ("udp: connect: #%d: %s [%s] failed; mux? %t / fwd? %t , addr(%s) / fallback? %t; (rtt:%dms, dur:%s) w err(%v)" ,
337+ i , cid , uid , mux , canportfwd , dstipp , fallingback , smm .Rtt , core .FmtPeriod (end ), err )
334338 if end > retryTimeout {
335339 break
336340 }
@@ -343,7 +347,8 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
343347 }
344348
345349 if ! selectedTarget .IsValid () {
346- log .E ("udp: connect: %s [%s] no target addr for %s from %v" , cid , uid , target , actualTargets )
350+ log .E ("udp: connect: %s [%s] no target addr for %s from %v" ,
351+ cid , uid , target , actualTargets )
347352 return nil , smm , errUdpNoTarget
348353 }
349354
@@ -354,8 +359,8 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
354359 if errs != nil {
355360 return nil , smm , errs // disconnect
356361 } else if px == nil || pc == nil || core .IsNil (pc ) {
357- log .W ("udp: connect: %s [%s] no proxy/egress-conn (mux? %t) for addr(%s/%s)" ,
358- cid , uid , mux , target , selectedTarget )
362+ log .W ("udp: connect: %s [%s] no proxy/egress-conn (mux? %t / fwd? %t ) for addr(%s/%s)" ,
363+ cid , uid , mux , canportfwd , target , selectedTarget )
359364 return nil , smm , errUdpSetupConn // disconnect
360365 }
361366
@@ -370,12 +375,12 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
370375 default :
371376 clos (pc )
372377 log .E ("udp: connect: %s [%s] proxy(%s) does not impl core.UDPConn(%s/%s); mux? %t" ,
373- cid , uid , pxid , target , selectedTarget , mux , uid )
378+ cid , uid , pxid , target , selectedTarget , mux , canportfwd , uid )
374379 return nil , smm , errUdpSetupConn // disconnect
375380 }
376381
377- log .I ("udp: connect: %s [%s] (proxy? %s@%s) %v => %s/%s; fallback? %t / mux? %t" ,
378- cid , uid , pxid , px .GetAddr (), laddr , target , selectedTarget , fallingback , mux )
382+ log .I ("udp: connect: %s [%s] (proxy? %s@%s) %v => %s/%s; fallback? %t / mux? %t / fwd? %t " ,
383+ cid , uid , pxid , px .GetAddr (), laddr , target , selectedTarget , fallingback , mux , canportfwd )
379384
380385 return pc , smm , nil // connect
381386}
0 commit comments