本文最后更新于 2024-09-19,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
前言 {#%E5%89%8D%E8%A8%80}
在网上看了许多关于WAF +FRP +Nginx的方式来保护内网穿透的Web服务,但是在网上搜寻的结果都是将WAF部署在了源站上面,由于我的Web服务都是部署在NAS上面,然后使用Frp来穿透访问的,我认为WAF应该部署在服务器上面比较合适,在服务器上面进行拦截异常访问和攻击,这样能大大降低源站的压力。
本次教程主要讲解雷池WAF 的安装部署过程以及配合FRP 和Nginx 来实现安全可靠的内网穿透,FRP和Nginx的部署教程我在前面的笔记中已经有记录。
我的网站大致的路由拓扑图如下:
简介 {#%E7%AE%80%E4%BB%8B}
雷池WAF(Web Application Firewall)是一款由长亭科技开发的Web应用防火墙,其核心检测能力由智能语义分析算法驱动,旨在为企业级用户提供专业的网络信息安全解决方案。雷池WAF的主要特点包括:
-
防护Web攻击:能够防御SQL注入、XSS、代码注入、命令注入、CRLF注入、LDAP注入、XPath注入、RCE、XXE、SSRF、路径遍历等攻击类型。
-
防爬虫、防扫描:通过人机验证功能,可以识别并放行真人用户的流量,而阻断由自动化程序如爬虫、漏洞扫描器等发起的恶意流量。
-
前端代码动态加密:即使在用户浏览到的网页内容不变的情况下,也能对HTML和JavaScript代码进行动态加密,确保每次访问时代码都以随机且独特的形态呈现。
-
基于源IP的访问速率限制:可以限制用户的访问速率,从而保护Web服务免遭CC攻击、暴力破解、流量激增等攻击。
-
HTTP访问控制:提供基于源IP的访问控制,增强网站的安全性。
雷池WAF的安装和配置相对简单,支持一键安装和容器化管理,适配多种运行环境。它还提供简洁的操作界面,专为社区设计,使得用户能够轻松上手并实现躺平式管理。
此外,雷池WAF还提供了一些高级防护能力,如身份认证功能,可以解决未授权访问的问题;动态防护功能,可以实时分析并拦截恶意流量,并对网页代码进行动态加密保护。
对于希望保护Web应用免受黑客攻击的用户来说,雷池WAF是一个不错的选择。它不仅提供了强大的安全防护功能,还通过智能化的方式简化了安全管理,使得用户可以更加专注于业务本身。
部署 {#%E9%83%A8%E7%BD%B2}
安装FRP {#%E5%AE%89%E8%A3%85frp}
安装FRP的教程请参考【Docker】搭建实用的内网穿透工具 - FRP
需要注意的是
frpc.txt
中的远程端口(remotePort) 需要更换成其他非80
和443
端口。因为80和443端口需要由雷池WAF来进行监听并且做反向代理。
frpc.txt
中的本地端口(localPort) 直接填写你内网Nginx的监听端口,例如80
和443
。
安装Nginx {#%E5%AE%89%E8%A3%85nginx}
安装Nginx的教程请参考【Docker】搭建强大的Nginx可视化配置工具 - nginxWebUI
内网安装Nginx主要用来监听内网的80和443端口来进行反向代理到不同端口下的Web服务。
环境依赖 {#%E7%8E%AF%E5%A2%83%E4%BE%9D%E8%B5%96}
安装雷池前请确保你的系统环境符合以下要求
-
操作系统:Linux
-
CPU 指令架构:x86_64
-
CPU 指令架构:支持 ssse3 指令集
-
软件依赖:Docker 20.10.14 版本以上
-
软件依赖:Docker Compose 2.0.0 版本以上
-
最低资源需求:1 核 CPU / 1 GB 内存 / 5 GB 磁盘
可以根据以下命令来查看相关信息
uname -m # 查看指令架构
cat /proc/cpuinfo| grep "processor" # 查看 CPU 信息
lscpu | grep ssse3 # 确认 CPU 是否支持 ssse3 指令集
docker version # 查看 Docker 版本
docker compose version # 查看 Docker Compose 版本
docker-compose version # 查看老版本 docker-compose 版本
free -h # 查看内存信息
df -h # 查看磁盘信息
安装雷池 {#%E5%AE%89%E8%A3%85%E9%9B%B7%E6%B1%A0}
自动安装 {#%E8%87%AA%E5%8A%A8%E5%AE%89%E8%A3%85}
-
使用你熟悉的ssh工具连接到服务器上,使用 root 权限执行以下命令
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
-
雷池安装目录我直接使用默认的/data/safeline,所以直接回车就行。
-
直接输入y,然后回车继续执行。
手动安装 {#%E6%89%8B%E5%8A%A8%E5%AE%89%E8%A3%85}
请参考官方文档 安装雷池 | 雷池 SafeLine (chaitin.cn)
使用雷池 {#%E4%BD%BF%E7%94%A8%E9%9B%B7%E6%B1%A0}
-
在浏览器中输入服务器
IP:9443
来访问WAF控制台。注意对
9443
的端口打开访问! -
登录的用户名默认是admin,默认的随机密码在终端的控制台中有显示。
-
在"防护站点"中找到"证书管理",点击"添加证书"。
-
目前雷池暂时不支持泛域名的证书申请,如果需要使用泛域名证书,需要通过其他方式申请并在雷池中上传已有证书。
如果需要申请泛域名证书并且实现自动续期SSL证书,请参考【折腾笔记】雷池WAF社区版自动SSL续签。
-
在"防护站点"中找到"站点管理",点击"添加站点"。
-
填写站点信息:①我需要所有站点都经过WAF再进入内网,所以我这里直接用通配符来匹配所有二级域名,请根据自己的情况进行修改。②端口使用默认的
80
和443
即可。③证书选择我们刚刚上传的证书即可。④选择"代理到已有网站"。⑤上游服务器直接填写回环地址https://127.0.0.1:60443
,此处的端口可以根据自己使用穿透的远程端口进行修改,如果上游服务器访问正常,旁边会出现一个绿色的✅图标。⑥点击"提交"即可。需要所有站点都经过WAF的话,域名这一栏中直接填写
*
。 -
在"防护配置"中找到"频率限制",开启"高频访问限制"和"高频攻击限制",其中的参数需要根据你自己的站点访问情况进行修改。如果参数设置的过于严格,容易被误报或者拦截,所以根据自己站点访问情况进行调整一个适中的频率。
-
如果你的在正常访问的网站出现一些异常,大概率是被拦截了,这个时候可以通过在"防护配置"中的"自定义规则"点击"添加"来增加白名单进行过滤。
-
例如你的站点开启了人机验证,网站调用你部署的其他服务API,并且该API也需要经过WAF的话可能会无法正常调用,所以需要增加白名单来过滤。
-
建议在"防护配置"中的"通用配置"内找到"拦截页面"填写"附加说明",当正常用户访问你的站点时,被误判时,用户能够通过附加说明中留下的联系方式与你取得联系。
-
当你完成以上配置以后,在"数据统计"中能够看到请求数和QPS等数据,表明你的配置基本没有什么大问题。
验证雷池的防护效果 {#%E9%AA%8C%E8%AF%81%E9%9B%B7%E6%B1%A0%E7%9A%84%E9%98%B2%E6%8A%A4%E6%95%88%E6%9E%9C}
尝试手动模拟攻击 {#%E5%B0%9D%E8%AF%95%E6%89%8B%E5%8A%A8%E6%A8%A1%E6%8B%9F%E6%94%BB%E5%87%BB}
以 https://blog.uptoz.cn
为例,然后尝试访问来模拟黑客攻击。
用你的网站地址替换下方的
https://blog.uptoz.cn
-
模拟 SQL 注入攻击:https://blog.uptoz.cn/?id=1+and+1=2+union+select+1
-
模拟 XSS 攻击:https://blog.uptoz.cn/?id=<img+src=x+onerror=alert()>
-
模拟 XXE 攻击:https://blog.uptoz.cn/?id=<?xml+version="1.0"?><!DOCTYPE+foo+SYSTEM+"">
不出意外的话,这些攻击都将被雷池拦截,如下图所示。
若攻击没有被拦截,说明你的雷池配置有误。
升级雷池 {#%E5%8D%87%E7%BA%A7%E9%9B%B7%E6%B1%A0}
-
执行以下命令进行升级,升级不会清除历史数据。
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"
如果需要使用华为云加速,可使用
CDN=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"
-
[可选] 执行以下命令删除旧版本 Docker 镜像,释放磁盘空间。
docker rmi $(docker images | grep "safeline" | grep "none" | awk '{print $3}')
较老版本的雷池安装路径在
/data/safeline-ce
,安装之后可能会发现需要重新绑定 OTP、配置丢失等情况,可以修改 .env 的SAFELINE_DIR
变量,指向/data/safeline-ce