笔者在内网部署了一个可道云系统,依赖于 nginx+php。为了让笔者在外网也可以通过自己手机的app连接这个可道云系统,笔者购买了一个有固定IP公网地址的服务器,操作系统是 Ubuntu Server,然后使用 frp 程序实现内网穿透功能,从而可以在外网通过app和指定的端口访问可道云系统。
但既然外网可访问,难免会遇到一些端口扫描和非法访问,因此,有必要经常查看访问日志,从访问日志中筛选一些异常记录并且及时处理发现的问题。不过在一般情况下,内网中的nginx日志记录,对于从frp服务转发而来的访问(尤其是代理type = “tcp”的),访客IP地址可能会显示“127.0.0.1”(如下图),而不是显示访客实际所使用的公网IP。那么有没有办法让nginx日志中显示访客实际的公网IP呢?答案是可以的,具体的实现过程如下(以 frp 0.68.1 为例):

1、修改客户端 frpc 的配置文件(本文假设文件是 /etc/frp/frpc.toml),在可道云系统所对应的代理配置中,添加一行:
transport.proxyProtocolVersion = "v2"
比如,如果之前的配置是这样的话:
[[proxies]]
name = "kodbox"
type = "tcp"
localIP = "127.0.0.1"
localPort = 12345
remotePort = 12345
那么添加后就是:
[[proxies]]
name = "kodbox"
type = "tcp"
localIP = "127.0.0.1"
localPort = 12345
remotePort = 12345
transport.proxyProtocolVersion = "v2"
随后保存退出,并且重启 frpc 服务(假如服务名是frpc的,那么就是执行 sudo systemctl restart frpc)。
2、编辑可道云系统相关的 nginx 文件,在可道云相关的“server”配置中,在 listen 端口号 后面加上“proxy_protocol”,并且加上下面配置:
set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
real_ip_recursive on;
举例,假设原来nginx相关的配置内容如下:
server
{
listen 12345 ssl;
http2 on;
server_name nas.kodbox.local;
index index.php index.html index.htm default.php default.htm default.html;
root /www/web/kodbox;
#后续配置忽略
修改后的配置就是
server
{
listen 12345 ssl proxy_protocol ;
http2 on;
server_name nas.kodbox.local;
index index.php index.html index.htm default.php default.htm default.html;
root /www/web/kodbox;
set_real_ip_from 0.0.0.0/0;
real_ip_header proxy_protocol;
real_ip_recursive on;
#后续配置忽略
修改后保存,并且重载nginx服务(执行 nginx -s reload)
相关说明:
1、frpc配置文件加上的“transport.proxyProtocolVersion = “v2” ”:这是 frp 客户端侧开启 Proxy Protocol 的开关,告诉 frp 在转发流量时,在最前面加上一段包含真实 IP 的”头信息”。
2、nginx配置文件内,listen 12345 ssl proxy_protocol 中“ proxy_protocol ”的作用:在指定端口(如本例的12345)上接收 HTTPS (如果不带ssl则是HTTP)连接,并且这个连接的前面会附带一个 Proxy Protocol 头部,请解析它来获取真实 IP。
3、set_real_ip_from 0.0.0.0/0 作用:指定哪些来源的连接是”可信任的代理服务器”。
4、real_ip_header proxy_protocol 作用:告诉 Nginx 从哪里获取真实 IP。
5、real_ip_recursive on 作用:处理多层代理的情况,从 IP 链中找出真正的原始 IP。
另外,需要注意的是,目前 QUIC 协议和 Proxy Protocol 不兼容,如果 nginx 启用了 HTTP3 和 QUIC 协议,在做以上的配置的时候,nginx 会报错,如果要使用 HTTP3 和 QUIC 协议,另加启用 Proxy Protocol 选项的,只能等待 nginx 后续的版本,看看会不会加上支持了。
以下是配置生效之后的效果截图:

下面是可道云后台的登录记录,可以看到,在做上述修改之前,可道云的“登录地址”中显示的地址一致都是“内网IP”(127.0.0.1),修改生效后,可以正常显示访问者的公网IP了。

2026年5月22日更新:后来在内网访问遇到了一些问题,详情可以查看《内网访问报错 broken header?Nginx + frp 双端口配置完美解决真实IP获取问题》
