Skip to content

Commit e16959c

Browse files
committed
dialers: fail-open if proto filters out all ips
1 parent c727daf commit e16959c

File tree

4 files changed

+21
-22
lines changed

4 files changed

+21
-22
lines changed

intra/dialers/ndial.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ func netdial(d *net.Dialer, network, addr string, connect netConnectFunc) (net.C
7575
}
7676

7777
ipset := ips.Addrs()
78-
allips := filter(ipset, confirmed)
78+
allips := maybeFilter(ipset, confirmed)
7979
if len(allips) <= 0 {
8080
var ok bool
8181
if ips, ok = renew(domain, ips); ok {
8282
ipset = ips.Addrs()
83-
allips = filter(ipset, confirmed)
83+
allips = maybeFilter(ipset, confirmed)
8484
}
8585
log.D("ndial: renew ips for %s; ok? %t", addr, ok)
8686
}

intra/dialers/pdial.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ func proxydial(d proxy.Dialer, network, addr string, connect proxyConnectFunc) (
7676

7777
s2 := time.Now()
7878
ipset := ips.Addrs()
79-
allips := filter(ipset, confirmed)
79+
allips := maybeFilter(ipset, confirmed)
8080
if len(allips) <= 0 {
8181
var ok bool
8282
if ips, ok = renew(domain, ips); ok {
8383
ipset = ips.Addrs()
84-
allips = filter(ipset, confirmed)
84+
allips = maybeFilter(ipset, confirmed)
8585
}
8686
log.D("pdial: renew ips for %s; ok? %t", addr, ok)
8787
}

intra/dialers/rdial.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,30 @@ type connectFunc func(*protect.RDial, string, netip.Addr, int) (net.Conn, error)
2323

2424
const dialRetryTimeout = 1 * time.Minute
2525

26-
func filter(ips []netip.Addr, exclude netip.Addr) []netip.Addr {
26+
func maybeFilter(ips []netip.Addr, alwaysExclude netip.Addr) []netip.Addr {
2727
filtered := make([]netip.Addr, 0, len(ips))
28-
var sample netip.Addr
28+
unfiltered := make([]netip.Addr, 0, len(ips))
2929
for _, ip := range ips {
30-
if ip.Compare(exclude) == 0 || !ip.IsValid() {
30+
if ip.Compare(alwaysExclude) == 0 || !ip.IsValid() {
3131
continue
3232
} else if ip.Is4() && ipProto == settings.IP6 {
33-
if ipok(ip) && !ipok(sample) {
34-
sample = ip
35-
}
36-
continue
33+
unfiltered = append(unfiltered, ip)
3734
} else if ip.Is6() && ipProto == settings.IP4 {
38-
if ipok(ip) && !ipok(sample) {
39-
sample = ip
40-
}
41-
continue
35+
unfiltered = append(unfiltered, ip)
36+
} else {
37+
filtered = append(filtered, ip)
4238
}
43-
filtered = append(filtered, ip)
4439
}
45-
if ipok(sample) {
40+
if len(filtered) <= 0 {
41+
// if all ips are filtered out, fail open and return unfiltered
42+
return unfiltered
43+
}
44+
if len(unfiltered) > 0 {
4645
// sample one unfiltered ip in an ironic case that it works
4746
// but the filtered out ones don't. this can happen in scenarios
4847
// where tunnel's ipProto is IP4 but the underlying network is IP6:
4948
// that is, IP6 is filtered out even though it might have worked.
50-
filtered = append(filtered, sample)
49+
filtered = append(filtered, unfiltered[0])
5150
}
5251
return filtered
5352
}
@@ -169,12 +168,12 @@ func commondial(d *protect.RDial, network, addr string, connect connectFunc) (ne
169168
}
170169

171170
ipset := ips.Addrs()
172-
allips := filter(ipset, confirmed)
171+
allips := maybeFilter(ipset, confirmed)
173172
if len(allips) <= 0 {
174173
var ok bool
175174
if ips, ok = renew(domain, ips); ok {
176175
ipset = ips.Addrs()
177-
allips = filter(ipset, confirmed)
176+
allips = maybeFilter(ipset, confirmed)
178177
}
179178
log.D("rdial: renew ips for %s; ok? %t", addr, ok)
180179
}

intra/dialers/tlsdial.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ func tlsdial(d *tls.Dialer, network, addr string, connect tlsConnectFunc) (net.C
7878
}
7979

8080
ipset := ips.Addrs()
81-
allips := filter(ipset, confirmed)
81+
allips := maybeFilter(ipset, confirmed)
8282
if len(allips) <= 0 {
8383
var ok bool
8484
if ips, ok = renew(domain, ips); ok {
8585
ipset = ips.Addrs()
86-
allips = filter(ipset, confirmed)
86+
allips = maybeFilter(ipset, confirmed)
8787
}
8888
log.D("tlsdial: renew ips for %s; ok? %t", addr, ok)
8989
}

0 commit comments

Comments
 (0)