如何防護DDOS等流量***

好幾個月沒寫博客,一方面是工做忙緣由,一方面是內容太淺,沒什麼實際應用的我也不想寫,如今正好最近遭受了大量的UDP***,我給你們介紹一下我這裏是如何防護DDOS等流量***。php

先給你們看看我最近遭受***狀況數據彙總
css

wKiom1i2NYzhpItaAAF7LqtAsnE804.png

一、最近1周,總共受到流量***14次,均是UDP***;html

二、前9次均是機房幫忙進行流量牽引、清洗或黑洞;nginx

三、但機房能夠給清洗的量有限,基本8G如下能夠幫忙,並且這個清洗有的機房是收費,有的是免費,8G以上的話,機房就得把流量牽引到黑洞,也就是封IP,通常是禁止訪問2小時,若是解封后還有屢次***,就得封24小時,目前我這裏是受到封IP,直接更換公網IP,但最近幾天***此時過多,老是被動更換ip也不是一個好的方式,因此我這裏考察了不少方案,最終採用了高防,價格便宜、性價比高web

我公司也不是沒有防禦方式,有IPS與IDS設備,也有防火牆,通常小流量4G如下均能防護,但***量超過4G後,流量基本都沒法到達我公司網絡,因此只能採用其餘方案。後端

wKiom1i2NouSVbtWAABF-yTRvW0715.png

下面是我考察行業內的方案,選擇3個比較好的,有錢其實我也想選擇阿里雲盾或騰訊大禹,由於他們防護配置簡單,而且是分佈式防護,跟CDN加速同樣,***都是轉發到就近的高防節點,例如:上海電信的***量就直接在上海電信高防防護,這樣能夠防護更多的***,而且即便某節點被***垮了,也只是影響整個節點,其餘節點正常。安全

但價格太貴(機房的流量清洗更貴,哈哈),公司不批,爲了保證業務,只能選擇價格便宜、性價比高的高防,我選擇的是40G 電信+聯通節點的方案最大整個高防能夠防護100G,目前我這裏***都在40G如下,正好知足需求,此方案細節爲:bash

電信單ip防護40g流量***/1000w pps,聯通單ip防護10g流量***/500w pps。
聯通防護10G,緣由是聯通內網管控嚴格,基本***都是從電信來的。

自從使用了高防方案,總共遭受了5次***,但均未影響業務。網絡

有了高防節點,你能夠選擇2個方案進行配置:tcp

一、最簡單的使用Iptables的DNAT技術,直接讓流量經過高防後,轉發到源站;

二、使用nginx的反向代理技術;

方案一優點是配置簡單,配置好iptables規則後,不須要管後端源站有多少域名,只須要流量是經過高防通通轉發到源站,但缺點是源站沒法獲取客戶的真實IP。

方案二優點是能夠獲取讓源站獲取客戶真實IP,缺點是源站有多少域名都須要在nginx的反向代理裏配置。

當前這2個方案,都得結合DNS技術,須要把高防的IP解析到域名,通常高防多節點會給你2個IP,一個是電信,一個是聯通,因此你須要在DNS裏解析這2個IP,我使用DNSPOD,因此你能夠參考下面

wKiom1i2PeeRZgU2AACHrhfwqkY912.png

在"線路類型"這裏,默認與電信線路都解析到高防的電信裏,聯通就解析到聯通裏,TTL時間最好能短一些,若是有問題能夠快速切換,但因爲我這個是免費dnspod,因此只能是600秒了。

另外若是想使用高防,你源站IP也須要先切換到一個新的IP,由於舊的已經暴漏,若是不換IP,可能致使對方直接***你源站,而且切換到新IP後,80端口也只容許高防IP獲取數據。

下面介紹若是使用iptables的dnat與nginx反向代理。

一、IPTABLE的DNAT

A、須要先配置轉發功能

sysctl -w net.ipv4.ip_forward=1

B、配置iptables

*nat
:PREROUTING ACCEPT [9:496]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 高防電信IP/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 源站IP:源站web端口
-A PREROUTING -d 高防聯通IP/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 源站IP:源站web端口
-A POSTROUTING -p tcp -m tcp --dport 源站web端口 -j SNAT --to-source 高防電信IP
-A POSTROUTING -p tcp -m tcp --dport 源站web端口 -j SNAT --to-source 高防聯通IP
COMMIT
# Generated by iptables-save v1.4.7 on Wed Feb 22 11:49:17 2017
*filter
:INPUT DROP [79:4799]
:FORWARD ACCEPT [37:2232]
:OUTPUT ACCEPT [150:21620]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 公司機房網段/24 -p tcp -m multiport --dports 22,10050 -j ACCEPT
-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
COMMIT

針對上面高防電信IP、高防聯通IP、源站IP、源站web端口、公司機房網段進行修改。

完成後重啓iptables就能夠生效(dnspod的配置別忘記),源站不須要修改任何配置。

二、Nginx的反向代理

A、安裝

yum或編譯都行,但若是想讓源站獲取真實用戶IP須要新增模塊(高防與源站都須要有此模塊)

--with-http_realip_module

這個模板默認yum安裝是已存在,若是不知道本身有哪些模塊可使用下面命令查看

nginx -V

B、在高防的nginx的裏配置

upstream web {
        server xxx.xxx.xxx.xxx:80;
    }
    server {
        listen 80;
        server_name notice1.ops.xxx.xxx;
        client_max_body_size 10M;
        proxy_read_timeout 30;
        access_log  /var/log/nginx/access_notice.log;
        error_log  /var/log/nginx/error_notice.log;
        location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $host;
          proxy_redirect off;
          proxy_headers_hash_max_size 51200;
          proxy_headers_hash_bucket_size 6400;
          proxy_pass http://web;
        }
    }

須要修改upstream web裏的server源站ip與端口,以及server_name那裏的域名。

最後你須要在iptables裏開通本機80容許公網訪問。

C、在源站的nginx裏配置

server {
        listen       80;
    server_name notice1.ops.xxx.xxx;
    index index.html index.htm index.php;
    root  /var/www/html/;

    access_log  /var/log/nginx/notice-access.log;
    error_log  /var/log/nginx/notice-error.log;
    error_page 502 = /502.html;

    location ~ .*\.(php|php5)?$ {
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        set_real_ip_from xxx.xxx.xxx.xxx;
        real_ip_header X-Real-IP;
}

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp3)$ {
        expires      30d;
    }

    location ~ .*\.(js|css)?$ {
        expires      12h;
    }
}

主要須要修改的是server_name與set_real_ip_from,後者是須要填寫高防的IP。

完成後重啓nginx,而且在iptables防火牆裏設置只容許高防IP訪問本身本地80.

另外若是你有多個域名,就寫多個虛擬主機配置文件就好。

目前高防方案只能防禦100G如下***,若是***超過100G,你能夠選擇阿里雲盾的,能夠最高支持300G的,另外真的要是超過了100G***,你能夠聯繫網監了。

下面是我針對***量作的防護方案,你們能夠參考。

wKiom1i2Q0XDj1YJAACkv5IXkR8167.png

相關文章
相關標籤/搜索