如何防护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

相关文章
相关标签/搜索