TRYTIME = 8#s TRYNUMB = 10#x DROPTIME = 60#s import os import re import signal import subprocess import sys import time os.system("iptables -F INPUT") p = subprocess.Popen(["tail", "-n", "0", "-f", sys.argv[1]], stdout=subprocess.PIPE) h = {} def chek(i, t): s = int(time.time()) d = pow(2, i[2] - 1) if (i[3] > 1): return 2 if ((i[1] > 0) and (i[2] > 0) and (i[3] > 0) and ((s - i[0]) >= (t * d))): return 1 return 0 while (1): q = os.fork() if (q == 0): while (1): s = int(time.time()) for a in h.keys(): if (chek(h[a], DROPTIME) == 1): c = ("iptables -D INPUT -s '%s' -j DROP > /dev/null 2>&1 ; #for %ds" % (a, DROPTIME * pow(2, h[a][2] - 1))) print("del",s,c) os.system(c) del h[a] time.sleep(1) sys.exit(0) else: s = int(time.time()) for a in h.keys(): if (chek(h[a], DROPTIME) == 1): h[a][3] = 2 h[a][0] = s print("~",s,a,h[a]) if (h[a][3] != 1): if ((s - h[a][0]) > TRYTIME): h[a][1] = max(0, h[a][1] - int((s - h[a][0]) / TRYTIME)) h[a][0] = s if (h[a][1] < 1): print("x",s,a,h[a]) del h[a] l = p.stdout.readline().strip() r = re.match("^.*sshd.*fail.*[^0-9]([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*$", l, re.I) if (r): a = str(r.group(1)) s = int(time.time()) if (not a in h.keys()): h[a] = [s, 0, 0, 0];#address-string->[last-time,try-number,block-number,state-flag] if ((s - h[a][0]) <= TRYTIME): h[a][1] += 1 print("+",s,a,h[a]) if ((s - h[a][0]) > TRYTIME): h[a][1] = max(1, h[a][1] - int((s - h[a][0]) / TRYTIME)) print("-",s,a,h[a]) if (h[a][1] >= TRYNUMB): h[a][1] = (int(TRYNUMB / 2) + 1) h[a][2] += 1 h[a][3] = 1 c = ("iptables -A INPUT -s '%s' -j DROP ; #for %ds" % (a, DROPTIME * pow(2, h[a][2] - 1))) print("add",s,c) os.system(c) h[a][0] = s try: os.kill(q, signal.SIGKILL) except: pass try: os.waitpid(q, 0) except: pass
python sshipt.py /var/log/auth.log
('+', 1412665540, '1.93.29.79', [1412665540, 1, 0, 0]) ('+', 1412665542, '1.93.29.79', [1412665540, 2, 0, 0]) ('+', 1412665544, '1.93.29.79', [1412665542, 3, 0, 0]) ('+', 1412665545, '1.93.29.79', [1412665544, 4, 0, 0]) ('+', 1412665546, '1.93.29.79', [1412665545, 5, 0, 0]) ('+', 1412665547, '1.93.29.79', [1412665546, 6, 0, 0]) ('+', 1412665548, '1.93.29.79', [1412665547, 7, 0, 0]) ('+', 1412665549, '1.93.29.79', [1412665548, 8, 0, 0]) ('+', 1412665551, '1.93.29.79', [1412665549, 9, 0, 0]) ('+', 1412665552, '1.93.29.79', [1412665551, 10, 0, 0]) ('add', 1412665552, "iptables -A INPUT -s '1.93.29.79' -j DROP ; #for 60s")