frp是一款内网穿透神器,但往往是通过 frp穿透获取到的IP都是 frp客服端内网IP,通过查看文档 frp 支持通过 Proxy Protocol 协议来传递经过 frp 代理的请求的真实 IP,今天就介绍一下frp如何向 nginx 传递用户真实 IP
一、frp启用Proxy Protocol 功能
找到frpc配置文件,只需要在代理配置中增加一行
proxy_protocol_version = v2
即可开启此功能。这里以 https 类型为例:
# frpc.ini [web] type = https local_port = 443 custom_domains = test.yourdomain.com # 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。 proxy_protocol_version = v2
我这里frp客服端是集成在Openwrt里的,只需配置Proxy-Protocol 版本时选择到v2即可。
二、 配置nginx
在listen段添加 proxy_protocol,然后配置 real IP header 为 proxy_protocol,例如:
server { listen 80 proxy_protocol; listen 443 ssl http2 proxy_protocol; real_ip_header proxy_protocol; real_ip_recursive on; set_real_ip_from 192.168.2.1;
其中set_real_ip_from 的参数为frp客服端的内网IP。
保存 Nginx 配置后,重启 Nginx,就可以获取用户真实 IP了。
重启 Nginx命令:service nginx restart
三、坑在最后
对于Nginx来说listen段中的proxy_protocol配置是针对监听端口生效的,所以虽然是在server的listen段中配置,实际上对于端口来说算是全局配置。所以对于同一个Nginx上如果有部分server需要代理协议,部分server不需要代理协议,他们所监听的端口一定要分开。