IIS防護小規模DDOS***實例

    最近幾天公司官網和業務系統的註冊頁面頻繁遭遇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便會從新啓動,不影響用戶訪問。後端

    wKiom1W7fHChy4F0AAEABkiOB5U152.jpg

2、流量清洗bash

    當***發現低層次的DDOS已經不起做用時,便會加大***力度。一開始咱們官網的平均併發數只有幾千,後來加大到了平均1萬6千個併發,最高7萬個併發,這樣上面的CPU監視功能就沒有效果了,由於w3wp.exe重啓後,會在極短期內CPU從新達到100%。服務器

    當時監控到的併發鏈接數:
網絡

wKioL1W7hfrgZNSwAABAcrtJhKA428.jpg

    CPU使用率和流量(帶寬上限10M):
session

wKiom1W7lmmw_BfQAAE48-oKKhU940.jpg

    幸運的是官網域名恰好在阿里雲上作好了備案,咱們遷移到阿里雲上後,利用雲盾的DDOS防禦功能便會清洗掉大部分異常流量,CPU立馬正常,官網滿血復活了。併發

    注:阿里雲免費的DDoS基礎防禦閾值是5Gbps,若是***流量高於這個值,則會被黑洞,業務就不能訪問了。

wKiom1W7gxHTfRXDAAIOAxyzP9A303.jpg

    這裏貼一下雲服務器的參數:

    配置: 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同一目錄下執行便可。部分輸出以下:

    wKioL1W-4HfBKXxLAALlg5so0eo148.jpg

    過濾出這些***源IP後,加到iptables裏:

iptables -I INPUT -s {ip} -j DROP;
相關文章
相關標籤/搜索