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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
使用python实现BLAST
Feb 12 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
python实现在cmd窗口显示彩色文字
Jun 24 Python
python脚本开机自启的实现方法
Jun 28 Python
python线程的几种创建方式详解
Aug 29 Python
Python FtpLib模块应用操作详解
Dec 12 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
python微信公众号开发简单流程实现
Mar 09 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批量更改数据库表前缀实现方法
2013/10/26 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
php实现zip文件解压操作
2015/11/03 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
Ajax,UTF-8还是GB2312 eval 还是execScript
2008/11/13 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
jQuery 操作input中radio的技巧
2016/07/18 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
Python获取当前时间的方法
2014/01/14 Python
初学Python函数的笔记整理
2015/04/07 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
Python实现网站表单提交和模板
2019/01/15 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
高级技校毕业生自荐信
2013/11/18 职场文书
汽车专业学生自我评价
2014/01/19 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
小学元宵节活动总结
2015/02/06 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
python实现简单的聊天小程序
2021/07/07 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python