目录
配置防护站点
界面操作
如何配置域名、端口、上游服务器
工作原理
在单独设备上部署雷池(推荐)
直接在网站服务器上部署雷池
和其他反代设备一起部署的情况
配置后网站无法访问,如何排查
测试防护效果
确认网站可以正常访问
尝试手动模拟攻击
自动化测试防护效果
下载测试工具
准备测试样本
开始测试
测试效果展示
升级雷池
在线升级
离线镜像
上节我们降了WAF的注册和登录,现在我们继续深入了解。
配置防护站点
界面操作
添加后,在客户端执行 curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口>
,若能获取到业务网站的响应,并且站点上 “今日访问量” 增加,则代表配置成功。
如何配置域名、端口、上游服务器
工作原理
雷池社区版主要以 反向代理 的方式工作,类似于一台 nginx 服务。部署时,需要让网站流量先抵达雷池,经过雷池检测和过滤后,再转给原来的网站业务。
如果你不了解反向代理的工作原理,可以通过以下几种雷池常见的工作场景,来了解如何配置站点。
假设你的网站域名为 example.com
,如图:
在单独设备上部署雷池(推荐)
如果你可以提供一台独立设备部署雷池,那么你需要:
- 将网站流量指向雷池。例如将域名解析到雷池
- 禁止网站服务器上,所有除了雷池之外的访问。例如配置防火墙,或者直接把网站服务器放到内网
效果大致如下:
雷池上相应的站点配置为:
- 域名:公网域名
example.com
- 端口:80 或 443/ssl
- 上游服务器:网站服务器的地址
http://192.168.10.10
直接在网站服务器上部署雷池
提示:不建议这样部署,因为这样单机的负载更高、设备宕机的概率更大。非纯净的环境还会提高安装失败的概率,故障排查也会比较困难。
如果能接受这些风险,雷池也可以直接部署在网站服务器上。你需要:
- 将原本监听 80 或 443/ssl 端口的网站服务改到其他端口,让雷池监听设备的 80 或 443/ssl 端口
- 使网站服务仅允许本机访问。例如配置系统防火墙、Iptables
效果大致如图:
此时雷池上的站点配置为:
- 域名:公网域名
example.com
- 端口:80 或 443/ssl
- 上游服务器:
http://127.0.0.1:<网站服务改后的端口>
和其他反代设备一起部署的情况
雷池作为反代设备,可以在任意位置接入主链路。只要将接入位置的流量指向雷池,并在雷池的 “上游服务器” 处填写请求的下一跳服务器地址即可。例如:
配置后网站无法访问,如何排查
如果按照上文指引部署雷池、配置了站点,但网站仍无法访问,建议按照以下步骤排查:
-
明确 “网站无法访问” 的具体表现:
-
如果
502 Bad Gateway tengine
:大概率是是雷池的上游服务器配置不正确,或者雷池无法访问到上游服务器。请继续按下面步骤排查,重点排查步骤 6、7
-
如果请求能够返回但是十分缓慢
- 首先确认服务器负载是否正常
- 在客户端执行命令,检查雷池服务器与上游服务器的网络:
curl -H "Host: <SafeLine-IP>" -vv -o /dev/null -s -w 'time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n' http://<上游服务器地址>
- 如果 time_namelookup 时间过大,请检查 dns server 配置
- 如果 time_connect 时间过大,请检查雷池与上游服务器之间的网络状态
- 如果 time_starttransfer 时间过大,请检查上游服务器状态,是否出现资源过载情况
-
如果不是以上情况,继续下一步
-
-
在客户端执行
curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口>
。正常情况下,应能获取到业务网站的响应,并且站点的 “今日访问量” +1- 如果浏览器无法访问,但这一步正常获取到响应,大概率是因为:
- 测试过程中,网站域名还没有切到雷池,浏览器测试时访问的是
http(s)://<雷池 IP>
,恰好业务服务上有 Host 验证,所以拒绝了该请求。这种情况需要修改本机 host,把域名解析到雷池 IP,再访问http(s)://<域名>
,才能准确测试 - 网站业务做了其他一些特殊处理。例如访问后 301 跳转到了其他地址,需要具体排查网站业务的响应内容
- 测试过程中,网站域名还没有切到雷池,浏览器测试时访问的是
- 如果不能获取到响应,继续下一步
- 如果浏览器无法访问,但这一步正常获取到响应,大概率是因为:
-
在雷池设备上执行
curl -H "Host: <域名>" http://<雷池 IP>:<雷池监听端口>
。正常情况下,应能获取到业务网站的响应,并且站点上 “今日访问量” +1- 如果步骤 2 失败而这里成功,说明客户端到雷池之间的网络存在问题。请排查网络,保证客户端可访问到雷池
- 如果不能获取到响应,继续下一步
-
在雷池设备上执行
curl -H "Host: <域名>" http://127.0.0.1:<雷池监听端口>
。正常情况下,应能获取到业务网站的响应,并且站点的 “今日访问量” +1- 如果步骤 3 失败而这里成功,且
telnet <雷池 IP> <雷池监听端口>
返回Unable to connect to remote host: Connection refused
,大概率是被雷池设备上的防火墙拦截了。可能是操作系统本身的防火墙,还有可能是云服务商的防火墙。请根据实际情况逐项排查,开放雷池监听端口的访问 - 如果不能获取到响应,继续下一步
- 如果步骤 3 失败而这里成功,且
-
在雷池设备上执行
netstat -anp | grep <雷池监听端口>
确认端口监听情况。正常情况下,应该有一个 nginx 进程监听在0.0.0.0:<雷池监听端口>
。没有的话请通过社群或者 Github issue 提交反馈,附上排查过程。有的话继续下一步 -
在雷池设备上
curl -H "Host: <域名>" <上游服务器地址>
。正常情况下,应能获取到业务网站的响应- 如果步骤 4 失败而这里成功,请通过社群或者 Github issue 提交反馈,附上排查过程
- 如果这步失败,说明雷池和上游服务器之间的网络存在问题。请排查网络,确保雷池可以访问到上游服务器
测试防护效果
确认网站可以正常访问
根据雷池 WAF 配置的网站参数访问你的网站。
打开浏览器访问 http://<IP或域名>:<端口>/
。
网站协议默认是 http,勾选 ssl 则为 https
主机名可以是雷池的 IP,也可以是网站的域名(确保域名已经解析到雷池)
端口是你在雷池页面中配置的网站端口
若网站访问不正常,请参考 网站无法访问。
尝试手动模拟攻击
打开浏览器,访问以下地址即可模拟出对应的攻击:
- 模拟 SQL 注入,请访问
http://<IP或域名>:<端口>/?id=1%20AND%201=1
- 模拟 XSS,请访问
http://<IP或域名>:<端口>/?html=<script>alert(1)</script>
通过浏览器,你将会看到雷池已经发现并阻断了攻击请求。
若请求没有被阻断,请参考 防护不生效
自动化测试防护效果
两条请求当然无法完整的测试雷池的防护效果,可以使用 blazehttp 自动化工具进行批量测试
下载测试工具
- Windows 版本
- Mac 版本(x64)
- Mac 版本(M1)
- Linux 版本(x64)
- Linux 版本(ARM)
- 源码仓库
准备测试样本
- 测试样本
下载请求样本后解压到 testcases
目录
开始测试
- 将测试工具
blazehttp
和测试样本testcases
放在同一个目录下 - 进入对应的目录
- 使用以下请求开始测试
./blazehttp -t http://<IP或域名>:<端口>
测试效果展示
# 测试请求
.//blazehttp -t http://127.0.0.1:8008
sending 100% |█████████████████████████████████████████████████████████| (33669/33669, 940 it/s) [35s:0s]
总样本数量: 33669 成功: 33669 错误: 0
检出率: 71.65% (恶意样本总数: 575 , 正确拦截: 412 , 漏报放行: 163)
误报率: 0.07% (正常样本总数: 33094 , 正确放行: 33071 , 误报拦截: 23)
准确率: 99.45% (正确拦截 + 正确放行)/样本总数
平均耗时: 1.00毫秒
升级雷池
注意: 升级雷池时服务会重启,流量会中断一小段时间,根据业务情况选择合适的时间来执行升级操作。
在线升级
执行以下命令即可进行升级。
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/upgrade.sh)"
[可选] 升级成功后,可以执行以下命令删除旧版本 Docke 镜像,以释放磁盘空间。
docker rmi $(docker images | grep "safeline" | grep "none" | awk '{print $3}')
有部分环境的默认 SafeLine 安装路径是在
/data/safeline-ce
,安装之后可能会发现需要重新绑定 OTP、配置丢失等情况,可以修改 .env 的SAFELINE_DIR
变量,指向/data/safeline-ce
离线镜像
适用于 docker hub 拉取镜像失败的场景,手动更新镜像。
# cd /path/to/safeline
mv compose.yaml compose.yaml.old
wget "https://waf-ce.chaitin.cn/release/latest/compose.yaml" --no-check-certificate -O compose.yaml
wget "https://waf-ce.chaitin.cn/release/latest/seccomp.json" --no-check-certificate -O seccomp.json
sed -i "s/IMAGE_TAG=.*/IMAGE_TAG=latest/g" ".env"
grep "SAFELINE_DIR" ".env" > /dev/null || echo "SAFELINE_DIR=$(pwd)" >> ".env"
grep "IMAGE_TAG" ".env" > /dev/null || echo "IMAGE_TAG=latest" >> ".env"
grep "MGT_PORT" ".env" > /dev/null || echo "MGT_PORT=9443" >> ".env"
grep "POSTGRES_PASSWORD" ".env" > /dev/null || echo "POSTGRES_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> ".env"
grep "REDIS_PASSWORD" ".env" > /dev/null || echo "REDIS_PASSWORD=$(LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 32)" >> ".env"
grep "SUBNET_PREFIX" ".env" > /dev/null || echo "SUBNET_PREFIX=172.22.222" >> ".env"
下载 雷池社区版镜像包 并传输到需要安装雷池的服务器上,执行以下命令加载镜像
docker load -i image.tar.gz
执行以下命令替换 Docker 容器
docker compose down
docker compose up -d
OK,你已经完成了升级