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 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
简单的Python的curses库使用教程
Apr 11 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
django2 快速安装指南分享
Jan 05 Python
Python温度转换实例分析
Jan 17 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
python实现简单的聊天小程序
Jul 07 Python
基于Python编写一个监控CPU的应用系统
Jun 25 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
如何正确配置Nginx + PHP
2016/07/15 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
Bootstrap 布局组件(全)
2016/07/18 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
Python中的yield浅析
2014/06/16 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
python字符串的方法与操作大全
2018/01/30 Python
Django中Model的使用方法教程
2018/03/07 Python
python使用PyQt5的简单方法
2019/02/27 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
详解python statistics模块及函数用法
2019/10/27 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
python实现canny边缘检测
2020/09/14 Python
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
医院总经理岗位职责
2014/02/04 职场文书
水利水电专业自荐信
2014/07/08 职场文书
热情服务标语
2014/10/07 职场文书
工作简报怎么写
2015/07/21 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript