限制每秒請求數
ngx_http_limit_req_module模組通過漏桶原理來限制單位時間內的請求數,一旦單位時間內請求數超過限制,就會返回503錯誤。配置需要在兩個地方設定:
例如:
白名單設定
http_limit_conn和http_limit_req模組限制了單ip單位時間內的併發和請求數,但是如果nginx前面有lvs或者haproxy之類的負載均衡或者反向**,nginx獲取的都是來自負載均衡的連線或請求,這時不應該限制負載均衡的連線和請求,就需要geo和map模組設定白名單:geo $whiteiplist map $whiteiplist $limit limit_req_zone $limit zone=one:10m rate=10r/s;limit_conn_zone $limit zone=addr:10m;
geo模組定義了乙個預設值是1的變數whiteiplist,當在ip在白名單中,變數whiteiplist的值為0,反之為1
如果在白名單中--> whiteiplist=0 --> $limit="" --> 不會儲存到10m的會話狀態(one或者addr)中 --> 不受限制
反之,不在白名單中 --> whiteiplist=1 --> $limit=二進位制遠端位址 -->儲存進10m的會話狀態中 --> 受到限制
修改最大連線數
最大連線數不夠的話,nginx日誌中會出現"too many open files"錯誤。系統預設的1024太小了,在/etc/security/limits.conf中增加:
* soft nproc 65535* hard nproc 65535* soft nofile 65535* hard nofile 65535
iptables限制tcp連線和頻率
通過上述的配置,cc攻擊流量就處在302中了,但是保險起見對ip進行連線頻率和併發限制,限制單ip連線和頻率,在/etc/sysconfig/iptables中加入:
#單個ip在60秒內只允許新建20個連線-a input -i eth0 -p tcp -m tcp --dport 80 -m state --state new -m recent --update --seconds 60 --hitcount 20 --name default --rsource -j drop-a input -i eth0 -p tcp -m tcp --dport 80 -m state --state new -m recent --set --name default --rsource#控制單個ip的最大併發連線數為20-i input -p tcp --dport 80 -m connlimit --connlimit-above 20 -j reject #每個ip最多20個初始連線-a input -p tcp --syn -m connlimit --connlimit-above 20 -j drop
這樣配置後,單個ip能建立的連線不是只有20個,具體能建立多少連線還要看tcp的超時設定,但單個ip不會建立大量的tcp連線消耗系統資源。
使用fail2ban遮蔽攻擊ip
通過上面設定nginx後,cc攻擊請求變為302,直接由效能強勁的nginx處理。但是攻擊ip還是在不停的訪問伺服器,消耗著伺服器的資源,一旦達到一定數量級,也會嚴重影響到系統的效能,所以通過分析nginx的訪問日誌徹底遮蔽這些ip。
安裝fail2ban並公升級iptables至最新:
yum install -y epel-release yum install -y fail2ban iptables python-inotify
先看下我nginx的訪問日誌格式 :
攻擊日誌的效果:
cc攻擊的ip會經過nginx和lua處理後,訪問狀態變為302,根據nginx的訪問日誌格式,過濾這些ip和302狀態,加入黑名單即可。
新建fail2ban的規則檔案/etc/fail2ban/filter.d/nginx-302-cc.conf,內容為:
新建fail2ban的配置檔案/etc/fail2ban/jail.d/nginx-anti-302.conf,內容為:
[nginx-anti-302]enabled = trueport = httpfilter = nginx-302-cclogpath = /opt/nginx/logs/52os.net/access_web.logfindtime = 60 #檢測60秒內的日誌bantime = 900 #遮蔽ip的時間為15分鐘maxretry = 90 #達到90次就遮蔽 backend = pyinotify #使用pyinotify檢測日誌變化,被攻擊時檢測海量日誌時效能最好 banaction = iptables-ipset-proto6-allports #使用ipset遮蔽ip,使用iptables遮蔽大量ip需要時非常慢,並且資源占用非常大
訪客訪問一次**會產生2次302,這樣配置後60秒內允許45次正常的訪問,基本上不會遮蔽正常訪客。
如果使用iptables遮蔽,需注意fail2ban-0.9.3在執行iptables命令時,會加上了-w引數防止規則衝突,iptables-1.4.20以後才有這個引數,而centos 6 的iptables是1.4.7,導致iptables規則新增失敗,解決方法是刪除iptables-common.conf中的:
sed -i 's/iptables = iptables /iptables = iptables/' /etc/fail2ban/action.d/iptables-common.conf
啟動fail2ban :
service fail2ban start
通過以上設定實現了:
nginx防止DDOS攻擊
防禦ddos是乙個系統工程,攻擊花樣多,防禦的成本高瓶頸多,防禦起來即被動又無奈。ddos的特點是分布式,針對頻寬和服務攻擊,也就是四層流量攻擊和七層應用攻擊,相應的防禦瓶頸四層在頻寬,七層的多在架構的吞吐量。對於七層的應用攻擊,我們還是可以做一些配置來防禦的,例如前端是nginx,主要使用ngin...
Nginx防止DDOS流量攻擊
ddos流量攻擊 頻繁的傳送請求,造成寬頻占用,其他客戶端無法訪問 nginx解決ddos流量攻擊,利用limit req zone限制請求次數 limit conn zone限制連線次數 限制ip的每秒請求次數 limit req zone binary remote addr zone one ...
Nginx防止DDOS攻擊方案
一.限制每秒請求數 ngx http limit req module模組通過漏桶原理來限制單位時間內的請求數,一旦單位時間內請求數超過限制,就會返回503錯誤。配置需要在兩個地方設定 nginx.conf的http段內定義觸發條件,可以有多個條件 在location內定義達到觸發條件時nginx所...