雷池+frp 批量设置proxy_protocol实现真实IP透传
需求背景
在内网环境中部署了safeline安全防护系统,希望通过frp实现外网对内部web网站服务的访问,并确保safeline能够记录真实的攻击IP来源。由于safeline和frp都部署在同一台服务器上,我们需要通过配置来实现这一需求。
frp客户端配置
对于frpc(frp客户端),我们只需在https配置上添加transport.proxyProtocolVersion = "v2"
即可实现proxy_protocol的支持。例如:
[[proxies]]
name = "web1"
type = "https"
localIP = "192.168.2.103"
localPort = 443
subdomain = "web1"
transport.proxyProtocolVersion = "v2"
[[proxies]]
name = "web2"
type = "https"
localIP = "192.168.2.103"
localPort = 443
subdomain = "web2"
transport.proxyProtocolVersion = "v2"
保存配置并重启frp服务后,frpc将支持proxy_protocol。
safeline配置
由于safeline不支持通过web界面添加proxy_protocol支持,我们需要直接修改其配置文件。
- 修改
proxy_params
配置文件:
编辑/data/safeline/resources/nginx/proxy_params
文件,全局开启proxy_protocol,并设置set_real_ip_from
为frps服务器的IP地址。例如:
set_real_ip_from 服务器的IP地址;
real_ip_header proxy_protocol;
- 创建
config-proxy_protocol.sh
脚本:
为了批量添加或移除所有站点的proxy_protocol支持,我们创建一个脚本。该脚本会遍历/data/safeline/resources/nginx/sites-enabled
目录下的所有IF_backend文件,并在监听部分添加或移除proxy_protocol支持。
脚本内容如下(请根据实际情况修改主域名和白名单子域名):
#!/bin/bash
# 主域名
main_domain="ttxs.com"
# 白名单子域名列表
whitelist_subdomains=("op1" "op2")
# ...(省略部分代码)
# 主处理逻辑
for file in IF_backend_*; do
[ -f "$file" ] || continue
# ...(省略部分代码)
done
# 测试并重新加载Nginx配置
echo "测试Nginx配置..."
if docker exec safeline-tengine nginx -t; then
echo "重新加载Nginx配置..."
docker exec safeline-tengine nginx -s reload
echo "操作完成"
else
echo "Nginx配置测试失败,未重新加载配置"
exit 1
fi
给脚本添加执行权限后,即可通过传入参数true
或false
来批量添加或移除proxy_protocol支持。
测试与验证
完成上述配置后,访问配置好的域名,检查小地图是否正常显示归属地,以验证配置是否成功。
通过以上步骤,我们实现了在内网部署safeline并通过frp让外网访问内部web网站服务的同时,确保safeline能够记录真实的攻击IP来源。