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去除列表中重复元素的方法
Mar 20 Python
python黑魔法之参数传递
Feb 12 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
pandas进行时间数据的转换和计算时间差并提取年月日
Jul 06 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python中的 zip函数详解及用法举例
Feb 16 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
Python魔术方法专题
Jun 19 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
django注册用邮箱发送验证码的实现
Apr 18 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
SONY SRF-40W电路分析
2021/03/02 无线电
简单的PHP多图上传小程序代码
2011/07/17 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
EasyUI的doCellTip实现鼠标放到单元格上提示单元格内容
2016/08/24 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
jQuery事件blur()方法的使用实例讲解
2019/03/30 jQuery
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
Python的一些用法分享
2012/10/07 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
点球小游戏python脚本
2018/05/22 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
详解Python 函数如何重载?
2019/04/23 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
工作失职检讨书范文
2014/01/16 职场文书
财务人员担保书
2014/05/13 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Spring中的@Transactional的工作原理
2022/06/05 Java/Android