DDOS攻击除了使用CloudFlare或者高防IP还有其他防护方法吗?

DDOS除了使用CloudFlare或百度加速云(国内加壳的5s盾)或高防IP还有其他方法防护吗?fail2ban和iptable只能延缓一点点点。

喜欢这个问题 | 分享 | 新建回答

回答

Only Mystery

Jul 21, 2020
3 赞

一、CDN

1)手动优化Cloudflare

订阅一个Plesk面板,然后订阅一个Cloudflare高级套餐($18刀,买一次永久不续费,可以一直使用),这样可以廉价的使用到Cloudflare Pro套餐的全部功能(也可以通过一些商家直接购买带有CF许可证的Plesk面板,如:云筏、Wikihost 等,这些商家普遍会将价格设置得非常便宜,是一个经济的选择)。当启用套餐内的功能:HTTP/2支持、Mirage移动端优化、Polish图片压缩、更高的WebSockets连接数支持,然后进入到WAF设置中,可以看到有一个传输速率限制,可以根据自己需求设定。

的然后做一下自选IP(我这里收集到了一些比较优质的Enterprise IP段)在Cloudflare的官方Partner处接入(cdn.bnxb.cncf.9sep.orgcf.cloudraft.cn)从而获得一个CNAME来接入你的域名。再完成DNS解析后,你需要在CF面板里开启SSL,勾选到自己需要的模式(半程:HTTPS->HTTP,全程HTTPS->HTTPS)等待SSL证书颁发完毕(通常只需要5秒左右)。此时删除你的CNAME解析。换成以下A记录值:

198.41.214.0/24

104.16.0.0/24
104.16.80.0/24 104.16.96.0/24 104.16.161.161 - 104.16.161.254

至此,你会发现速度已经快上了不少。



2)Cloudflare终极奥义 Railgun

接下来,如果还认为做得不够的话,可以去Cloudflare的Partner处申请开通Railgun

(这是CF为Business套餐客户所准备的一款工具,通过CF节点与Railgun客户端建立WAN长链接来固定回源节点,并实现高达99.6%以上的压缩率,平均 200% 的额外性能提高 ,即:不需要PHP、MySQL重复运算。)

在这里有两家免费提供的:Cloudraft云筏、挖站否,以及一家付费提供的:BNXB笨牛

由于Railgun是一个双端程序,所以通常需要由客户自己准备服务器来部署Railgun Listener端(Railgun Sender 端部署于Cloudflare的数据中心,并于Railgun Listener保持连接)

(图片是BNXB网上的,应该是Anycast,图上字出现了错误)

一般联系一下上述商家,对方就会给你一个Token,下面将阐述一下Railgun的安装:

确保服务器配置高于:4C32GB,并且已经安装了Mencached环境,并开放安全组端口:2408

Centos为例,介绍安装步骤:

wget https://www.cloudflare.com/static/misc/railgun/centos/railgun-el7.latest.rpm
rpm -Uvh railgun-el7.latest.rpm

编辑参数:

vi /etc/railgun/railgun.conf

拉到最底下,改动这两个参数

activation.token= 你的Railgun的Token

activation.railgun_host= 你的服务器IP

最后,启动Railgun服务:

/etc/init.d/railgun start

系统会显示:"Starting railgun (via systemctl)      [OK]" 字样



3)手动配置防火墙

以下是收集来的国内高危IP段、ASN

27.54.224.0/19
61.130.0.0/16
114.67.0.0/18
114.112.225.0/24
117.79.80.0/20
118.215.192.0/19
120.31.66.0/23
120.31.68.0/22
120.31.128.0/20
121.201.0.0/17
122.10.0.0/17
123.197.0.0/17
203.161.192.0/19
210.76.64.0/19
220.231.128.0/17
221.136.0.0/16
27.109.124.0/22
43.228.148.0/22
43.240.124.0/24
43.254.152.0/24
43.254.220.0/22
45.115.44.0/22
45.115.144.0/22
45.124.124.0/22
45.253.26.0/24
45.253.27.0/24
59.153.92.0/22
103.2.204.0/22
103.5.192.0/22
103.21.140.0/22
103.22.228.0/22
103.24.116.0/24
103.24.118.0/23
103.28.212.0/22
103.36.132.0/22
103.47.136.0/22
103.55.172.0/22
103.76.92.0/22
103.98.220.0/22
103.101.124.0/23
103.108.160.0/24
103.147.124.0/24
103.192.212.0/22
103.192.252.0/22
103.198.124.0/22
103.202.96.0/22
103.202.100.0/22
103.202.104.0/22
103.202.108.0/22
103.202.112.0/22
103.202.120.0/22
103.202.124.0/22
103.202.128.0/22
103.202.132.0/22
103.202.136.0/22
103.202.140.0/22
103.202.144.0/22
103.211.44.0/22
103.222.40.0/24
103.222.41.0/24
103.222.42.0/24
103.222.43.0/24
103.242.168.0/23
103.242.170.0/24
103.243.252.0/22
103.245.80.0/22
106.75.208.0/20
106.75.224.0/20
106.75.240.0/20
110.43.64.0/20
110.43.128.0/21
110.43.136.0/21
110.43.144.0/21
110.43.152.0/21
113.31.96.0/20
113.31.112.0/20
113.31.144.0/20
116.63.32.0/19
116.198.160.0/21
116.198.168.0/21
116.198.176.0/22
117.74.128.0/21
117.74.136.0/21
118.126.1.0/24
118.126.2.0/23
118.126.4.0/23
118.126.8.0/23
118.126.10.0/24
118.126.12.0/23
118.126.14.0/23
118.126.16.0/23
118.126.18.0/24
119.37.0.0/23
119.37.2.0/24
119.37.12.0/24
120.92.128.0/21
120.92.136.0/21
120.92.144.0/21
120.92.152.0/21
120.92.160.0/21
120.92.168.0/21
120.92.176.0/21
120.92.184.0/23
120.92.184.0/21
120.92.216.0/22
120.92.224.0/23
120.92.226.0/23
120.92.228.0/23
120.92.230.0/23
120.92.232.0/23
120.92.234.0/23
120.92.236.0/23
120.92.238.0/23
120.132.136.0/22
120.132.192.0/23
120.133.224.0/22
120.133.228.0/22
120.133.236.0/24
120.133.237.0/24
120.133.238.0/24
120.133.239.0/24
120.136.156.0/22
120.136.160.0/21
121.46.224.0/22
121.46.228.0/23
121.46.230.0/23
121.46.232.0/23
121.46.234.0/24
121.46.235.0/24
121.46.236.0/24
121.46.237.0/24
121.46.238.0/24
121.46.239.0/24
121.46.244.0/24
121.46.245.0/24
121.46.246.0/24
121.46.247.0/24
121.46.248.0/24
121.46.249.0/24
121.46.250.0/24
121.46.251.0/24
121.46.252.0/24
121.46.253.0/24
121.46.254.0/24
122.9.64.0/19
122.112.192.0/22
146.196.56.0/22
150.129.192.0/22
150.242.238.0/23
163.47.4.0/22
163.53.88.0/21
175.102.0.0/24
175.102.1.0/24
175.102.2.0/24
175.102.3.0/24
175.102.4.0/24
175.102.5.0/24
175.102.6.0/24
175.102.7.0/24
175.102.8.0/24
175.102.9.0/24
175.102.10.0/24
175.102.11.0/24
175.102.12.0/24
175.102.13.0/24
175.102.14.0/24
175.102.15.0/24
175.102.16.0/24
175.102.17.0/24
175.102.18.0/24
175.102.19.0/24
175.102.128.0/24
175.102.129.0/24
175.102.130.0/24
175.102.131.0/24
175.102.132.0/24
175.102.133.0/24
175.102.134.0/24
175.102.135.0/24
180.235.64.0/21
180.235.72.0/23
182.175.242.0/24
182.175.243.0/24
202.136.208.0/22
202.136.212.0/22
202.136.216.0/23
202.170.220.0/23
203.76.208.0/22
203.76.212.0/22
203.76.216.0/22
210.5.144.0/21
210.5.152.0/21
211.152.32.0/19
211.152.57.0/24
211.152.58.0/24
211.159.96.0/19
AS4816
AS4835
AS17428
AS23724
AS24429
AS37963
AS37969
AS38283
AS38587
AS45062
AS45090
AS55990
AS56005
AS56011
AS58461
AS58466
AS58519
AS58543
AS58563
AS58593
AS58844
AS58854
AS59019
AS59048
AS59050
AS59077
AS63545
AS63612
AS63631
AS63655
AS63677
AS63678
AS63679
AS63835
AS63838
AS131495
AS132203
AS132510
AS133492
AS133774       
AS133775
AS133776
AS134238
AS134417
AS134418
AS134420
AS134543
AS134756
AS134763
AS134764
AS134769
AS134771
AS135061
AS135629
AS136160
AS136188
AS136190
AS136958
AS136959
AS137218
AS137539
AS137693
AS137697
AS137699
AS137784
AS137785
AS137788
AS138407
AS138950
AS138952
AS139007
AS139018
AS139201
AS139203
AS139220

将他们添加入服务器、CDN的黑名单中。

至此,你将会获得近乎于CF的Enterprise套餐的速度。


4)对Cloudflare网络进行反向代理

使用香港、日本、新加披等近大陆的服务器,安装Nginx,实现对CF节点的反向代理。

然后再通过A解析值,指向这些反代节点。

(当然,这种虽然快速,但却面临流量被盗刷、节点被攻击的问题,所以并不是太推荐)


二、服务端

其实,服务器本身的抗DDoS可操作性并不高。但是可以通过人为配置来提升抗CC攻击能力和提升并发数。

1)使用Nginx-Tengine代替原版的Nginx,Tengine是阿里巴巴团队为淘宝、天猫等产品做的一个高性能Web服务器,据称能够提升64%的并发数。同时内存占用率极小。

2)将站点的Session写入Redis或Mencached从而代替直接的files储存(当然Redis必须开启持久化才有意义。)

3)通过Cloudflare API Key,来执行自动开盾。这一步是指,在正常模式下,CF的5秒盾默认保持关闭,只有在CPU占用激增的时候才自动开启5秒盾(I‘m Under Attack模式)

这里就说一个简单的方法:登陆cdn.bnxb.com,找到自动开盾,查看自己的Token。

然后设置corn自动任务,定期执行以下脚本

#!/bin/sh
token="TOPKEN"  #修改为自己的TOKEN内容
mode="load"  #判断服务器负载方式 load负载法  cpu  CPU百分比法  只能选一个
keeptime=1800   #开盾负载下降后持续多少秒,进行尝试关盾
if [ "$mode" = "cpu" ];
then
check=90   #5秒内CPU连续超过80 则开盾【可以根据服务器负荷情况调整】
#系统空闲时间
TIME_INTERVAL=5
time=$(date "+%Y-%m-%d %H:%M:%S")
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
LAST_SYS_IDLE=$(echo $LAST_CPU_INFO | awk '{print $4}')
LAST_TOTAL_CPU_T=$(echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
sleep ${TIME_INTERVAL}
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
NEXT_SYS_IDLE=$(echo $NEXT_CPU_INFO | awk '{print $4}')
NEXT_TOTAL_CPU_T=$(echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
#系统空闲时间
SYSTEM_IDLE=`echo ${NEXT_SYS_IDLE} ${LAST_SYS_IDLE} | awk '{print $1-$2}'`
#CPU总时间
TOTAL_TIME=`echo ${NEXT_TOTAL_CPU_T} ${LAST_TOTAL_CPU_T} | awk '{print $1-$2}'`
load=`echo ${SYSTEM_IDLE} ${TOTAL_TIME} | awk '{printf "%.2f", 100-$1/$2*100}'`
else
load=$(cat /proc/loadavg | colrm 5)
check=$(cat /proc/cpuinfo | grep "processor" | wc -l)
fi
if [ ! -f "status.txt" ];then
echo "" > status.txt
else
status=$(cat status.txt)
fi
now=$(date +%s)
time=$(date +%s -r status.txt)
echo "当前$mode负载:$load"
if [[ $status -eq 1 ]]
then
echo "当前开盾中"
else
echo "当前未开盾"
fi
newtime=`expr $now - $time`
closetime=`expr $keeptime - $newtime`
if [[ $load <$check ]]&&[[ $status -eq 1 ]]&&[[ $newtime -gt $keeptime ]]   
then
echo -e "\n$mode负载低于$check,当前已开盾超过半小时($newtime秒),尝试关盾"
url="https://cdn.bnxb.com/api/?token=$token&status=off"  
cResult=$(curl --insecure -X GET $url )
echo $cResult
if [[ $cResult -eq 1 ]]
then
  echo 0 > status.txt
  echo -e "\n关盾成功"
fi  
  
elif [[ $load <$check ]]
then
echo -e "\n$mode负载低于$check,不做任何改变,$newtime秒"
if [[ $status -eq 1 ]]
then
  echo -e "将于$closetime秒后关盾"
fi                        
exit
                      
elif [[ $load >$check ]] && [[ $status -eq 1 ]] && [[ $newtime -gt $keeptime ]]  
then
echo -e "\n$mode负载高于$check,当前已开盾超过$newtime秒,盾无效"
exit
  
elif [[ $load >$check ]] && [[ $status -eq 1 ]]
then
echo -e "\n$mode负载高于$check,当前已开盾($newtime秒),请再观察"
exit  
                      
elif [[ $load >$check ]]
then
echo -e "\n$mode负载高于$check,开启防御规则"  
url="https://cdn.bnxb.com/api/?token=$token&status=on"                     
cResult=$(curl --insecure -X GET $url )
echo $cResult
if [[ $cResult -eq 1 ]]
then
  echo 1 > status.txt
  echo -e "\n开盾成功"
fi    
else
echo 0 > status.txt  
fi

好啦,至此,就可以实现自动防御CC了。

4)如果不希望通过CF来实现CC的防御,那么这里我也整了一个基于LNMP+Redis的CC防御:

(可以添加在站点的index文件头部)

//LNMP+Redis防御CC攻击配置
header('Content-Type: text/html; charset=UTF-8'); //原有代码,代码放在下面
//CC攻击停止后会尽快解除验证码,回到正常状态
//防CC配置
$IPmax = 60; //开启验证码条件 值>=php最大进程数,适当设置更大会降低验证码触发条件,但会增大502错误几率(php挂起)
$IPfor = 60; //周期 这个值基本不用动
$IPban = 120; //扔入黑名单 60秒内访问超过60次即拉黑IP
$banTime = 3600*24; //黑名单时长 扔小黑屋时长
$ip = ip();
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//拦截黑名单
if($redis->exists($ip.'ban')){
exit('您被关进了小黑屋,么么哒!');
}
//扔黑名单检测
if($redis->get($ip.'ok') >= $IPban){
$redis->setex($ip.'ban', $banTime, '1');
}
if($redis->exists($ip.'ok')){
$redis->incrby($ip.'ok',1); //记录IP 自增1
}else{
$redis->setex($ip.'ok',$IPfor,1);
}
//按需开启防CC 小黑屋IP不会触发该条件,所以当一段时间以后就会解除验证码。除非攻击者换一批代理继续攻击。如此往复
if(count($redis->keys("*ok")) > $IPmax){
//验证
if($_COOKIE['key'] == ''){
if($_GET['cc']){
$key = md5($ip.$_GET['cc']);
setcookie("key",$key);
}
}
//拦截代码
if($_COOKIE['key'] && $_COOKIE['cc'] && $_COOKIE['key'] == md5($ip.$_COOKIE['cc'])){
//通过
}else{
if($_GET['cc']){
$key = md5($ip.$_GET['cc']);
setcookie("key",$key);
}else{
$cc = rand(1000,9999);
setcookie("cc",$cc);
//这里只是简单的构造了一下验证码,有能力可以自己更改的更安全和完美。
echo '<!DOCTYPE html>
<html>
<body>
<form action="">请输入:'.$cc.' :<input type="text" name="cc" value=""><input type="submit" value="继续访问"></form>
<p> Hey,你的刷新速度太快啦!请输入验证码再尝试继续访问吧~</p>
</body>
</html>';
}
exit();
}
}
function ip() {
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
return $res;
}

5)在服务器安全组处禁用掉不必要的UDP开放端口,避免遭受NTP、LDAP等的DDoS攻击。

同时通过安全狗等安全组件对服务器的TCP连接实现管制。

(这个是为数不多的可以自己设置的东西了,通常SYN、ACK等攻击可以通过一定手段的TCP管制策略来保护服务器免遭DDoS攻击后宕机,但是UDP这块很难处理,绿盟、知道创宇404等的IP行为调查报告里,貌似也提到的NTP反射放大攻击和LDAP这两类攻击极为热门)


三、机房

嘛,这一块,其实才是重头戏,国内的BGP三线高防价格普遍都相当高昂,50GB防御动则上万了。

但是海外的一些机器其实抗防能力不错,比如Hetzner、OVH等等。他们的带宽和默认抗击DDoS能力普遍较高,且价格亲民,另像AWS、Azure等服务商,其实他们提供的防御也都是近源云清洗。

一个高防的海外服务器+一个可拓展性极高的CDN是一个不错且经济的选择,毕竟现在大家都是云清洗了,国内价格低廉的高防实属少见(当然,除非去买移动单线这种线路,但其实防御也不见得能够高到哪里去)

我向CF询过Enterprise的报价,带“中国网络加速”(其实就是国内百度云加速)的套餐,月6300刀,不带的月3000刀,其中他们转为SaaS平台设计的Enterprise for SaaS为5000刀(貌似还要收取5万出装费)。

有一个不错的选择是,从百度云加速的partner处购买企业版的百度云CDN,价格是在百度官网价格的4折,算是一种不错的选择啦~

我自己是基于Cloudflare做的Web防护:

抬头看看钟,嘛,不知不觉就写了这么多,好嘛,在此之前,我还收到过“黑客”的威胁,一个号称自己能够打出35TB的人,我实在的害怕极了,哈哈哈,所以似乎对这种问题有着一种执念要死守防线。

不过后来查了一下,Cloudflare在国内电信的总量也就300G的PoP,但是由于他们的Anycast这一魔法操作,实现的全球清洗的效果。

话说站长在如果遭遇了烈性的盗刷流量、狂打CDN直扣钱等行为的话,建议短期内还是使用Cloudflare吧。毕竟Akamai的价格去看了看把我吓回来了,但国内网宿+Akamai的“钞能力”是毋庸置疑的。

所以,说到底,有没有方法呢?有!但是都是钱的问题.....Orz