Login requests too fast - protection for proxy

api
Simon 3 years ago
parent 1be27fb828
commit 797226a6c1

@ -81,7 +81,7 @@ class privHelper():
class Proxy(DatagramProtocol): class Proxy(DatagramProtocol):
def __init__(self,Master,ListenPort,connTrack,peerTrack,blackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd,privHelper): def __init__(self,Master,ListenPort,connTrack,peerTrack,blackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd,privHelper,rptlTrack):
self.master = Master self.master = Master
self.ListenPort = ListenPort self.ListenPort = ListenPort
self.connTrack = connTrack self.connTrack = connTrack
@ -95,9 +95,9 @@ class Proxy(DatagramProtocol):
self.destPortEnd = DestPortEnd self.destPortEnd = DestPortEnd
self.numPorts = DestPortEnd - DestportStart self.numPorts = DestPortEnd - DestportStart
self.privHelper = privHelper self.privHelper = privHelper
self.rptlTrack = rptlTrack
def reaper(self,_peer_id): def reaper(self,_peer_id):
if self.debug: if self.debug:
print("dead",_peer_id) print("dead",_peer_id)
@ -204,6 +204,24 @@ class Proxy(DatagramProtocol):
_peer_id = data[4:8] _peer_id = data[4:8]
elif _command == RPTL: # RPTLogin -- a repeater wants to login elif _command == RPTL: # RPTLogin -- a repeater wants to login
_peer_id = data[4:8] _peer_id = data[4:8]
#if we have seen more than 20 RPTL packets from this IP since the RPTL tracking table was reset (every 60 secs)
#blacklist IP for 10 minutes
if host not in self.rptlTrack:
self.rptlTrack[host] = 1
else:
self.rptlTrack[host] += 1
if self.rptlTrack[host] > 20:
self.IPBlackList[host] = (nowtime + 600)
if self.clientinfo:
print('Add to blacklist: host {}. Expire time {}'.format(self.peerTrack[_peer_id]['shost'],_bltime))
if self.privHelper:
print('Ask priv_helper to add to iptables: host {}, port {}.'.format(self.peerTrack[_peer_id]['shost'],self.ListenPort))
reactor.callInThread(self.privHelper.addBL,self.ListenPort,self.peerTrack[_peer_id]['shost'])
return
elif _command == RPTK: # Repeater has answered our login challenge elif _command == RPTK: # Repeater has answered our login challenge
_peer_id = data[4:8] _peer_id = data[4:8]
elif _command == RPTC: # Repeater is sending it's configuraiton OR disconnecting elif _command == RPTC: # Repeater is sending it's configuraiton OR disconnecting
@ -328,6 +346,7 @@ if __name__ == '__main__':
CONNTRACK = {} CONNTRACK = {}
PEERTRACK = {} PEERTRACK = {}
RPTLTRACK = {}
PRIV_HELPER = None PRIV_HELPER = None
# Set up the signal handler # Set up the signal handler
@ -371,7 +390,7 @@ if __name__ == '__main__':
if ListenIP == '::' and IsIPv4Address(Master): if ListenIP == '::' and IsIPv4Address(Master):
Master = '::ffff:' + Master Master = '::ffff:' + Master
reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,PEERTRACK,BlackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd,PRIV_HELPER),interface=ListenIP) reactor.listenUDP(ListenPort,Proxy(Master,ListenPort,CONNTRACK,PEERTRACK,BlackList,IPBlackList,Timeout,Debug,ClientInfo,DestportStart,DestPortEnd,PRIV_HELPER, RPTLTRACK),interface=ListenIP)
def loopingErrHandle(failure): def loopingErrHandle(failure):
print('(GLOBAL) STOPPING REACTOR TO AVOID MEMORY LEAK: Unhandled error innowtimed loop.\n {}'.format(failure)) print('(GLOBAL) STOPPING REACTOR TO AVOID MEMORY LEAK: Unhandled error innowtimed loop.\n {}'.format(failure))
@ -405,6 +424,9 @@ if __name__ == '__main__':
print('Ask priv helper to remove blacklist entry for {} from iptables'.format(delete)) print('Ask priv helper to remove blacklist entry for {} from iptables'.format(delete))
reactor.callInThread(PRIV_HELPER.delBL,ListenPort,delete) reactor.callInThread(PRIV_HELPER.delBL,ListenPort,delete)
def rptlTrimmer():
RPTLTRACK = {}
if Stats == True: if Stats == True:
stats_task = task.LoopingCall(stats) stats_task = task.LoopingCall(stats)
@ -414,6 +436,12 @@ if __name__ == '__main__':
blacklist_task = task.LoopingCall(blackListTrimmer) blacklist_task = task.LoopingCall(blackListTrimmer)
blacklista = blacklist_task.start(15) blacklista = blacklist_task.start(15)
blacklista.addErrback(loopingErrHandle) blacklista.addErrback(loopingErrHandle)
rptlTrimmer_task = task.LoopingCall(rptlTrimmer)
rptlTrimmera = rptlTrimmer_task.start(60)
rptlTrimmera.addErrback(loopingErrHandle)
reactor.run() reactor.run()

Loading…
Cancel
Save

Powered by TurnKey Linux.