查询FRP官方文档可知:
frp 支持通过
Proxy Protocol协议来传递经过 frp 代理的请求的真实 IP,此功能支持所有以 TCP 为底层协议的类型,不支持 UDP。
Proxy Protocol功能启用后,frpc 在和本地服务建立连接后,会先发送一段Proxy Protocol的协议内容给本地服务,本地服务通过解析这一内容可以获得访问用户的真实 IP。所以不仅仅是 HTTP 服务,任何的 TCP 服务,只要支持这一协议,都可以获得用户的真实 IP 地址。需要注意的是,在代理配置中如果要启用此功能,需要本地的服务能够支持
Proxy Protocol这一协议,目前 Nginx 和 haproxy 都能够很好的支持。这里以 HTTPS 类型为例:
# 使用较新版本的 FRPC 的 frpc.toml 文件配置部分示例。 [[proxies]] name = "web" type = "https" localIP = "127.0.0.1" localPort = 443 customDomains = ["test.yourdomain.com"] # 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。 transport.proxyProtocolVersion = "v2"# 使用较老版本的 FRPC 的 frpc.ini 文件配置部分示例。 [proxies_web] type = https local_ip = 127.0.0.1 local_port = 443 custom_domains = test.yourdomain.com # 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。 proxy_protocol_version = v2只需要在代理配置中增加一行
transport.proxyProtocolVersion = "v2"(老版本为proxy_protocol_version = v2)即可开启此功能。本地的 HTTPS 服务可以通过在 Nginx 的配置中启用
Proxy Protocol的解析并将结果设置在X-Real-IP这个 Header 中就可以在自己的 Web 服务中通过X-Real-IP获取到用户的真实 IP。
如果使用FRP来暴露本地Alist服务,且隧道类型是TCP的情况下利用Nginx和 Proxy Protocol协议获取用户真实IP的配置文件示例:
#由于官方的 Alist 配置文件内容很长,在这里只显示部分配置数据,且以 3.36.0 版本为例。
"site_url": "https://test.yourdomain.com:your_site_url_port",#配置文件第3行,注意!请替换你的 your_site_url_port 为你希望用户访问的外部端口号。
"address": "127.0.0.1",#配置文件第25行。
"http_port": your_http_port,#配置文件第26行,注意!请替换你的 your_http_port 为你本地 Alist 服务暴露的端口号。
"https_port": -1,#配置文件第27行。
"force_https": false,#配置文件第28行。
# 使用较新版本 FRPC 的部分 frpc.toml 配置示例。
[[proxies]]
name = "fileserver1"
type = "tcp"
localIP = "127.0.0.1"
localPort = your_site_url_port#注意!请替换你的 your_site_url_port 为你希望用户访问的外部端口号。
remotePort = your_site_url_port
transport.proxyProtocolVersion = "v2"
# 使用较老版本 FRPC 的部分 frpc.ini 配置示例。
[fileserver1]
type = tcp
local_ip = 127.0.0.1
local_port = your_site_url_port#注意!请替换你的 your_site_url_port 为你希望用户访问的外部端口号。
remote_port = your_site_url_port
proxy_protocol_version = v2
#Nginx 1.27.3 Windows版本配置文件示例
worker_processes 1;
events {
worker_connections 32;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen your_site_url_port ssl proxy_protocol;
#注意!请替换你的 your_site_url_port 为你希望用户访问的外部端口号。
server_name test.yourdomain.com;
ssl_certificate test.yourdomain.com.pem;
ssl_certificate_key test.yourdomain.com.key;
#证书文件地址
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
real_ip_recursive on;
location / {
proxy_ssl_server_name on;
proxy_ssl_name $host;
proxy_pass http://127.0.0.1:your_http_port;
#注意!请替换你的 your_http_port 为你本地 Alist 服务暴露的端口号。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置完成并保存后,运行程序,如果您使用的操作系统是Windows,可运行 start powershell Get-Content log.log -Wait -Encoding UTF8命令(其中,log.log是您的 Alist 的日志文件地址),实时查看日志并检查配置文件是否生效。

参考资料:
https://alist.nn.ci/zh/config/configuration.html
https://gofrp.org/zh-cn/docs/features/common/realip/
https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/