最近幾天公司官網和業務系統的註冊頁面頻繁遭遇DDOS***,致使IIS應用程序池CPU佔用率100%,訪問網站出現503錯誤。下面總結一下應對措施。前端
1、啓用IIS的CPU監視功能node
對於低頻率的DDOS能夠採起這種方法。w3wp.exe是應用程序池的關聯進程,當WEB訪問量大時,w3wp.exe會佔用大量的系統資源。在DDOS***下,很明顯的現象就是w3wp.exe佔用CPU達到100%,網站拒絕訪問,這個時候遠程登陸服務器都很困難。針對這種狀況,作以下優化:nginx
一、爲IIS中的每一個網站設置單獨的應用程序池。web
二、爲每一個應用程序池設置CPU監視功能:當w3wp.exe的CPU超過50%或更高時,自動殺死w3wp.exe進程,監視頻率爲1分鐘。只要有訪問請求進來,w3wp.exe便會從新啓動,不影響用戶訪問。後端
2、流量清洗bash
當***發現低層次的DDOS已經不起做用時,便會加大***力度。一開始咱們官網的平均併發數只有幾千,後來加大到了平均1萬6千個併發,最高7萬個併發,這樣上面的CPU監視功能就沒有效果了,由於w3wp.exe重啓後,會在極短期內CPU從新達到100%。服務器
當時監控到的併發鏈接數:
網絡
CPU使用率和流量(帶寬上限10M):
session
幸運的是官網域名恰好在阿里雲上作好了備案,咱們遷移到阿里雲上後,利用雲盾的DDOS防禦功能便會清洗掉大部分異常流量,CPU立馬正常,官網滿血復活了。併發
注:阿里雲免費的DDoS基礎防禦閾值是5Gbps,若是***流量高於這個值,則會被黑洞,業務就不能訪問了。
這裏貼一下雲服務器的參數:
配置: CPU2核、內存4GB 鏡像: Windows Server 2008 R2 標準版 SP1 64位中文版 存儲: 1塊普通雲盤(100GB) 網絡: 帶寬10Mbps(經典網絡)
參數配置不高,可是能抵禦高強度的DDOS***,這得益於阿里強大的技術實力,偷偷作個廣告,嘿嘿。
3、Nginx反向代理
可是***還常常***咱們業務系統的註冊頁面,此次就沒有這麼幸運了,由於業務系統是在咱們實體機房,這就要靠咱們本身了。
因此咱們採起了前端Nginx反向代理、後端雙IIS作負載均衡,利用Nginx強大的性能和HttpLimitReqModul模塊限制某時間段內同一ip訪問次數。Nginx的優化這裏不提,下面只貼出相關配置:
首先在nginx.conf的http配置段裏增長以下內容:
map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; } # 訪問受限制後返回599 limit_req_status 599; # 定義一個名爲allips的limit_req_zone用來存儲session,大小是100M內存, # 以$clientRealIp 爲key,限制平均每秒的請求爲100個, limit_req_zone $clientRealIp zone=allips:100m rate=100r/s;
這裏限制了同一IP每秒的請求數不超過100個,不然多餘的請求會直接返回599錯誤。限制頻率要根據實際狀況進行配置,配置太低會影響正常的訪問,出現頁面顯示不全等問題。
而後編輯/etc/nginx/conf.d/upstream.conf:
server { listen 1334; server_name _; # 添加以下一行 limit_req zone=allips burst=5 nodelay; location / { # 反向代理 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://wskh_IIS; } # 開啓stub_status模塊監控 location /nginx_status{ stub_status on; access_log off; allow 127.0.0.1; # 容許內網某IP查看nginx status allow 192.168.1.100; deny all; } } # 後端web服務器 upstream wskh_IIS { server 192.168.1.39:1334; server 192.168.1.40:1334; ip_hash; }
好了,簡單配置完成。
下面貼一個統計Nginx訪問日誌access.log裏IP請求頻率的小腳本:
#!/bin/bash # # Filename: count_req.sh # Revision: 1.0 # Author: Qicheng # Website: http://qicheng0211.blog.51cto.com # Description: 統計Nginx日誌裏IP訪問頻率 NGINXLOG="./access.log" start_time=$(head -n1 "$NGINXLOG" | grep -o " \[.*\] ") stop_time=$(tail -n1 "$NGINXLOG" | grep -o " \[.*\] ") echo -e "start:\t\e[92m$start_time\033[0m" echo -e "stop:\t\e[92m$stop_time\033[0m" echo '全部的請求TOP50-->>' # 全部的請求 cat "$NGINXLOG" | awk '{++S[$1]} END {for(a in S) print S[a],"\t", a}' | sort -rn -k1 | head -n 50 echo '--------------------------------------------------' echo '成功的請求TOP50-->>' # 成功的請求 grep ' 200 ' "$NGINXLOG" | awk '{++S[$1]} END {for(a in S) print S[a],"\t", a}' | sort -rn -k1 | head -n 50
把腳本放到和access.log同一目錄下執行便可。部分輸出以下:
過濾出這些***源IP後,加到iptables裏:
iptables -I INPUT -s {ip} -j DROP;