• 牺牲基本自由来换取暂时的安全, 最后既得不到安全也得不到自由[email protected]本杰明·富兰克林 (美国开国元勋 物理学家 作家)

网站安全防护篇

杂七杂八 BobMaster 682次浏览 2654字 0个评论
文章目录[显示]
()

这段时间整了个论坛,同时进行了下压力测试,结果让我很失落,随便用一台服务器ab -n 300000 -c 100,网站直接返回502挂了!这还玩个锤子,cf没有任何反应。于是乎,对博客也测试了下,CPU占用也是到100%,但是还是能正常访问,不得不说wordpress的缓存策略比phpbb强好多

PS: 在服务器端没有特别设置的情况下,一般cf保护的源站,ip是可以查询到的
在线工具: https://censys.io/
亲测可用,不过服务器特别配置过后,一段时间再扫,就查不到了

实验过程

由于现在大多数服务器都是提供ddos清洗的,一般要搞你还是要作用在应用层,即第七层。这个时候就要看你服务器的性能以及网站的架构是否优化得当了。
虽然nginx并发强,但是一配上php-fpm,好像也就那样了。

我对博客的测试是通过请求搜索结果https://blog.hibobmaster.com/search/a,用top观察进程的占用情况,结果数据库一直在查询,还有php-fpm这两者的高占用,看来我的博客不会缓存搜索结果,就算缓存也没多大用,可以构造随机请求字符,因此这里我考虑是用verynginx对搜索进行频率限制10s内最对响应100个搜索请求

对phpbb论坛首页直接ab测一测,我特么mysql查询进程直接拉爆CPU,所以我就很纳闷了,phpbb默认只能用自带的缓存,结果打开个首页就得查询数据库,这还怎么用。解决方案的其中一部分是这么搞的,打开开发者控制台,刷新一下,随便打开两个页面,发现请求数为96,所以我最后是用verynginx限制同一ip对host的请求,10S内最多请求数为100,超出返回429

大致解决过程

首先列举一些使用的工具和脚本供大家参考:
1.verynginx
2.cloudflare-ddos-protection
3.cf-auto-uam
4.Nginx-Lua-Anti-DDoS

其中功能比较强大的是1和4,2和3是检测CPU占用,然后当达到阈值时自动开启5s盾。

隐藏ip,同时屏蔽非cf流量

我的解决方案是使用cloudflare自签证书,同时对于非cf流量禁止访问
同时还要能获取访客的真实ip
用到的脚本是nginx-cloudflare-real-ip

获取访客ip的同时屏蔽非cf流量,需要一些特别的设置

创建一个文件比如cf-realip,内容如下

Cloudflare
 - IPv4
 set_real_ip_from 173.245.48.0/20;
 set_real_ip_from 103.21.244.0/22;
 set_real_ip_from 103.22.200.0/22;
 set_real_ip_from 103.31.4.0/22;
 set_real_ip_from 141.101.64.0/18;
 set_real_ip_from 108.162.192.0/18;
 set_real_ip_from 190.93.240.0/20;
 set_real_ip_from 188.114.96.0/20;
 set_real_ip_from 197.234.240.0/22;
 set_real_ip_from 198.41.128.0/17;
 set_real_ip_from 162.158.0.0/15;
 set_real_ip_from 104.16.0.0/12;
 set_real_ip_from 172.64.0.0/13;
 set_real_ip_from 131.0.72.0/22;
 - IPv6
 set_real_ip_from 2400:cb00::/32;
 set_real_ip_from 2606:4700::/32;
 set_real_ip_from 2803:f800::/32;
 set_real_ip_from 2405:b500::/32;
 set_real_ip_from 2405:8100::/32;
 set_real_ip_from 2a06:98c0::/29;
 set_real_ip_from 2c0f:f248::/32;
 real_ip_header CF-Connecting-IP;

创建一个文件比如cf-ip-map,内容如下

 - IPv4
 173.245.48.0/20    1;
 103.21.244.0/22    1;
 103.22.200.0/22    1;
 103.31.4.0/22    1;
 141.101.64.0/18    1;
 108.162.192.0/18    1;
 190.93.240.0/20    1;
 188.114.96.0/20    1;
 197.234.240.0/22    1;
 198.41.128.0/17    1;
 162.158.0.0/15    1;
 104.16.0.0/12    1;
 172.64.0.0/13    1;
 131.0.72.0/22    1;
 - IPv6
 2400:cb00::/32    1;
 2606:4700::/32    1;
 2803:f800::/32    1;
 2405:b500::/32    1;
 2405:8100::/32    1;
 2a06:98c0::/29    1;
 2c0f:f248::/32    1;

之后在nginx.conf的http区块加上这段内容

geo $realip_remote_addr $cloudflare_ip {
     default          0;
     include          cf-map;
}


之后在你的配置文件当中,比如blog.conf的server区块加入如下内容

if ($cloudflare_ip != 1) {
     return 403;
     }
include cf-realip;

就可以实现屏蔽非cf流量的同时记录访客真实ip了

自动开启5S盾

https://github.com/AlexxSST/cf-auto-uam

我用的是这个脚本,按照要求填好api、email、zone id就好
同时verynginx限制一下单ip的请求速率

总结

其实要保护网站ip不泄露有点难,因此我们更多的是做好别人知道你源站ip之后,你又该如何防护。
单靠一个verynginx不是特别靠谱,一个是手动,另外一个是限制请求频率有的时候感觉有点鸡肋,别人要搞你肯定不是一台服务器,可能成千上万台肉鸡,这时网站肯定瞬间就炸了,只能等5S盾安排上,才能降下来。
如果别人肯花成本过验证,那么此时可以在cloudflare配置一个规则,非特定地区一律返回403禁止访问,这样可以在不影响搜索引擎的同时保证网站的正常运行,当然静态程序的话,感觉不怕cc

再推荐一个屏蔽规则: cloudflare-block-bad-bot-ruleset

总共人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?


文章版权归原作者所有 | 本站默认采用 CC-BY-NC-SA 4.0协议进行授权|
转载请务必注明原作者及本文原始地址:
https://blog.hibobmaster.com/website-protection/
喜欢 (0)
分享:-)
关于作者:
人生如音乐,欢乐且自由
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                       

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)