python實現(xiàn)的防DDoS腳本
這篇博可以說連開場白都可以省掉了,之所以被DDoS,并不是因為惹了瘋狗被追著咬,而是因為VC悲劇之后流量全到simplecd來了。
不僅如此,一些笨蛋們在抓站,一些笨蛋們在用迅雷下載,100Mbps的端口居然已經(jīng)滿負荷運作十幾個小時了,這是什么概念?100Mbps滿負荷1天,流量就是1000G,這樣下去不用多久,我就可以等著上百刀的罰單了,淚飆。
此外,100Mbps的速度使得硬盤都快轉(zhuǎn)不動了,嚴重拖累網(wǎng)站的響應(yīng)速度,卡得我啊真是。想當(dāng)年VC掛了一天,被抓站的家伙們搞得一個禮拜半殘廢狀態(tài)(其中那些家伙包括我在內(nèi),汗)。simplecd就更支撐不了了。
事實上這種人肉DDoS比正常的DDoS更加難以區(qū)分和預(yù)防,不過也就只能盡人事,聽天命了,參考一些文章寫了個python的防止DDoS的腳本,加入cron每分鐘執(zhí)行即可。
實現(xiàn)原理是,查詢netstat的連接數(shù),同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日 更新:
同時用這個腳本,外加轉(zhuǎn)移桌面版的站點到一個10M unlimited的地方以后,似乎天下太平了(嗎?)

相關(guān)文章
python反編譯學(xué)習(xí)之字節(jié)碼詳解
這篇文章主要給大家介紹了關(guān)于python反編譯學(xué)習(xí)之字節(jié)碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05使用url_helper簡化Python中Django框架的url配置教程
這篇文章主要介紹了使用url_helper簡化Python中Django框架的url配置教程,需要的朋友可以參考下2015-05-05python數(shù)據(jù)可視化之初探?Seaborn
Seaborn?是一個基于?Matplotlib?的?Python?數(shù)據(jù)可視化庫,它提供了更高級別的接口,使得創(chuàng)建美觀的統(tǒng)計圖形變得非常簡單,在這篇文章中,我們將討論?Seaborn?的基礎(chǔ)使用方法,包括如何創(chuàng)建各種常見的統(tǒng)計圖形2023-07-07python報錯TypeError: Input z must be
大家好,本篇文章主要講的是python報錯TypeError: Input z must be 2D, not 3D的解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12把django中admin后臺界面的英文修改為中文顯示的方法
今天小編就為大家分享一篇把django中admin后臺界面的英文修改為中文顯示的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07