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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python格式化css文件的方法
Mar 10 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
python中reader的next用法
Jul 24 Python
python实现简单加密解密机制
Mar 19 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
python3在同一行内输入n个数并用列表保存的例子
Jul 20 Python
django admin后管定制-显示字段的实例
Mar 11 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
用python制作个音乐下载器
Jan 30 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的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
smarty模板数学运算示例
2016/12/11 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python3的pip路径在哪
2020/06/23 Python
如何在pycharm中安装第三方包
2020/10/27 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
中层干部竞聘演讲稿
2014/05/15 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
检讨书模板大全
2015/05/07 职场文书
三八妇女节主持词
2015/07/04 职场文书
小学班主任研修日志
2015/11/13 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python