58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package p2p
|
|
|
|
import (
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/libp2p/go-libp2p/core/network"
|
|
)
|
|
|
|
const (
|
|
MaxConnsPerIP = 5
|
|
MinReconnectGap = 10 * time.Second
|
|
)
|
|
|
|
var (
|
|
ipConnCount = make(map[string]int)
|
|
peerLastSeen = make(map[string]time.Time)
|
|
limiterMu sync.Mutex
|
|
)
|
|
|
|
// LimitConnections implementa proteção básica anti-DDoS/Sybil
|
|
func LimitConnections(conn network.Conn) error {
|
|
limiterMu.Lock()
|
|
defer limiterMu.Unlock()
|
|
|
|
ip, _, err := net.SplitHostPort(conn.RemoteMultiaddr().String())
|
|
if err != nil {
|
|
return nil // fallback: não bloqueia
|
|
}
|
|
|
|
ipConnCount[ip]++
|
|
if ipConnCount[ip] > MaxConnsPerIP {
|
|
return network.ErrReset
|
|
}
|
|
|
|
peerID := conn.RemotePeer().String()
|
|
last := peerLastSeen[peerID]
|
|
if time.Since(last) < MinReconnectGap {
|
|
return network.ErrReset
|
|
}
|
|
peerLastSeen[peerID] = time.Now()
|
|
|
|
return nil
|
|
}
|
|
|
|
// ClearConnection cleanup quando o peer desconecta
|
|
func ClearConnection(conn network.Conn) {
|
|
limiterMu.Lock()
|
|
defer limiterMu.Unlock()
|
|
ip, _, err := net.SplitHostPort(conn.RemoteMultiaddr().String())
|
|
if err == nil {
|
|
ipConnCount[ip]--
|
|
if ipConnCount[ip] <= 0 {
|
|
delete(ipConnCount, ip)
|
|
}
|
|
}
|
|
} |