summaryrefslogtreecommitdiffhomepage
path: root/wgengine/netstack/netstack.go
diff options
context:
space:
mode:
authorchaosinthecrd <tom@tmlabs.co.uk>2026-01-23 12:19:38 +0000
committerchaosinthecrd <tom@tmlabs.co.uk>2026-02-02 15:50:38 +0000
commitbf7508dbf66a927b7600cc2968f03c81a0fe7e54 (patch)
treec3ef2c7b2108ad7510ddfcd9018b690117938dce /wgengine/netstack/netstack.go
parent63d563e7340b4712b9f2933f663057ce2dcfa4a4 (diff)
downloadtailscale-chaosinthecrd/userspace-tsnet-proxy.tar.xz
tailscale-chaosinthecrd/userspace-tsnet-proxy.zip
cmd/k8s-proxy,kube/k8s-proxy: starting userspace proxychaosinthecrd/userspace-tsnet-proxy
Signed-off-by: chaosinthecrd <tom@tmlabs.co.uk>
Diffstat (limited to 'wgengine/netstack/netstack.go')
-rw-r--r--wgengine/netstack/netstack.go28
1 files changed, 28 insertions, 0 deletions
diff --git a/wgengine/netstack/netstack.go b/wgengine/netstack/netstack.go
index e05846e15..27aa39014 100644
--- a/wgengine/netstack/netstack.go
+++ b/wgengine/netstack/netstack.go
@@ -1109,6 +1109,34 @@ func (ns *Impl) shouldProcessInbound(p *packet.Parsed, t *tstun.Wrapper) bool {
return true
}
}
+ // check if there's a registered UDP endpoint for this service VIP
+ // This allows userspace UDP listeners (e.g., via tsnet.ListenPacket) to
+ // receive traffic on service VIP addresses.
+ if p.IPProto == ipproto.UDP {
+ var netProto tcpip.NetworkProtocolNumber
+ var id stack.TransportEndpointID
+ if p.Dst.Addr().Is4() {
+ netProto = ipv4.ProtocolNumber
+ id = stack.TransportEndpointID{
+ LocalAddress: tcpip.AddrFrom4(p.Dst.Addr().As4()),
+ LocalPort: p.Dst.Port(),
+ RemoteAddress: tcpip.AddrFrom4(p.Src.Addr().As4()),
+ RemotePort: p.Src.Port(),
+ }
+ } else {
+ netProto = ipv6.ProtocolNumber
+ id = stack.TransportEndpointID{
+ LocalAddress: tcpip.AddrFrom16(p.Dst.Addr().As16()),
+ LocalPort: p.Dst.Port(),
+ RemoteAddress: tcpip.AddrFrom16(p.Src.Addr().As16()),
+ RemotePort: p.Src.Port(),
+ }
+ }
+ ep := ns.ipstack.FindTransportEndpoint(netProto, udp.ProtocolNumber, id, nicID)
+ if ep != nil {
+ return true
+ }
+ }
return false
}
if p.IPVersion == 6 && !isLocal && viaRange.Contains(dstIP) {