mirror of
https://github.com/slackhq/nebula.git
synced 2026-11-15 01:26:52 +01:00
Apply remote_allow_list before capping addrs at MaxRemotes (#1985)
smoke-extra / freebsd-amd64 (push) Failing after 16s
smoke-extra / linux-amd64-ipv6disable (push) Failing after 17s
smoke-extra / netbsd-amd64 (push) Failing after 17s
smoke-extra / openbsd-amd64 (push) Failing after 17s
smoke-extra / linux-386 (push) Failing after 18s
smoke / Run multi node smoke test (push) Failing after 1m43s
Build and test / Static checks (push) Successful in 48s
Build and test / Test linux (push) Failing after 1m28s
Build and test / Test linux-pkcs11 (push) Failing after 2m18s
Build and test / Test linux-boringcrypto (push) Failing after 2m59s
Build and test / Test linux-fips140 (push) Failing after 3m3s
Build and test / Cross-build linux-arm (push) Successful in 3m9s
Build and test / Cross-build linux-mips (push) Successful in 3m56s
Build and test / Cross-build linux-other (push) Successful in 3m15s
Build and test / Cross-build windows (push) Successful in 1m5s
Build and test / Cross-build freebsd (push) Successful in 1m36s
Build and test / Cross-build netbsd (push) Successful in 1m34s
Build and test / Cross-build openbsd (push) Successful in 1m33s
Build and test / Cross-build mobile (push) Successful in 3m34s
smoke / Run self traffic smoke test on macOS (push) Canceled after 0s
smoke-extra / Run windows smoke test (push) Canceled after 0s
Build and test / Test macos (push) Canceled after 0s
Build and test / Test windows (push) Canceled after 0s
Build and test / CI status (push) Canceled after 0s
smoke-extra / freebsd-amd64 (push) Failing after 16s
smoke-extra / linux-amd64-ipv6disable (push) Failing after 17s
smoke-extra / netbsd-amd64 (push) Failing after 17s
smoke-extra / openbsd-amd64 (push) Failing after 17s
smoke-extra / linux-386 (push) Failing after 18s
smoke / Run multi node smoke test (push) Failing after 1m43s
Build and test / Static checks (push) Successful in 48s
Build and test / Test linux (push) Failing after 1m28s
Build and test / Test linux-pkcs11 (push) Failing after 2m18s
Build and test / Test linux-boringcrypto (push) Failing after 2m59s
Build and test / Test linux-fips140 (push) Failing after 3m3s
Build and test / Cross-build linux-arm (push) Successful in 3m9s
Build and test / Cross-build linux-mips (push) Successful in 3m56s
Build and test / Cross-build linux-other (push) Successful in 3m15s
Build and test / Cross-build windows (push) Successful in 1m5s
Build and test / Cross-build freebsd (push) Successful in 1m36s
Build and test / Cross-build netbsd (push) Successful in 1m34s
Build and test / Cross-build openbsd (push) Successful in 1m33s
Build and test / Cross-build mobile (push) Successful in 3m34s
smoke / Run self traffic smoke test on macOS (push) Canceled after 0s
smoke-extra / Run windows smoke test (push) Canceled after 0s
Build and test / Test macos (push) Canceled after 0s
Build and test / Test windows (push) Canceled after 0s
Build and test / CI status (push) Canceled after 0s
unlockedSetV4/V6 truncated the reported list to MaxRemotes and only then ran the allow list check. A host reporting more than MaxRemotes addrs (docker bridges, temporary v6 addrs, etc) could have every allowed addr discarded if the denied ones sorted first. Filter the full list and stop once MaxRemotes allowed addrs are collected. This affects lighthouses processing HostUpdateNotification and clients processing HostQueryReply.
This commit is contained in:
1 parent
48ba879198
commit
9a5bdb508e
2 files changed
+48
-4
No files matched your search
+12
-4
@@ -460,10 +460,14 @@ func (r *RemoteList) unlockedSetV4(ownerVpnIp, vpnIp netip.Addr, to []*V4AddrPor
|
||||
// Reset the slice
|
||||
c.reported = c.reported[:0]
|
||||
|
||||
// We can't take their array but we can take their pointers
|
||||
for _, v := range to[:minInt(len(to), MaxRemotes)] {
|
||||
// We can't take their array but we can take their pointers.
|
||||
// Filter before capping so denied addrs do not crowd out allowed ones reported later in the list.
|
||||
for _, v := range to {
|
||||
if check(vpnIp, v) {
|
||||
c.reported = append(c.reported, v)
|
||||
if len(c.reported) == MaxRemotes {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -508,10 +512,14 @@ func (r *RemoteList) unlockedSetV6(ownerVpnIp, vpnIp netip.Addr, to []*V6AddrPor
|
||||
// Reset the slice
|
||||
c.reported = c.reported[:0]
|
||||
|
||||
// We can't take their array but we can take their pointers
|
||||
for _, v := range to[:minInt(len(to), MaxRemotes)] {
|
||||
// We can't take their array but we can take their pointers.
|
||||
// Filter before capping so denied addrs do not crowd out allowed ones reported later in the list.
|
||||
for _, v := range to {
|
||||
if check(vpnIp, v) {
|
||||
c.reported = append(c.reported, v)
|
||||
if len(c.reported) == MaxRemotes {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package nebula
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"net/netip"
|
||||
"testing"
|
||||
|
||||
@@ -346,3 +347,38 @@ func newIp6AndPortFromString(s string) *V6AddrPort {
|
||||
Port: uint32(a.Port()),
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoteList_SetFiltersBeforeCap(t *testing.T) {
|
||||
owner := netip.MustParseAddr("0.0.0.0")
|
||||
rl := NewRemoteList([]netip.Addr{owner}, nil)
|
||||
|
||||
// MaxRemotes denied addrs first, then the only allowed one, then enough allowed to exceed the cap
|
||||
var v4 []*V4AddrPort
|
||||
for i := 0; i < MaxRemotes; i++ {
|
||||
v4 = append(v4, newIp4AndPortFromString(fmt.Sprintf("172.17.0.%d:4242", i+1)))
|
||||
}
|
||||
for i := 0; i < MaxRemotes+1; i++ {
|
||||
v4 = append(v4, newIp4AndPortFromString(fmt.Sprintf("70.199.182.%d:4242", i+1)))
|
||||
}
|
||||
rl.unlockedSetV4(owner, owner, v4, func(_ netip.Addr, a *V4AddrPort) bool {
|
||||
return protoV4AddrPortToNetAddrPort(a).Addr().As4()[0] != 172
|
||||
})
|
||||
|
||||
var v6 []*V6AddrPort
|
||||
for i := 0; i < MaxRemotes; i++ {
|
||||
v6 = append(v6, newIp6AndPortFromString(fmt.Sprintf("[fd00::%d]:4242", i+1)))
|
||||
}
|
||||
for i := 0; i < MaxRemotes+1; i++ {
|
||||
v6 = append(v6, newIp6AndPortFromString(fmt.Sprintf("[2001:db8::%d]:4242", i+1)))
|
||||
}
|
||||
rl.unlockedSetV6(owner, owner, v6, func(_ netip.Addr, a *V6AddrPort) bool {
|
||||
return protoV6AddrPortToNetAddrPort(a).Addr().As16()[0] != 0xfd
|
||||
})
|
||||
|
||||
rl.Rebuild([]netip.Prefix{})
|
||||
assert.Len(t, rl.addrs, MaxRemotes*2)
|
||||
for _, a := range rl.addrs {
|
||||
assert.NotEqual(t, byte(172), a.Addr().As16()[12], "denied v4 addr %v was kept", a)
|
||||
assert.NotEqual(t, byte(0xfd), a.Addr().As16()[0], "denied v6 addr %v was kept", a)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user