unsuccessfulDials = expvar.NewInt("unsuccessfulDials")
successfulDials = expvar.NewInt("successfulDials")
acceptedConns = expvar.NewInt("acceptedConns")
+ inboundConnsBlocked = expvar.NewInt("inboundConnsBlocked")
)
const (
me.mu.Lock()
defer me.mu.Unlock()
me.ipBlockList = list
+ if me.dHT != nil {
+ me.dHT.SetIPBlockList(list)
+ }
}
func (me *Client) PeerID() string {
me.mu.Unlock()
}
-func (cl *Client) ipBlocked(ip net.IP) bool {
+func (cl *Client) ipBlockRange(ip net.IP) (r *iplist.Range) {
if cl.ipBlockList == nil {
- return false
- }
- if r := cl.ipBlockList.Lookup(ip); r != nil {
- log.Printf("IP blocked: %s in range %s-%s: %s", ip, r.First, r.Last, r.Description)
- return true
+ return
}
- return false
+ r = cl.ipBlockList.Lookup(ip)
+ return
}
func (cl *Client) acceptConnections(l net.Listener, utp bool) {
}
acceptedConns.Add(1)
cl.mu.RLock()
- blocked := cl.ipBlocked(AddrIP(conn.RemoteAddr()))
+ blockRange := cl.ipBlockRange(AddrIP(conn.RemoteAddr()))
cl.mu.RUnlock()
- if blocked {
+ if blockRange != nil {
+ inboundConnsBlocked.Add(1)
+ log.Printf("inbound connection from %s blocked by %s", conn.RemoteAddr(), blockRange)
continue
}
go func() {
duplicateConnsAvoided.Add(1)
return
}
- if me.ipBlocked(peer.IP) {
+ if r := me.ipBlockRange(peer.IP); r != nil {
+ log.Printf("outbound connect to %s blocked by IP blocklist rule %s", peer.IP, r)
return
}
dialTimeout := reducedDialTimeout(nominalDialTimeout, me.halfOpenLimit, len(t.Peers))
if t == nil {
return errors.New("no such torrent")
}
+ blocked := 0
+ for i, p := range peers {
+ if me.ipBlockRange(p.IP) == nil {
+ continue
+ }
+ peers[i] = peers[len(peers)-1]
+ peers = peers[:len(peers)-1]
+ i--
+ blocked++
+ }
+ if blocked != 0 {
+ log.Printf("IP blocklist screened %d peers from being added", blocked)
+ }
t.AddPeers(peers)
me.openNewConns(t)
return nil