好幾個月沒寫博客,一方面是工作忙原因,一方面是內容太淺,沒什麼實際應用的我也不想寫,現在正好最近遭受了大量的UDP***,我給大家介紹一下我這裏是如何防禦DDOS等流量***。
先給大家看看我最近遭受***情況數據彙總
1、最近1周,總共受到流量***14次,均是UDP***;
2、前9次均是機房幫忙進行流量牽引、清洗或黑洞;
3、但機房可以給清洗的量有限,基本8G以下可以幫忙,而且這個清洗有的機房是收費,有的是免費,8G以上的話,機房就得把流量牽引到黑洞,也就是封IP,一般是禁止訪問2小時,如果解封后還有多次***,就得封24小時,目前我這裏是受到封IP,直接更換公網IP,但最近幾天***此時過多,總是被動更換ip也不是一個好的方式,所以我這裏考察了很多方案,最終採用了高防,價格便宜、性價比高。
我公司也不是沒有防護方式,有IPS與IDS設備,也有防火牆,一般小流量4G以下均能防禦,但***量超過4G後,流量基本都無法到達我公司網絡,所以只能採用其他方案。
下面是我考察行業內的方案,選擇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,所以你可以參考下面
在"線路類型"這裏,默認與電信線路都解析到高防的電信裏,聯通就解析到聯通裏,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***,你可以聯繫網監了。
下面是我針對***量做的防禦方案,大家可以參考。