![「日志记录」雷池WAF+FRP内网穿透折腾日记插图 「日志记录」雷池WAF+FRP内网穿透折腾日记插图](https://blog.eswlnk.com/wp-content/uploads/wpcy/ecd59c3981ab0e4a8e91485b23023510.jpg)
最近在闲鱼上淘了一个Intel NUC,配置8+256,所以就把之前小主机上的内容搬迁到了这款NUC上。而之前的小主机我就安装了雷池WAF作为防火墙使用。
前提
本文的服务器部署方式如下图所示:
关于雷池
雷池WAF是由长亭科技开发的一款网络安全产品。它的主要功能是实时监测和分析进出你网站的所有流量,迅速识别并阻止恶意攻击。这就像你家门口装了一个智能安保系统,不管是什么样的“坏人”,它都能在第一时间发现并阻止。
雷池WAF:https://waf-ce.chaitin.cn/
复制以下命令执行,即可完成安装
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
如果需要使用华为云加速,可使用
CDN=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
如果需要安装最新版本流式检测模式,可使用
STREAM=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
站点添加
在主机上安装好雷池WAF后,进入WAF的管理界面,例如我这里是:
https://192.168.1.102:9443/dashboard
代理设置页面记得设置源IP的获取方式:
![「日志记录」雷池WAF+FRP内网穿透折腾日记插图3 「日志记录」雷池WAF+FRP内网穿透折腾日记插图3](https://static.eswlnk.com/2024/05/20240529191259897-1024x467.png-esw)
内网穿透
FRP官网:https://gofrp.org/zh-cn/
或者自己在GITHUB上找找一键部署的脚本,这里就各位自己去找找了。
注意,在配置文件中记得加以下:
proxy_protocol_version = v2
通过这个proxy_protocol
协议,将远程IP以及详细信息反馈给雷池。
注意事项及脚本
由于雷池WAF的nginx是不支持proxy_protocol
这个协议,并且每次在添加站点或者在健康检测的时候会重写相关的配置文件,所以这里我编写了以下脚本。
注意,使用默认的在线安装脚本,站点配置文件默认保存在以下目录:
/data/safeline/resources/nginx/sites-enabled
将脚本保存到这个目录执行就可以了。
unlock.sh
#!/bin/bash
# 恢复文件内容,移除 `proxy_protocol` 和在 `gateway_timeout_page;` 下一行的 4 行内容:
# \n```
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from 10.0.0.0/8;
# real_ip_recursive on;
# real_ip_header proxy_protocol;
# ```
find ./ -name "IF_backend_*" | while read filename; do
if grep -q "proxy_protocol" "$filename"; then
# 解锁
chattr -i "$filename"
# 移除所有 listen 语句中的 proxy_protocol
sed -i '/listen.*proxy_protocol;/s/ proxy_protocol//' "$filename"
# 移除在 gateway_timeout_page; 后添加的新的配置
sed -i '/gateway_timeout_page;/,/^$/{
/gateway_timeout_page;/!{
/set_real_ip_from 127.0.0.1;/d
/real_ip_recursive on;/d
/real_ip_header proxy_protocol;/d
}
}' "$filename"
else
echo "文件 $filename 未包含 proxy_protocol,无需恢复。"
fi
done
该脚本需要在修改站点(添加站点)配置的时候添加,包括在设置WAF的代理设置的时候,也需要运行。
set_proxy.sh
#!/bin/bash
# 查找所有匹配的文件并处理
find ./ -name "IF_backend_*" | while read filename; do
# 检查文件中是否已经包含 proxy_set_header X-Real-IP
if grep -q "proxy_set_header X-Real-IP" "$filename"; then
echo "文件 $filename 已包含 proxy_set_header X-Real-IP,无需修改。"
else
# 解锁文件
chattr -i "$filename"
# 获取缩进前缀
indent=$(grep -oP '^\s*' "$filename" | grep -m1 '')
sed -i "/proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;/i ${indent}proxy_set_header X-Real-IP \$proxy_protocol_addr;" "$filename"
echo "文件 $filename 已添加 proxy_set_header X-Real-IP $proxy_protocol_addr;"
fi
done
该代码的作用是在所有的雷池站点配置文件中,添加proxy_set_header X-Real-IP $proxy_protocol_addr;
,如果不添加这行header,那么当你的站点使用HTTPS时,WAF无法正常获取从FRP解析过来的IP信息等,所以这行很重要。
大多数网络上的教程都是不使用FRP的HTTPS,而是用Nginx再做一次转发,就很麻烦。
modify.sh
#!/bin/bash
# 修改文件内容在 `listen` 语句后面加上 `proxy_protocol`, 在 `gateway_timeout_page;` 下一行加上 4 行内容:
# \n```
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from 10.0.0.0/8;
# real_ip_recursive on;
# real_ip_header proxy_protocol;
# ```
find ./ -name "IF_backend_*" | while read filename; do
if grep -q "proxy_protocol;" "$filename"; then
echo "文件 $filename 已包含 proxy_protocol,无需修改。"
else
# 解锁
chattr -i "$filename"
# 在所有 listen 语句后面添加 proxy_protocol
sed -i '/listen.*;/s/;/ proxy_protocol;/' "$filename"
# 在 gateway_timeout_page; 后添加新的配置
sed -i '/gateway_timeout_page;/a \
set_real_ip_from 127.0.0.1;\
real_ip_recursive on;\
real_ip_header proxy_protocol;' "$filename"
# 锁定文件
chattr +i "$filename"
fi
done
# 测试 Nginx 配置
docker exec -it safeline-tengine nginx -t
# 重载 Nginx 配置
docker exec -it safeline-tengine nginx -s reload
该脚本在添加完毕或者修改完毕站点配置,以及代理设置完毕后再执行该脚本,目的是增加proxy_protocol
协议透传。
unfile.sh
#!/bin/bash
# 恢复文件内容,移除 `proxy_protocol` 和在 `gateway_timeout_page;` 下一行的 4 行内容:
# \n```
# set_real_ip_from 192.168.0.0/16;
# set_real_ip_from 10.0.0.0/8;
# real_ip_recursive on;
# real_ip_header proxy_protocol;
# ```
find ./ -name "IF_backend_*" | while read filename; do
chattr -i "$filename"
done
该脚本用于当权限出现问题时,解锁所有的配置文件。
相关文件
偷懒的脚本文件在这儿,我已经打包上传到网盘上了。若有问题,请留言反馈。或者右下角联系博主配置。
雷池WAF+FRP配置
帮助配置一次WAF
📮评论