frp内网穿透获取用户真实 IP

2020年12月14日 7855点热度 14人点赞 0条评论

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不需要代理协议,他们所监听的端口一定要分开。

信仰飘扬

行尽天涯 静默山水间