From db5f9313733660b82ad00d3395f32a9bbde8cc87 Mon Sep 17 00:00:00 2001 From: braginini Date: Sat, 8 Apr 2023 17:22:53 +0200 Subject: [PATCH] use direct mode only when in the same private /16 network --- client/internal/peer/conn.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/client/internal/peer/conn.go b/client/internal/peer/conn.go index de56bf319..eb7ff9db4 100644 --- a/client/internal/peer/conn.go +++ b/client/internal/peer/conn.go @@ -340,13 +340,33 @@ func shouldUseProxy(pair *ice.CandidatePair, userspaceBind bool) bool { return false } - if isHostCandidateWithPrivateIP(pair.Local) && isHostCandidateWithPrivateIP(pair.Remote) { + if isHostCandidateWithPrivateIP(pair.Local) && isHostCandidateWithPrivateIP(pair.Remote) && isSameNetworkPrefix(pair) { return false } return true } +func isSameNetworkPrefix(pair *ice.CandidatePair) bool { + + localIPStr, _, err := net.SplitHostPort(pair.Local.Address()) + if err != nil { + return false + } + remoteIPStr, _, err := net.SplitHostPort(pair.Remote.Address()) + if err != nil { + return false + } + localIP := net.ParseIP(localIPStr) + remoteIP := net.ParseIP(remoteIPStr) + if localIP == nil || remoteIP == nil { + return false + } + // only consider /16 networks + mask := net.IPMask{255, 255, 0, 0} + return localIP.Mask(mask).Equal(remoteIP.Mask(mask)) +} + func isRelayCandidate(candidate ice.Candidate) bool { return candidate.Type() == ice.CandidateTypeRelay }