您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

python实现的防DDoS脚本

2024/11/10 9:06:57发布38次查看
这篇博可以说连开场白都可以省掉了,之所以被ddos,并不是因为惹了疯狗被追着咬,而是因为vc悲剧之后流量全到simplecd来了。
不仅如此,一些笨蛋们在抓站,一些笨蛋们在用迅雷下载,100mbps的端口居然已经满负荷运作十几个小时了,这是什么概念?100mbps满负荷1天,流量就是1000g,这样下去不用多久,我就可以等着上百刀的罚单了,泪飙。
此外,100mbps的速度使得硬盘都快转不动了,严重拖累网站的响应速度,卡得我欲仙欲死啊真是。想当年vc挂了一天,被抓站的家伙们搞得一个礼拜半残废状态(其中那些家伙包括我在内,汗)。simplecd就更支撑不了了。
事实上这种人肉ddos比正常的ddos更加难以区分和预防,不过也就只能尽人事,听天命了,参考一些文章写了个python的防止ddos的脚本,加入cron每分钟执行即可。
实现原理是,查询netstat的连接数,同ip超过一定连接的用iptables封禁一定时间,自动封禁,自动解封。
代码如下:
from subprocess import popen,pipe
import re
import time
import sqlite3
concurrency_allowed = 30
outdate_time = 86400
# initializing database
db = sqlite3.connect(/tmp/ddos.db3)
c = db.cursor()
try:
c.execute(create table ddos (ip text unique,date integer);)
except:
print database exists
# blocking ips has more than concurrency_allowed connections
pipe = popen(netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n > /tmp/ddos.txt,shell=true,bufsize=1024,stdout=pipe).stdout
#ddos = pipe.read()
ddos = open(/tmp/ddos.txt).read()
ct = re.compile(r(\s+)\s+(\s+).*\n).findall(ddos)
for count,ip in ct:
if int(count)>concurrency_allowed and (ip != 127.0.0.1) and (not ip.startswith(192.168)):
out = popen(iptables -i input -s %s -j drop%ip,shell=true,bufsize=1024,stdout=pipe).stdout
print blocking %s for %s visits % (ip,count)
c.execute('replace into ddos values (?,?)',(ip,int(time.time())))
time.sleep(0.1)
db.commit()
# unblocking outdated blockings
c.execute(select * from ddos)
ddos = c.fetchall()
for ip,date in ddos:
if date + outdate_time c.execute(delete from ddos where ip=?,(ip,))
print unblocking %s % ip
out = popen(iptables -d input -s %s -j drop%ip,shell=true,bufsize=1024,stdout=pipe).stdout
time.sleep(0.1)
db.commit()
目前来说这个脚本的效果是0,封了500多号人了,但是还是满速,真是可怕。
24日 更新:
同时用这个脚本,外加转移桌面版的站点到一个10m unlimited的地方以后,似乎天下太平了(吗?)
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product