记录一下FRP XTCP的配置方法
2024-03-19 11:10:21

记录一下FRP XTCP的配置方法

什么是xtcp
在 FRP(Fast Reverse Proxy)的 XTCP 功能中,frps(FRP
服务端)扮演着至关重要的角色,尽管它不直接参与数据的最终传输。XTCP 是一种穿透技术,使得处于不同 NAT
或防火墙后的两个网络设备能够建立直接的连接。在这种模式下,frps 的作用主要包括:

  1. 中继握手信息:当两个客户端(通过 frpc 运行)尝试建立 XTCP 连接时,frps 作为中介,负责转发这两个客户端之间的握手信息。这是建立 P2P(点对点)连接的先决条件,因为大多数客户端都处在 NAT
    或防火墙后面,无法直接发现对方或建立连接。

  2. 协助穿透 NAT:在 XTCP 的握手过程中,frps 会帮助两端的 frpc 客户端交换必要的信息(如公网 IP 地址和端口),这些信息是实现 NAT 穿透的关键。通过这种方式,即便客户端位于复杂的网络环境中,也能够尝试直接相互连接。

  3. 回退到中继传输(可选):在某些情况下,比如当 NAT 类型特别严格或环境复杂到阻碍了直接的 P2P 连接时,frps 可以提供回退方案,即通过服务器中继来传输数据。虽然这增加了延迟并需要更多的服务器带宽,但它确保了连接的可靠性。需要注意的是,FRP 的
    XTCP 功能主要目标是尽量实现直接的 P2P 连接,而不依赖服务器中继传输数据。

  4. 安全性和访问控制frps 还管理着客户端的认证过程,确保只有授权的客户端可以建立连接。此外,它可以对连接进行加密和压缩设置,提高数据传输的安全性和效率。

总之,虽然 frps 在 XTCP
模式下的数据传输过程中不直接参与数据的最终传递,但它在建立连接的初期阶段发挥着至关重要的作用,包括但不限于握手信息的中继、帮助实现 NAT
穿透、提供回退的中继传输方案以及执行安全性和访问控制。for ChatGPT

1. 确认环境要求

  • 两个客户端:确保你有两个处于不同 NAT 或防火墙后的客户端设备,这两个客户端都需要能够访问到 FRP 服务器。

  • 一个服务器:一个可以被上述客户端访问的服务器,用来部署 FRP 服务端。这个服务器需要有固定的公网 IP 或域名。

这里我准备了一台内网服务器 ' A ',两台公网服务器,含一台优质线路,低宽带低流量 ' S ' ,一台高宽带高流量线路一般的服务器' D ')。实测基本能跑满加宽上行。)

2. 安装 FRP

frps为服务端,frpc为客户端,安装方法请参考安装 | frp (gofrp.org)

Docker compose安装示列,包含frpsfrpc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'
services:
frps:
image: snowdreamtech/frps
container_name: frps
network_mode: host
volumes:
- ./data/frps.toml:/etc/frp/frps.toml
restart: always

frpc:
image: snowdreamtech/frpc
container_name: frpc
network_mode: host
volumes:
- ./data/frpc.toml:/etc/frp/frpc.toml
restart: always
  • 内网服务器 A安装frpc
  • 公网服务器D安装frpc
  • 公网服务器S安装frps

3. 配置

这里以穿透内网群晖为例
下文看不懂可以参考点对点内网穿透 | frp (gofrp.org)

1.群晖或任意内网设备安装好frpc后,这里称为 被访问者 A

进入你的安装目录配置.toml文件

1
2
cd opt/frpc/data
nano frpc.toml
1
2
3
4
5
6
7
8
9
10
serverAddr = "1.1.1.1"#服务器 S 的IP地址
serverPort = 7000#服务器 S 的frps端口号,一般为7000
auth.token = "123"#密钥,可选

[[proxies]]
name = "nas-xtcp#名称随意"
type = "xtcp"
secretKey = "123441"#密钥随意
localIP = "192.168.88.2"#群晖内网地址
localPort = 5001#群晖内网端口

ctrl+x y保存.

2.配置frps服务端 S

1
2
cd opt/frps/data#这里是你的安装路径
nano frps.toml
1
2
3
4
5
6
7
bindPort = 7000
auth.token = "123"密钥

webServer.addr = "0.0.0.0"
webServer.port = 7500#web面板端口
webServer.user = "admin"web面板账号
webServer.password = "adMin"web面板密码

3.配置frpc 访问者 D

1
2
cd opt/frpc/data
nano frpc.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
serverAddr = "1.1.1.1"#服务器 S 的IP地址
serverPort = 7000#服务器 S 的frps端口号
auth.token = "123"#密钥


[[visitors]]
name = "p2p_nas_visitor"#这里名字随意
type = "xtcp"
# 要访问的 P2P 代理的名称
serverName = "nas-xtcp"#这里要与***被访问者名字***一致
secretKey = "123441"#这里要与***被访问者密码***一致
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"#你服务器的内网地址,可以不用修改
bindPort = 15001#你服务器未使用的端口
# 如果需要自动保持隧道打开,将其设置为 true
keepTunnelOpen = true

配置完成后重启下一服务器 s a d

接下来使用D服务器的IP+15001就能访问内网群晖了。

反向代理简单示列

1
2
3
4
5
6
7
8
9
10
11
12
13
location ^~ / {
proxy_pass https://127.0.0.1:15001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
add_header X-Cache $upstream_cache_status;
add_header Strict-Transport-Security "max-age=31536000";
add_header Cache-Control no-cache;