📝 FRP 后端无法获取请求者真实 IP?别慌,解决方案来啦!
🧐 问题背景
当你使用 FRP 进行内网穿透或代理服务时,是否遇到过这样的困扰:
后端服务拿到的客户端 IP 全都是 FRP 服务器的地址,而不是用户的真实 IP?
别担心,这是 FRP 代理场景下的常见问题,但 FRP 早已为我们准备了两种优雅的解决方案!
🛠️ 解决方案一:HTTP X-Forwarded-For
如果你使用的是 HTTP 类型代理,或是启用了 https2http、https2https 插件,那么恭喜你,这是最简单的方式!
- ✅ 默认启用,无需额外配置
- ✅ 通过 HTTP Header 中的
X-Forwarded-For字段获取真实 IP
你的后端服务只需要从 X-Forwarded-For 中读取值,就能轻松拿到用户的真实 IP 地址!
🚀 解决方案二:Proxy Protocol(推荐)
如果你的服务不仅仅是 HTTP,还包含 TCP、HTTPS 甚至 UDP,那么 Proxy Protocol 就是你的救星!
什么是 Proxy Protocol?
简单来说,它是 FRP 与本地服务建立连接时,先发送的一段包含真实客户端 IP 的协议数据。只要你的后端服务支持解析这个协议,就能拿到真实 IP!
如何启用?
1. 在 FRP 客户端配置中开启:
# frpc.toml - HTTPS 示例
[[proxies]]
name = "web"
type = "https"
localPort = 443
customDomains = ["test.yourdomain.com"]
# 关键配置:开启 Proxy Protocol
transport.proxyProtocolVersion = "v2"
# frpc.toml - UDP 示例
[[proxies]]
name = "dns"
type = "udp"
localIP = "127.0.0.1"
localPort = 53
remotePort = 6000
# 启用 UDP 的 Proxy Protocol
transport.proxyProtocolVersion = "v2"
2. 后端服务配置(以 Nginx 为例):
在 Nginx 的 server 配置中启用 Proxy Protocol 解析:
server {
listen 443 ssl proxy_protocol; # 关键:添加 proxy_protocol
server_name test.yourdomain.com;
# 将 Proxy Protocol 中的 IP 设置到 X-Real-IP Header
real_ip_header proxy_protocol;
set_real_ip_from 127.0.0.1; # 你的 frpc 地址
location / {
# 现在你的应用可以通过 X-Real-IP 获取真实 IP 了!
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_pass http://localhost:8080;
}
}
💡 为什么推荐 Proxy Protocol?
- ✅ 支持所有 TCP/UDP 协议,不限于 HTTP
- ✅ 安全可靠,IP 信息在建立连接时就传递
- ✅ 广泛支持:Nginx、HAProxy 等主流服务都完美兼容
- ✅ UDP 也支持!DNS 等 UDP 服务也能获取真实客户端 IP
🎯 总结对比
| 方案 | 适用场景 | 配置难度 | 支持协议 |
|---|---|---|---|
| X-Forwarded-For | HTTP 代理 | ⭐⭐ | HTTP/HTTPS |
| Proxy Protocol | 所有 TCP/UDP 代理 | ⭐⭐⭐ | TCP/HTTPS/UDP |
💫 最后的小贴士
- Proxy Protocol 有两个版本:v1 和 v2,建议使用 v2,更高效更安全
- 确保后端服务支持:在配置前确认你的 Nginx、HAProxy 或其他服务开启了 Proxy Protocol 解析能力
- 测试验证:配置完成后,记得通过访问测试验证是否能正确获取真实 IP
现在,再也不用为 FRP 后端拿不到真实 IP 而发愁啦!🎉
希望这篇文档能帮你顺利解决问题,如果有任何疑问,欢迎继续探讨!😊
注: 内容由AI润色!
浙公网安备 33010602011771号