如何防禦DDOS等流量***

好幾個月沒寫博客,一方面是工作忙原因,一方面是內容太淺,沒什麼實際應用的我也不想寫,現在正好最近遭受了大量的UDP***,我給大家介紹一下我這裏是如何防禦DDOS等流量***。

先給大家看看我最近遭受***情況數據彙總

wKiom1i2NYzhpItaAAF7LqtAsnE804.png

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

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

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

我公司也不是沒有防護方式,有IPS與IDS設備,也有防火牆,一般小流量4G以下均能防禦,但***量超過4G後,流量基本都無法到達我公司網絡,所以只能採用其他方案。

wKiom1i2NouSVbtWAABF-yTRvW0715.png

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

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

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

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

有了高防節點,你可以選擇2個方案進行配置:

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

2、使用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反向代理。

1、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的配置別忘記),源站不需要修改任何配置。

2、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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章