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中pop和remove的使用方法
Jan 09 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
numpy.where() 用法详解
May 27 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python之mock模块基本使用方法详解
Jun 27 Python
pyftplib中文乱码问题解决方案
Jan 11 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python中numpy.empty()函数实例讲解
Feb 05 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 xml留言板 xml存储数据的简单例子
2009/08/24 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
Chrome Web App开发小结
2014/09/04 PHP
php实现随机生成易于记忆的密码
2015/06/19 PHP
php接口技术实例详解
2016/12/07 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
浅析PHP开发规范
2018/02/05 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
js编写选项卡效果
2017/05/23 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
js简单的分页器插件代码实例
2019/09/11 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python机器学习之决策树分类详解
2017/12/20 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
numpy.array 操作使用简单总结
2019/11/08 Python
基于Python实现扑克牌面试题
2019/12/11 Python
浅析Python中字符串的intern机制
2020/10/03 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
建筑系毕业生自我鉴定
2014/01/24 职场文书
教师对学生的寄语
2014/04/03 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL