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中字典的基本知识初步介绍
May 21 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
Python定时器实例代码
Nov 01 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
详解Python中的分组函数groupby和itertools)
Jul 11 Python
linux下python中文乱码解决方案详解
Aug 28 Python
python encrypt 实现AES加密的实例详解
Feb 20 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
python如何代码集体右移
Jul 20 Python
Pycharm导入anaconda环境的教程图解
Jul 31 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自定义函数返回多个值
2006/11/26 PHP
php实现简单文件下载的方法
2015/01/30 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
Maps Javascript
2007/01/22 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
vue组件实例解析
2017/01/10 Javascript
那些精彩的JavaScript代码片段
2017/01/12 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
vant实现购物车功能
2020/06/29 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python实现黑客字幕雨效果
2018/06/21 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python爬虫基础知识点整理
2020/06/02 Python
Python实现一个优先级队列的方法
2020/07/31 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
市场营销调查计划书
2014/05/02 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
领导干部学习心得体会
2016/01/23 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
新手入门Mysql--概念
2021/06/18 MySQL
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python