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使用urllib2提交http post请求的方法
May 26 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
解析Python编程中的包结构
Oct 25 Python
深入解析Python中的urllib2模块
Nov 13 Python
详解Python中的变量及其命名和打印
Mar 11 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
django中send_mail功能实现详解
Feb 06 Python
解决Python一行输出不显示的问题
Dec 03 Python
python实现剪切功能
Jan 23 Python
Python流程控制常用工具详解
Feb 24 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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 fsockopen写的HTTP下载的类
2007/02/22 PHP
php在线生成ico文件的代码
2007/10/09 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
深入探讨前端框架react
2015/12/09 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python3实现转换Image图片格式
2018/06/21 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
大学生简单自荐信
2013/11/10 职场文书
物业电工岗位职责
2013/11/20 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
关于安全的标语
2014/06/10 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
公司员工辞职信范文
2015/05/12 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL