Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

frps是否可以接收 PROXY protocol? #2181

Open
renkx opened this issue Jan 10, 2021 · 13 comments
Open

frps是否可以接收 PROXY protocol? #2181

renkx opened this issue Jan 10, 2021 · 13 comments
Labels

Comments

@renkx
Copy link

renkx commented Jan 10, 2021

我是nginx sni第四层分流到frps的,nginx设置了proxy_protocol on(启用PROXY protocol发送),frps能否接收PROXY protocol呢?是接收,不是发送。

@fatedier
Copy link
Owner

好像没有这个必要?既然前面挡了 nginx 的话,可以直接将 real IP 写到 header 中传递给 frps?

@renkx
Copy link
Author

renkx commented Jan 10, 2021

现在是nginx设置了proxy_protocol on之后,分流给frps,就会error。错误日志我抽时间整理放上来。

@fatedier
Copy link
Owner

frps 没有识别 PROXY_PROTOCOL,所以出错很正常的。我的意思是,没必要转发给 frps 的时候开启 PROXY protocol

@renkx
Copy link
Author

renkx commented Jan 10, 2021

用nginx sni分流是因为有其他服务用到443,其他服务需要开启PROXY protocol获取真实IP信息,所以frps想共用443,必须要接收PROXY protocol才行。否则就error

@renkx
Copy link
Author

renkx commented Jan 10, 2021

image
以上是某“爱国”core,有个acceptProxyProtocol:true的配置,就是为了开启PROXY protocol接收,接收nginx SNI分流前真实来源IP和端口。
我在想frps有没有这种设置

@fatedier
Copy link
Owner

nginx 的配置应该是可以单独配置的?都用 443,但是不同 host 可以配置不同的转发规则把?发往 frps 的时候就不需要带上 Proxy protocol 了?

要支持的话也可以考虑,之后看一下怎么设计,你目前肯定直接优化 nginx 配置更快一些。

@EkkoG
Copy link

EkkoG commented Jun 24, 2021

刚正在配置一个场景,似乎和这个 issue 是同一个问题

stream {
	map $ssl_preread_server_name $backend_name {
        home-emby.frp.xxx.com frp-emby;
        home-dsm.frp.xxx.com frp-dsm;
		default web;
	}

	upstream web {
		server 127.0.0.1:8443;
	}

	upstream frp-emby {
		server internal-frps-emby.xxx.com:5011;
	}

	upstream frp-dsm {
		server internal-frps-dsm.xxx.com:5014;
	}

	server {
		listen 443 reuseport;
		listen [::]:443 reuseport;
		proxy_pass  $backend_name;
		ssl_preread on;
	}
}

这样配置的目的是让多个服务可以共用 443 端口

5011 和 5014 是两个 HTTPS 网页服务,单独访问没有问题,然后用 Nginx 分流,就不行了,我没找到错误日志,现在的现象是访问 home-emby.frp.xxx.com 时会得到 home-dsm.frp.xxx.com 的网页,或者反过来,总会有一个是不正常的

@fatedier
Copy link
Owner

@cielpy 看起来不是一个问题,你能单独新建一个 issue 说明这个问题,以及我如何能在本地快速复现这个场景?

@EkkoG
Copy link

EkkoG commented Jun 25, 2021

@cielpy 看起来不是一个问题,你能单独新建一个 issue 说明这个问题,以及我如何能在本地快速复现这个场景?

确实不是同一个问题,但是我觉得这个问题可能不是在 frp,而是在 Nginx 那边,有人遇到和我一样的问题 https://www.orzlee.com/proxy/2021/04/13/nginx-sni-offload-port-multiplexing-uses-xray-vless-xtls.html

@aorosora
Copy link

aorosora commented Nov 6, 2021

一样的情况,我现在是通过前置 FRPS,然后再在 Nginx 前套一个 FRPC 来曲线解决用户 IP 的传递问题的(就是服务器上同时安装了 FRPS 和 FRPC)。不过这样的话 V2Ray 就不能使用 gRPC 和 mux 了。

@picklefan

This comment has been minimized.

@Kissycat
Copy link

Kissycat commented Sep 30, 2023

还会考虑支持这个功能嘛,有这个功能的话,服务端和客户端的配置可以大大简化,只转发一个tcp端口就可以了,毕竟前后都可以让Nginx之类的去分流...

试了一下停更的nps,这玩意的tcp代理居然自动兼容proxy_protocol..

@rui8832
Copy link

rui8832 commented May 7, 2024

我是这样配置的,多个域名共用一台服务器的443口,实际服务部署在内网,用frp穿透:

Nginx 配置:

server {
    listen 80;
    server_name AAA.example.cn www.AAA.example.cn;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen 80;
    server_name BBB.example.cn www.BBB.example.cn;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen 443 ssl;
    server_name AAA.example.cn www.AAA.example.cn;

    ssl_certificate "/ect/nginx/certs/AAA.example.cn.pem";
    ssl_certificate_key "/ect/nginx/certs/AAA.example.cn.key";

    location / {
        proxy_pass http:https://127.0.0.1:8090;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

server {
    listen 443 ssl;
    server_name BBB.example.cn www.BBB.example.cn;

    ssl_certificate "/ect/nginx/certs/BBB.example.cn.pem";
    ssl_certificate_key "/ect/nginx/certs/BBB.example.cn.key";

    location / {
        proxy_pass http:https://127.0.0.1:8091;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

内网 frpc 配置,主要是 remote_port 与 Nginx 反向代理配置匹配:

# frpc.ini

[service_AAA]
type = tcp
local_ip = 192.168.0.2
local_port = 8090
remote_port = 8090

[service_BBB]
type = tcp
local_ip = 192.168.0.3
local_port = 8090
remote_port = 8091

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants