frp icon indicating copy to clipboard operation
frp copied to clipboard

frps是否可以接收 PROXY protocol?

Open renkx opened this issue 4 years ago • 14 comments

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

renkx avatar Jan 10 '21 13:01 renkx

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

fatedier avatar Jan 10 '21 14:01 fatedier

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

renkx avatar Jan 10 '21 14:01 renkx

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

fatedier avatar Jan 10 '21 14:01 fatedier

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

renkx avatar Jan 10 '21 14:01 renkx

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

renkx avatar Jan 10 '21 14:01 renkx

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

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

fatedier avatar Jan 10 '21 14:01 fatedier

刚正在配置一个场景,似乎和这个 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 的网页,或者反过来,总会有一个是不正常的

EkkoG avatar Jun 24 '21 12:06 EkkoG

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

fatedier avatar Jun 25 '21 02:06 fatedier

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

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

EkkoG avatar Jun 25 '21 04:06 EkkoG

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

aorosora avatar Nov 06 '21 10:11 aorosora

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

这个我好像会, 我是前置 Nginx sni, proxy_protocol on 之后 Xray 可以运行但是没有网, 删掉 proxy_protocol 之后 Xray 可以正常上网, 猜测是 Xray 无法识别 proxy_protocol 的 header, 后面找到一个解决方案就是在 stream 里面加个 proxy_pass, 加上 header 的数据 proxy_pass 之后就没有 header 了(maybe, 我猜的). 贴上我stream的部分配置

	map $ssl_preread_server_name $name {
		111.com cdc;
		222.gq dic;
		333.com mtp;
	}

	upstream cdc{
		server 127.0.0.1:777;
	}

	upstream mtp{
		server 127.0.0.1:899;
	}
	upstream frp{
		server 127.0.0.1:7000;
	}
	
	upstream xtls{
		server 127.0.0.1:8964;
	}

	upstream dic{
		server 127.0.0.1:856;
	}
	
	 
	server {
		listen 443        reuseport;
		listen [::]:443   reuseport;
		
		proxy_pass        $name;
		ssl_preread       on;
 	        proxy_protocol    on; 
		
	}
	server {
		listen            127.0.0.1:777 proxy_protocol; 
		proxy_pass        xtls;   
	}  
	server {
		listen            127.0.0.1:899 proxy_protocol; 
		proxy_pass        frp;   
	}   
	
		
		
}```

picklefan avatar Mar 02 '22 01:03 picklefan

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

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

Kissycat avatar Sep 30 '23 06:09 Kissycat