python实现的防DDoS脚本


Posted in Python onFebruary 08, 2011

这篇博可以说连开场白都可以省掉了,之所以被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 < time.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的地方以后,似乎天下太平了(吗?)
python实现的防DDoS脚本
Python 相关文章推荐
Python描述器descriptor详解
Feb 03 Python
Python中的__SLOTS__属性使用示例
Feb 18 Python
Python实现栈的方法
May 26 Python
Python 多核并行计算的示例代码
Nov 07 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
Oct 11 Python
python看某个模块的版本方法
Oct 16 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
Python reques接口测试框架实现代码
Jul 28 Python
python之pygame模块实现飞机大战完整代码
Nov 29 Python
python爬取微博评论的实例讲解
Jan 15 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
Python牛刀小试密码爆破
Feb 03 #Python
初学python数组的处理代码
Jan 04 #Python
让python json encode datetime类型
Dec 28 #Python
让python的Cookie.py模块支持冒号做key的方法
Dec 28 #Python
python封装对象实现时间效果
Apr 23 #Python
python下函数参数的传递(参数带星号的说明)
Sep 19 #Python
Python 元类使用说明
Dec 18 #Python
You might like
PHP写日志的实现方法
2014/11/05 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
vue实现顶部菜单栏
2020/11/08 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python批量创建迅雷任务及创建多个文件
2016/02/13 Python
Python语言描述随机梯度下降法
2018/01/04 Python
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
python3下pygame如何实现显示中文
2020/01/11 Python
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
90后毕业生的求职信范文
2013/09/21 职场文书
软件工程专业推荐信
2013/10/28 职场文书
安全生产年活动总结
2014/08/29 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
本溪水洞导游词
2015/02/11 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis