python實(shí)現(xiàn)的防DDoS腳本
這篇博可以說連開場白都可以省掉了,之所以被DDoS,并不是因?yàn)槿橇睡偣繁蛔分?,而是因?yàn)閂C悲劇之后流量全到simplecd來了。
不僅如此,一些笨蛋們在抓站,一些笨蛋們在用迅雷下載,100Mbps的端口居然已經(jīng)滿負(fù)荷運(yùn)作十幾個小時了,這是什么概念?100Mbps滿負(fù)荷1天,流量就是1000G,這樣下去不用多久,我就可以等著上百刀的罰單了,淚飆。
此外,100Mbps的速度使得硬盤都快轉(zhuǎn)不動了,嚴(yán)重拖累網(wǎng)站的響應(yīng)速度,卡得我啊真是。想當(dāng)年VC掛了一天,被抓站的家伙們搞得一個禮拜半殘廢狀態(tài)(其中那些家伙包括我在內(nèi),汗)。simplecd就更支撐不了了。
事實(shí)上這種人肉DDoS比正常的DDoS更加難以區(qū)分和預(yù)防,不過也就只能盡人事,聽天命了,參考一些文章寫了個python的防止DDoS的腳本,加入cron每分鐘執(zhí)行即可。
實(shí)現(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)移桌面版的站點(diǎn)到一個10M unlimited的地方以后,似乎天下太平了(嗎?)
相關(guān)文章
python3學(xué)習(xí)之Splash的安裝與實(shí)例教程
splash 是一個python語言編寫的用于配合scrapy解析js的庫,下面這篇文章主要給大家介紹了關(guān)于python3學(xué)習(xí)之Splash的安裝與使用的一些相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
python利用pandas和csv包向一個csv文件寫入或追加數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于python利用pandas和csv包向一個csv文件寫入或追加數(shù)據(jù)的相關(guān)資料,我們越來越多的使用pandas進(jìn)行數(shù)據(jù)處理,有時需要向一個已經(jīng)存在的csv文件寫入數(shù)據(jù),需要的朋友可以參考下2023-07-07
Python3實(shí)現(xiàn)生成隨機(jī)密碼的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)生成隨機(jī)密碼的方法,是Python程序設(shè)計(jì)中非常實(shí)用的一個技巧,需要的朋友可以參考下2014-08-08
Python可視化mhd格式和raw格式的醫(yī)學(xué)圖像并保存的方法
今天小編就為大家分享一篇Python可視化mhd格式和raw格式的醫(yī)學(xué)圖像并保存的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問題
這篇文章主要介紹了Pytorch可視化(顯示圖片)及格式轉(zhuǎn)換問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

