侧边栏壁纸
博主头像
Matt's Blog

行动起来,活在当下

  • 累计撰写 6 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Frp穿透搭配1Panel导致源IP丢失解决办法

1、背景

在本地服务器部署1panel建站,并通过Frp将本地服务端口穿透至公网是一个不错的服务架构,优点一是只需一个轻量vps作为流量入口,省了不少购买vps的花费。二是降低了服务与vps的耦合,由于vps只部署一个frps,更换vps不需做服务迁移,只需域名解析到新vps,并在新vps上部署frps即可。

2、问题

但在实践中也遇到了一些问题,比如frp导致访问服务请求源IP丢失,原因是本地服务由1Panel管理建站(反代+证书),因此frpc只能选择tcp协议,但tcp协议会丢失http协议的header信息,导致nginx只能拿到frpc的ip,也就是127.0.0.1,这让1Panel的一些限流功能失效。

3、方案

frpc提供了一个参数:proxyProtocolVersion 来支持proxy_protocol,proxy_protocol是TCP层的协议内容,作用就是传递数据来源的IP等信息,增加后frpc配置如下:

[[proxies]]
name = "1panel_web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 443
remotePort = 443
# 只要这一行,开启 IP 穿透
transport.proxyProtocolVersion = "v2"

这样配置后,frpc在将流量转发给本地443端口时,就会先发送proxy_protocol信息,这个信息里就包含数据来源IP信息,这之后,还需要修改1Panel管理的网站的nginx配置信息(这一点并不优雅,和1Panel这种图形化管理网站的哲学冲突),具体改动为在你的网站配置文件里listen 443 ssl 后加上 proxy_protocol,如:

listen 443 ssl proxy_protocol; 或

listen 443 ssl http2 proxy_protocol;

之后再添加如下内容:

set_real_ip_from 127.0.0.1;

real_ip_header proxy_protocol;

set_real_ip_from 告诉 Nginx,谁发过来的“真实 IP”信息是值得信任的。real_ip_header告诉 Nginx,去哪里抓取那个“真实 IP”字符串。感兴趣可以学习nginx相关知识,不再详述。

整体修改后server 模块内如下:

server {
    listen 443 ssl http2 proxy_protocol; 
    set_real_ip_from 127.0.0.1; 
    real_ip_header proxy_protocol; 
    #其他配置
}

至此就可以将真实ip传递到代理的服务。

4、Tips

由于在nginx(openresty)配置内添加了 proxy_protocol,导致nginx 无法和frpc 以外的访问建立连接,所以本地ip访问会失败,比如假设你的本地服务内网ip是192.168.2.138,在浏览器访问192.168.2.138时将访问失败,但通过具体端口访问不受影响

1

评论区