python實(shí)現(xiàn)的防DDoS腳本
這篇博可以說(shuō)連開(kāi)場(chǎng)白都可以省掉了,之所以被DDoS,并不是因?yàn)槿橇睡偣繁蛔分?,而是因?yàn)閂C悲劇之后流量全到simplecd來(lái)了。
不僅如此,一些笨蛋們?cè)谧フ?,一些笨蛋們?cè)谟醚咐紫螺d,100Mbps的端口居然已經(jīng)滿負(fù)荷運(yùn)作十幾個(gè)小時(shí)了,這是什么概念?100Mbps滿負(fù)荷1天,流量就是1000G,這樣下去不用多久,我就可以等著上百刀的罰單了,淚飆。
此外,100Mbps的速度使得硬盤都快轉(zhuǎn)不動(dòng)了,嚴(yán)重拖累網(wǎng)站的響應(yīng)速度,卡得我啊真是。想當(dāng)年VC掛了一天,被抓站的家伙們搞得一個(gè)禮拜半殘廢狀態(tài)(其中那些家伙包括我在內(nèi),汗)。simplecd就更支撐不了了。
事實(shí)上這種人肉DDoS比正常的DDoS更加難以區(qū)分和預(yù)防,不過(guò)也就只能盡人事,聽(tīng)天命了,參考一些文章寫了個(gè)python的防止DDoS的腳本,加入cron每分鐘執(zhí)行即可。
實(shí)現(xiàn)原理是,查詢netstat的連接數(shù),同IP超過(guò)一定連接的用iptables封禁一定時(shí)間,自動(dòng)封禁,自動(dòng)解封。
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()
目前來(lái)說(shuō)這個(gè)腳本的效果是0,封了500多號(hào)人了,但是還是滿速,真是可怕。
24日 更新:
同時(shí)用這個(gè)腳本,外加轉(zhuǎn)移桌面版的站點(diǎn)到一個(gè)10M unlimited的地方以后,似乎天下太平了(嗎?)

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