在 frp 后部署 nginx 并获取访客真实 IP

最近家里路由器的端口转发和群晖的 DDNS 不知道什么原因无法正常工作了,才尝试使用 frp 这种内网穿透工具。不用不知道,用了才知道:真香。遂购置一台服务器供家庭服务使用。首先就是将网站从云上迁移到家庭服务器上。

常规的数据迁移因为已经操作过已经无数次了,比较顺利。遇到的第一个问题是 frpc 的配置,配置了多个 Web 服务,一开始没效果,无法访问。后面发现 frpc 的服务没起来,以为是配置改错了。又尝试改代理类型为 tcp、tcpmux 等,始终无法运行。想尝试直接使用 frpc -c frpc.ini 的时候,发现找不到 frpc 了。联想起下载的时候就报病毒,去 Windows Defender 中一看,果然是被当作病毒删除了。恢复起来之后,再使用 http 和 https 类型,发现与预期一致,能正常的支持同端口多个域名的代理,就像 nginx 那样。

搭好网站后,观察日志,发现日志记录的访客 ip 都是 frpc 所在的机器地址(我的 frpc 和 nginx 不是同一台 vm),这样不太合适。所以尝试如何将访客的 ip 透过 frp 传递给 nginx。一番搜索和尝试之后发现很简单。

  1. 在 frpc.ini 中的 Web 服务段配置。示例:
# frpc.ini
[web]
type = https
local_port = 443
custom_domains = test.yourdomain.com 

# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。 
proxy_protocol_version = v2
  1. 在 nginx 的 server 配置文件中增加配置。示例:
listen 80 proxy_protocol;
listen 443 ssl http2 proxy_protocol;

#set_real_ip_from 设置为 frpc 的 ip 地址,本机则为:127.0.0.1
set_real_ip_from 192.168.1.0/24;
real_ip_header proxy_protocol;

这样配置后,重启 nginx,即可获得 frp 转发的访客真实 ip。

发表评论

邮箱地址不会被公开。 必填项已用*标注