在使用雷池(LaiChi)和 FRP(Fast Reverse Proxy)进行代理时,如果需要实现真实 IP 的透传,可以通过启用 proxy_protocol
来完成。proxy_protocol
允许代理服务器在与后端服务通信时,将客户端的原始 IP 地址传递给后端。下面是实现这一功能的详细步骤。
1. 什么是 Proxy Protocol?
Proxy Protocol 是由 HAProxy 引入的一种协议,用于在代理与后端服务器之间传递客户端的真实 IP 地址。它会在 TCP 连接的起始部分插入一个包含原始客户端 IP 和端口的报头。后端服务器读取这个报头,就能获取到客户端的真实 IP,而不是代理服务器的 IP。
2. FRP 支持 Proxy Protocol
FRP 支持通过 proxy_protocol
选项启用 Proxy Protocol,这样 FRP 就能将客户端的原始 IP 地址传递给后端服务器。
FRP 的配置主要分为两部分:
- frps(FRP 服务端)配置
- frpc(FRP 客户端)配置
3. 雷池和 FRP 配置 Proxy Protocol
3.1 FRP 服务端配置(frps.ini)
在 FRP 服务端配置中,启用 proxy_protocol_version
参数,指定代理协议版本为 v1
或 v2
,这是 Proxy Protocol 的版本。
frps.ini
示例:
[common]
bind_port = 7000
# 开启 proxy_protocol
proxy_protocol_version = v1
如果你有多个服务监听不同的端口,你也可以为不同的服务单独启用 Proxy Protocol。
例如:
[common]
bind_port = 7000
# 针对 http 和 tcp 服务分别设置 proxy_protocol
[http]
bind_port = 8080
proxy_protocol_version = v1
[tcp]
bind_port = 9000
proxy_protocol_version = v2
3.2 FRP 客户端配置(frpc.ini)
客户端不需要做特别的 Proxy Protocol 配置,只需正常配置即可,像下面这样:
frpc.ini
示例:
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
remote_port = 8080
[ssh]
type = tcp
local_port = 22
remote_port = 9000
这里 local_port
指向的是你客户端的本地服务,remote_port
是在 FRP 服务端暴露的端口。
3.3 雷池 (LaiChi) 的配置
雷池是一个高性能的 L4 代理(Layer 4 Proxy),用于传输 TCP/UDP 流量。要在雷池中启用 Proxy Protocol,需要在对应的监听配置中启用 proxy_protocol
。
你可以在雷池的 lai.conf
中添加如下配置:
server {
listen 8080;
proxy_protocol on;
# 指定后端服务地址
proxy_pass 127.0.0.1:8081;
}
其中:
listen 8080;
表示监听 8080 端口。proxy_protocol on;
启用 Proxy Protocol 功能,允许将真实 IP 透传到后端。proxy_pass 127.0.0.1:8081;
表示将流量转发给本地的 8081 端口。
4. 后端服务配置
要正确处理 Proxy Protocol,后端服务也需要能够识别和处理该协议。许多常见的服务(例如 NGINX、HAProxy)都支持 Proxy Protocol。
4.1 NGINX 后端配置
如果后端服务是 NGINX,则需要启用 Proxy Protocol:
server {
listen 8081 proxy_protocol;
location / {
proxy_pass http://localhost:8080;
real_ip_header proxy_protocol;
set_real_ip_from 0.0.0.0/0;
}
}
listen 8081 proxy_protocol;
启用 Proxy Protocol 监听。real_ip_header proxy_protocol;
指定使用 Proxy Protocol 中的真实客户端 IP。
5. 批量配置
如果你有多个服务需要开启 Proxy Protocol,可以通过配置模板或者脚本化的方式批量修改 frps.ini
和雷池的 lai.conf
,从而实现批量处理。
批量配置示例(简单 Shell 脚本):
你可以编写一个简单的脚本来自动为多个服务添加 Proxy Protocol 支持。
#!/bin/bash
services=("http" "tcp" "udp")
ports=("8080" "9000" "10000")
# 生成 frps.ini 配置
for i in "${!services[@]}"; do
echo "[${services[$i]}]" >> frps.ini
echo "bind_port = ${ports[$i]}" >> frps.ini
echo "proxy_protocol_version = v1" >> frps.ini
done
# 生成 lai.conf 配置
for i in "${!ports[@]}"; do
echo "server {" >> lai.conf
echo " listen ${ports[$i]};" >> lai.conf
echo " proxy_protocol on;" >> lai.conf
echo " proxy_pass 127.0.0.1:${ports[$i]};" >> lai.conf
echo "}" >> lai.conf
done
这个脚本会根据你定义的 services
和 ports
列表,批量生成对应的 FRP 和雷池的配置。
6. 验证 Proxy Protocol 是否生效
你可以通过后端服务的日志来验证真实 IP 是否透传。比如,在 NGINX 日志中,可以查看客户端 IP 是否已经由 Proxy Protocol 透传成功。
检查客户端 IP
tail -f /var/log/nginx/access.log
你应该能看到真实的客户端 IP 地址,而不是代理服务器的 IP。
总结
通过在雷池和 FRP 中启用 proxy_protocol
,可以实现客户端真实 IP 的透传。配置包括以下几个关键步骤:
- 在 FRP 服务端配置中启用
proxy_protocol_version
。 - 在雷池(LaiChi)中启用
proxy_protocol
。 - 确保后端服务(例如 NGINX)支持并处理 Proxy Protocol。
- 如果有多个服务,可以通过脚本批量生成配置文件。
这些步骤可以帮助你在使用代理的场景中保留客户端的真实 IP 信息。