[GH-ISSUE #3064] 二级域名或自定义域名总是访问同一个客户端端口 #2452

Closed
opened 2026-05-05 13:34:42 -06:00 by gitea-mirror · 3 comments
Owner

Originally created by @ricky0829 on GitHub (Aug 18, 2022).
Original GitHub issue: https://github.com/fatedier/frp/issues/3064

Bug Description

客户端主机内网配置了两个服务,分别占用内网的 10001、20001 端口,服务端配置了 subdomain_host 为 XXX,客户端配置了两个连接,分别指向 local_port 10001 和 20001,二级域名分别为 A、B,启动后也能在服务端看到日志:

https proxy listen for host [A.XXX]
https proxy listen for host [B.XXX]

但是浏览器访问时,先访问了谁,两个二级域名就都指向了谁,比如先访问 A.XXX,是 A 服务,再访问 B.XXX 也是 A 服务;重启 fprc 后(或另起一个浏览器,或无痕访问,或清除缓存等等),先访问 B.XXX,再访问 A.XXX 就都是 B 服务。
太奇怪了吧......一开始我还没摸清这个规律,就老是 A.XXX 和 B.XXX 指向同一个服务,试了无数次发现好像是这个规律......

frpc Version

0.44.0

frps Version

0.44.0

System Architecture

linux/amd64

Configurations

服务器配置:

[common]
bind_port = ****
bind_udp_port = ****
bind_addr = 0.0.0.0
tls_only = true
token = ****
vhost_https_port = 443
subdomain_host = XXX

客户端配置:

[common]
server_addr = *.*.*.*
server_port = ****
token = ****
tls_enable = true

[A]
type = https
local_port = 10001
subdomain = A

[B]
type = https
local_port = 20001
subdomain = B

域名解析配置:

*.XXX -> server_addr

Logs

没有任何 error 日志,我试着在客户端排查了端口占用情况(lsof -i tcp:xxx),都是正常的,没有端口冲突。也试了直接在客户端 curl http://127.0.0.1:xxx 也都是对应的服务,没有出现同一个服务的现象。

Steps to reproduce

...

Affected area

  • Docs
  • Installation
  • Performance and Scalability
  • Security
  • User Experience
  • Test and Release
  • Developer Infrastructure
  • Client Plugin
  • Server Plugin
  • Extensions
  • Others
Originally created by @ricky0829 on GitHub (Aug 18, 2022). Original GitHub issue: https://github.com/fatedier/frp/issues/3064 ### Bug Description 客户端主机内网配置了两个服务,分别占用内网的 10001、20001 端口,服务端配置了 subdomain_host 为 XXX,客户端配置了两个连接,分别指向 local_port 10001 和 20001,二级域名分别为 A、B,启动后也能在服务端看到日志: ``` https proxy listen for host [A.XXX] https proxy listen for host [B.XXX] ``` 但是浏览器访问时,先访问了谁,两个二级域名就都指向了谁,比如先访问 A.XXX,是 A 服务,再访问 B.XXX 也是 A 服务;重启 fprc 后(或另起一个浏览器,或无痕访问,或清除缓存等等),先访问 B.XXX,再访问 A.XXX 就都是 B 服务。 太奇怪了吧......一开始我还没摸清这个规律,就老是 A.XXX 和 B.XXX 指向同一个服务,试了无数次发现好像是这个规律...... ### frpc Version 0.44.0 ### frps Version 0.44.0 ### System Architecture linux/amd64 ### Configurations 服务器配置: ``` [common] bind_port = **** bind_udp_port = **** bind_addr = 0.0.0.0 tls_only = true token = **** vhost_https_port = 443 subdomain_host = XXX ``` 客户端配置: ``` [common] server_addr = *.*.*.* server_port = **** token = **** tls_enable = true [A] type = https local_port = 10001 subdomain = A [B] type = https local_port = 20001 subdomain = B ``` 域名解析配置: *.XXX -> server_addr ### Logs 没有任何 error 日志,我试着在客户端排查了端口占用情况(lsof -i tcp:xxx),都是正常的,没有端口冲突。也试了直接在客户端 curl http://127.0.0.1:xxx 也都是对应的服务,没有出现同一个服务的现象。 ### Steps to reproduce 1. 2. 3. ... ### Affected area - [ ] Docs - [ ] Installation - [X] Performance and Scalability - [ ] Security - [ ] User Experience - [ ] Test and Release - [ ] Developer Infrastructure - [ ] Client Plugin - [ ] Server Plugin - [ ] Extensions - [ ] Others
Author
Owner

@ricky0829 commented on GitHub (Aug 18, 2022):

给我的感觉就是 frps 服务端接收到请求后(开发者工具里可以看到标头的远程地址的确是 frps 服务端的 IP + frps.ini 里设置的 vhost_https_port),转发到 frpc 时出了问题,不知道是没有带上域名标头,导致 frpc 没有根据不同域名转发到不同端口,还是 frpc 已经接收到了不同域名的请求,却没有根据规则转发到对应端口。
我也怀疑是浏览器缓存或别的什么问题,换了手机尝试也是一样的,就排除掉了。就好像不管访问哪个二级域名,只要访问者的第一个连接建立了,以后所有域名都走第一个连接对应的端口。
另外补充一个信息,在 frpc 端通过 lsof -i tcp:xxx 可以看出,第一次访问的端口会有 frpc 的连接建立,其他端口都没有,即便我通过浏览器去访问了其他端口对应的二级域名。
782da07788d0de5214fb7154553786b

有没有什么办法能看到浏览器访问域名之后的具体操作?比如,抓包?或者 frpc 这边的具体操作。太奇怪了,我对着文档一个字一个字核对,绝对没写错啊......

<!-- gh-comment-id:1219019394 --> @ricky0829 commented on GitHub (Aug 18, 2022): 给我的感觉就是 frps 服务端接收到请求后(开发者工具里可以看到标头的远程地址的确是 frps 服务端的 IP + frps.ini 里设置的 vhost_https_port),转发到 frpc 时出了问题,不知道是没有带上域名标头,导致 frpc 没有根据不同域名转发到不同端口,还是 frpc 已经接收到了不同域名的请求,却没有根据规则转发到对应端口。 我也怀疑是浏览器缓存或别的什么问题,换了手机尝试也是一样的,就排除掉了。就好像不管访问哪个二级域名,只要访问者的第一个连接建立了,以后所有域名都走第一个连接对应的端口。 另外补充一个信息,在 frpc 端通过 lsof -i tcp:xxx 可以看出,第一次访问的端口会有 frpc 的连接建立,其他端口都没有,即便我通过浏览器去访问了其他端口对应的二级域名。 <img width="684" alt="782da07788d0de5214fb7154553786b" src="https://user-images.githubusercontent.com/28993319/185291436-b1743af6-fee9-4d4d-8a2a-f0b36f021461.png"> 有没有什么办法能看到浏览器访问域名之后的具体操作?比如,抓包?或者 frpc 这边的具体操作。太奇怪了,我对着文档一个字一个字核对,绝对没写错啊......
Author
Owner

@fatedier commented on GitHub (Aug 18, 2022):

https://github.com/fatedier/frp/issues/628

<!-- gh-comment-id:1219022646 --> @fatedier commented on GitHub (Aug 18, 2022): https://github.com/fatedier/frp/issues/628
Author
Owner

@ricky0829 commented on GitHub (Aug 18, 2022):

#628

谢谢,我这边的确是通配符证书,而且我也怀疑过证书问题,因为我访问端有卡巴斯基,这个域名之前没搞证书的时候卡巴斯基帮我装了一个,必须退出卡巴斯基,开新浏览器才能避免使用卡巴斯基的证书。不过我还没搞清楚对应关系,所以就没提。

抱歉我之前真的好好搜了 issue,没搜到......我等会换下证书试试看,解决了就关 issue。

<!-- gh-comment-id:1219026625 --> @ricky0829 commented on GitHub (Aug 18, 2022): > #628 谢谢,我这边的确是通配符证书,而且我也怀疑过证书问题,因为我访问端有卡巴斯基,这个域名之前没搞证书的时候卡巴斯基帮我装了一个,必须退出卡巴斯基,开新浏览器才能避免使用卡巴斯基的证书。不过我还没搞清楚对应关系,所以就没提。 抱歉我之前真的好好搜了 issue,没搜到......我等会换下证书试试看,解决了就关 issue。
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/frp#2452
No description provided.