mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-20 20:39:08 +02:00
[management] less strict metaHash when blocking peers (#6531)
This commit is contained in:
@@ -11,7 +11,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
reconnThreshold = 5 * time.Minute
|
reconnThreshold = 5 * time.Minute
|
||||||
baseBlockDuration = 10 * time.Minute // Duration for which a peer is banned after exceeding the reconnection limit
|
baseBlockDuration = 30 * time.Minute // Duration for which a peer is banned after exceeding the reconnection limit
|
||||||
reconnLimitForBan = 30 // Number of reconnections within the reconnTreshold that triggers a ban
|
reconnLimitForBan = 30 // Number of reconnections within the reconnTreshold that triggers a ban
|
||||||
metaChangeLimit = 3 // Number of reconnections with different metadata that triggers a ban of one peer
|
metaChangeLimit = 3 // Number of reconnections with different metadata that triggers a ban of one peer
|
||||||
)
|
)
|
||||||
@@ -139,22 +139,13 @@ func (l *loginFilter) addLogin(wgPubKey string, metaHash uint64) {
|
|||||||
state.lastSeen = now
|
state.lastSeen = now
|
||||||
}
|
}
|
||||||
|
|
||||||
func metaHash(meta nbpeer.PeerSystemMeta, pubip string) uint64 {
|
func metaHash(meta nbpeer.PeerSystemMeta) uint64 {
|
||||||
h := fnv.New64a()
|
h := fnv.New64a()
|
||||||
|
|
||||||
h.Write([]byte(meta.WtVersion))
|
|
||||||
h.Write([]byte(meta.OSVersion))
|
h.Write([]byte(meta.OSVersion))
|
||||||
h.Write([]byte(meta.KernelVersion))
|
h.Write([]byte(meta.KernelVersion))
|
||||||
h.Write([]byte(meta.Hostname))
|
h.Write([]byte(meta.Hostname))
|
||||||
h.Write([]byte(meta.SystemSerialNumber))
|
h.Write([]byte(meta.SystemSerialNumber))
|
||||||
h.Write([]byte(pubip))
|
|
||||||
|
|
||||||
macs := uint64(0)
|
return h.Sum64()
|
||||||
for _, na := range meta.NetworkAddresses {
|
|
||||||
for _, r := range na.Mac {
|
|
||||||
macs += uint64(r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return h.Sum64() + macs
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,9 +164,7 @@ func BenchmarkHashingMethods(b *testing.B) {
|
|||||||
KernelVersion: "5.15.0-76-generic",
|
KernelVersion: "5.15.0-76-generic",
|
||||||
Hostname: "prod-server-database-01",
|
Hostname: "prod-server-database-01",
|
||||||
SystemSerialNumber: "PC-1234567890",
|
SystemSerialNumber: "PC-1234567890",
|
||||||
NetworkAddresses: []nbpeer.NetworkAddress{{Mac: "00:1B:44:11:3A:B7"}, {Mac: "00:1B:44:11:3A:B8"}},
|
|
||||||
}
|
}
|
||||||
pubip := "8.8.8.8"
|
|
||||||
|
|
||||||
var resultString string
|
var resultString string
|
||||||
var resultUint uint64
|
var resultUint uint64
|
||||||
@@ -175,7 +173,7 @@ func BenchmarkHashingMethods(b *testing.B) {
|
|||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
resultString = builderString(meta, pubip)
|
resultString = builderString(meta)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -183,7 +181,7 @@ func BenchmarkHashingMethods(b *testing.B) {
|
|||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
resultString = fnvHashToString(meta, pubip)
|
resultString = fnvHashToString(meta)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -191,7 +189,7 @@ func BenchmarkHashingMethods(b *testing.B) {
|
|||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
resultUint = metaHash(meta, pubip)
|
resultUint = metaHash(meta)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -199,29 +197,20 @@ func BenchmarkHashingMethods(b *testing.B) {
|
|||||||
_ = resultUint
|
_ = resultUint
|
||||||
}
|
}
|
||||||
|
|
||||||
func fnvHashToString(meta nbpeer.PeerSystemMeta, pubip string) string {
|
func fnvHashToString(meta nbpeer.PeerSystemMeta) string {
|
||||||
h := fnv.New64a()
|
h := fnv.New64a()
|
||||||
|
|
||||||
if len(meta.NetworkAddresses) != 0 {
|
|
||||||
for _, na := range meta.NetworkAddresses {
|
|
||||||
h.Write([]byte(na.Mac))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h.Write([]byte(meta.WtVersion))
|
h.Write([]byte(meta.WtVersion))
|
||||||
h.Write([]byte(meta.OSVersion))
|
h.Write([]byte(meta.OSVersion))
|
||||||
h.Write([]byte(meta.KernelVersion))
|
h.Write([]byte(meta.KernelVersion))
|
||||||
h.Write([]byte(meta.Hostname))
|
h.Write([]byte(meta.Hostname))
|
||||||
h.Write([]byte(meta.SystemSerialNumber))
|
h.Write([]byte(meta.SystemSerialNumber))
|
||||||
h.Write([]byte(pubip))
|
|
||||||
|
|
||||||
return strconv.FormatUint(h.Sum64(), 16)
|
return strconv.FormatUint(h.Sum64(), 16)
|
||||||
}
|
}
|
||||||
|
|
||||||
func builderString(meta nbpeer.PeerSystemMeta, pubip string) string {
|
func builderString(meta nbpeer.PeerSystemMeta) string {
|
||||||
mac := getMacAddress(meta.NetworkAddresses)
|
estimatedSize := len(meta.WtVersion) + len(meta.OSVersion) + len(meta.KernelVersion) + len(meta.Hostname) + len(meta.SystemSerialNumber) + 4
|
||||||
estimatedSize := len(meta.WtVersion) + len(meta.OSVersion) + len(meta.KernelVersion) + len(meta.Hostname) + len(meta.SystemSerialNumber) +
|
|
||||||
len(pubip) + len(mac) + 6
|
|
||||||
|
|
||||||
var b strings.Builder
|
var b strings.Builder
|
||||||
b.Grow(estimatedSize)
|
b.Grow(estimatedSize)
|
||||||
@@ -235,23 +224,10 @@ func builderString(meta nbpeer.PeerSystemMeta, pubip string) string {
|
|||||||
b.WriteString(meta.Hostname)
|
b.WriteString(meta.Hostname)
|
||||||
b.WriteByte('|')
|
b.WriteByte('|')
|
||||||
b.WriteString(meta.SystemSerialNumber)
|
b.WriteString(meta.SystemSerialNumber)
|
||||||
b.WriteByte('|')
|
|
||||||
b.WriteString(pubip)
|
|
||||||
|
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMacAddress(nas []nbpeer.NetworkAddress) string {
|
|
||||||
if len(nas) == 0 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
macs := make([]string, 0, len(nas))
|
|
||||||
for _, na := range nas {
|
|
||||||
macs = append(macs, na.Mac)
|
|
||||||
}
|
|
||||||
return strings.Join(macs, "/")
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkLoginFilter_ParallelLoad(b *testing.B) {
|
func BenchmarkLoginFilter_ParallelLoad(b *testing.B) {
|
||||||
filter := newLoginFilterWithCfg(testAdvancedCfg())
|
filter := newLoginFilterWithCfg(testAdvancedCfg())
|
||||||
numKeys := 100000
|
numKeys := 100000
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ func (s *Server) Sync(req *proto.EncryptedMessage, srv proto.ManagementService_S
|
|||||||
return mapError(ctx, err)
|
return mapError(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
metahashed := metaHash(peerMeta, sRealIP)
|
metahashed := metaHash(peerMeta)
|
||||||
if userID == "" && !s.loginFilter.allowLogin(peerKey.String(), metahashed) {
|
if userID == "" && !s.loginFilter.allowLogin(peerKey.String(), metahashed) {
|
||||||
if s.appMetrics != nil {
|
if s.appMetrics != nil {
|
||||||
s.appMetrics.GRPCMetrics().CountSyncRequestBlocked()
|
s.appMetrics.GRPCMetrics().CountSyncRequestBlocked()
|
||||||
@@ -306,7 +306,7 @@ func (s *Server) Sync(req *proto.EncryptedMessage, srv proto.ManagementService_S
|
|||||||
log.WithContext(ctx).Tracef("peer system meta has to be provided on sync. Peer %s, remote addr %s", peerKey.String(), realIP)
|
log.WithContext(ctx).Tracef("peer system meta has to be provided on sync. Peer %s, remote addr %s", peerKey.String(), realIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
metahash := metaHash(peerMeta, realIP.String())
|
metahash := metaHash(peerMeta)
|
||||||
s.loginFilter.addLogin(peerKey.String(), metahash)
|
s.loginFilter.addLogin(peerKey.String(), metahash)
|
||||||
|
|
||||||
peer, netMap, postureChecks, dnsFwdPort, err := s.accountManager.SyncAndMarkPeer(ctx, accountID, peerKey.String(), peerMeta, realIP, syncStart)
|
peer, netMap, postureChecks, dnsFwdPort, err := s.accountManager.SyncAndMarkPeer(ctx, accountID, peerKey.String(), peerMeta, realIP, syncStart)
|
||||||
@@ -732,7 +732,7 @@ func (s *Server) Login(ctx context.Context, req *proto.EncryptedMessage) (*proto
|
|||||||
}
|
}
|
||||||
|
|
||||||
peerMeta := extractPeerMeta(ctx, loginReq.GetMeta())
|
peerMeta := extractPeerMeta(ctx, loginReq.GetMeta())
|
||||||
metahashed := metaHash(peerMeta, sRealIP)
|
metahashed := metaHash(peerMeta)
|
||||||
if !s.loginFilter.allowLogin(peerKey.String(), metahashed) {
|
if !s.loginFilter.allowLogin(peerKey.String(), metahashed) {
|
||||||
if s.logBlockedPeers {
|
if s.logBlockedPeers {
|
||||||
log.WithContext(ctx).Tracef("peer %s with meta hash %d is blocked from login", peerKey.String(), metahashed)
|
log.WithContext(ctx).Tracef("peer %s with meta hash %d is blocked from login", peerKey.String(), metahashed)
|
||||||
|
|||||||
Reference in New Issue
Block a user