低成本稳定P2P组网方案

6 阅读5分钟

低成本稳定P2P组网方案 | 2026年3月25日更新

一、需求背景

在日常使用场景中,用户常常需要在外部网络环境下访问家庭内网的设备与服务。传统解决方案存在成本高、配置复杂、维护困难等问题。本方案通过EasyTier与FRP的组合,以极低的部署成本实现稳定的P2P组网能力,支持外部设备直连访问内网主机上的各类服务。

二、系统架构

本系统由三个核心组件构成,各组件承担不同的职责,协同完成设备发现与数据传输功能。

FRP进程(信标服务器) 部署于家庭内网环境,通过FRP服务将指定端口映射至公网。该组件主要承担两项功能:一是作为信令服务器,提供设备注册与发现服务,所有客户端上线时需首先向其报到;二是作为中转服务器,在P2P直连无法建立时承担流量转发任务。FRP进程通过FRP接入网络,因此部署位置灵活,放置于内网任意位置均可正常工作。

主机进程(客户端) 是真正提供服务的终端。用户需要远程访问的各类服务均运行于主机进程所在设备之上。该进程的虚拟IP地址通过配置文件静态指定(如10.255.1.1/8),或由EasyTier内置DHCP服务分配。外部客户端通过该虚拟地址直接访问主机服务。主机进程部署于家庭内网,建议与FRP进程处于同一局域网环境,理想情况下部署于同一台物理设备,以获得最佳的内网传输效率。

外部客户端泛指需要在外部网络环境下访问内网资源的终端设备。该客户端启动后首先联系FRP进程进行注册,获取当前可用的主机进程信息。获取信息后,外部客户端优先尝试与主机进程建立P2P直连;若直连因网络限制无法建立,系统自动切换至中转传输模式,所有流量经由FRP进程转发。

三、通信流程

外部客户端与主机进程之间的通信建立过程分为三个阶段。

注册阶段:外部客户端启动后,通过FRP建立的通道联系FRP进程进行注册。FRP进程接收注册请求后,记录该客户端的在线状态,并返回当前网络中可访问的主机进程信息,包括其虚拟IP地址等关键参数。

直连阶段:外部客户端获取主机进程信息后,直接向主机进程发起连接请求。系统根据网络环境自动选择最优的直连方式,包括TCP直连和UDP打洞两种模式。TCP直连配置简单,适用于网络限制较少的场景;UDP打洞能够穿越更复杂的NAT环境,成功率更高。

切换阶段:若直连成功建立,后续数据传输完全在两端之间进行,不经过任何中转节点,传输效率最高。

四、部署原则

FRP进程 和 主机进程 必须 分开运行,不能合并成一个程序。

合并部署时,两个功能跑在同一个程序里。外部设备连接时,程序会误以为目标就在本地,不再尝试建立直连。结果所有数据都要绕道中转服务器,导致网速变慢、延迟变高,内网直连的优势完全发挥不出来。

分离部署时,两个功能各自独立运行。主机进程负责提供服务,FRP进程负责帮忙找到主机。外部设备通过FRP获取主机信息后,能直接向主机发起连接。系统可以正常尝试直连,成功则数据直接传输,失败再自动切换中转。

五、配置示例

以下提供完整的配置文件示例,各参数可根据实际网络环境进行调整。

FRP进程配置

该进程负责提供信令服务和中转功能。

hostname = "XUYINGJUN_frp"
instance_name = "XUYINGJUN"
instance_id = ""
ipv4 = "10.255.1.2/8"
dhcp = false
listeners = ["tcp://0.0.0.0:11011"]
mapped_listeners = ["tcp://frp地址:11011"]
[network_identity]
network_name = "name"
network_secret = "password"
[[peer]]
uri = "tcp://localhost:11010"
[flags]
bind_device = false
dev_name = "XUYINGJUN_frp"
enable_kcp_proxy = true

配置要点:监听地址使用0.0.0.0而非127.0.0.1,确保外部流量能够正常接入。mapped_listeners字段填写FRP映射后的公网访问地址。peer配置项仅指向本地主机进程的监听端口,建立两个进程之间的连接通道。

主机进程配置

该进程运行于需要被远程访问的设备上。

hostname = "XUYINGJUN_et"
instance_name = "XUYINGJUN"
instance_id = ""
ipv4 = "10.255.1.1/8"
dhcp = false
listeners = [
    "tcp://0.0.0.0:11010",
    "udp://0.0.0.0:11010",
    "tcp://[::]:11010",
    "udp://[::]:11010",
]
[network_identity]
network_name = "name"
network_secret = "password"
[[peer]]
uri = "tcp://et.sbgov.cn:11010"
[[peer]]
uri = "tcp://localhost:11011"
[flags]
dev_name = "XUYINGJUN_et"
disable_sym_hole_punching = true
enable_kcp_proxy = true

配置要点:虚拟IP地址固定为10.255.1.1,该地址为主机进程在虚拟网络中的唯一标识。peer列表需包含FRP进程地址(localhost:11011)以及备用信令服务器地址,确保在主信道失效时能够自动切换。disable_sym_hole_punching参数用于处理对称型NAT环境下的兼容性问题。enable_kcp_proxy参数启用KCP协议优化,提升中转模式下的传输效率。

FRP服务端配置

该配置用于FRP服务端程序,将FRP进程的端口映射至公网。

[common]
server_addr = ***.***.***
server_port = 7000
tls_enable = false
user = ***
token = ***

[***]
type = tcp
local_ip = 127.0.0.1
local_port = 11011
remote_port = 11011

配置要点:local_port设置为FRP进程的监听端口,remote_port设置为公网访问端口。FRP服务端需具有公网可达性,确保外部客户端能够正常连接。


本文为我原创,未经授权禁止转载 | bilibili UID1319899187 | 掘金 ID1048290992076985