DDOS除了使用CloudFlare或百度加速云(国内加壳的5s盾)或高防IP还有其他方法防护吗?fail2ban和iptable只能延缓一点点点。
Only Mystery
一、CDN
1)手动优化Cloudflare
订阅一个Plesk面板,然后订阅一个Cloudflare高级套餐($18刀,买一次永久不续费,可以一直使用),这样可以廉价的使用到Cloudflare Pro套餐的全部功能(也可以通过一些商家直接购买带有CF许可证的Plesk面板,如:云筏、Wikihost 等,这些商家普遍会将价格设置得非常便宜,是一个经济的选择)。当启用套餐内的功能:HTTP/2支持、Mirage移动端优化、Polish图片压缩、更高的WebSockets连接数支持,然后进入到WAF设置中,可以看到有一个传输速率限制,可以根据自己需求设定。
的然后做一下自选IP(我这里收集到了一些比较优质的Enterprise IP段)在Cloudflare的官方Partner处接入(cdn.bnxb.cn、cf.9sep.org、cf.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