Skip to content

P2P 优化

本文档介绍如何优化 EasyTier 的 P2P 体验,包括两部分:

  1. 控制 P2P 连接行为:通过参数调整节点间是否主动建立直连、按需打洞或保持安静。
  2. 提升 P2P 成功率:通过 IPv6、NAT 优化、公网端口映射等网络环境配置,让节点更容易打通直连。

控制 P2P 连接行为

EasyTier 默认会在后台主动尝试和所有普通节点建立 P2P 直连。如果你希望改变这个行为,可以通过以下三个参数按需调整。

按需打洞:--lazy-p2p

默认情况下,EasyTier 会主动对所有节点尝试打洞。开启 --lazy-p2p 后,节点不再主动后台打洞,只有当真正有流量要发往对方时,才会触发建立 P2P

实际效果:

  • 初始阶段先通过 relay 通信,路由 cost 可能是 2
  • 有真实流量后,再逐步建立直连,建立完成后路由 cost 变成 1

适合场景:

  • 网络中节点很多,但彼此之间并不都需要频繁直连。
  • 希望减少后台打洞尝试、降低空闲资源消耗。

优先被直连:--need-p2p

--need-p2p 向其他节点表明"请优先与我建立 P2P"。即使对方开启了 --lazy-p2p,也会主动来连接本节点。

适合场景:

  • 游戏服务器/房主、固定入口节点、对延迟要求高的节点。
  • 希望尽快形成直连,而不是先走中继等待"热身"。

减少自动打洞:--disable-p2p

--disable-p2p 会让本节点退出普通自动打洞

  • 不再主动向普通节点发起 P2P 尝试。
  • 普通节点也不会主动来连接本节点。
  • 但仍然会与开启了 --need-p2p 的节点建立 P2P。
  • 流量可以继续通过 relay 转发,不受影响。

适合场景:

  • 只想和少数关键节点直连,不想和所有节点都自动建连。
  • 希望把 P2P 变成"按需白名单"模式。

组合使用建议

你的需求推荐参数
节点很多,想省资源,不介意首包走中继--lazy-p2p
我是服务器/房主,希望别人尽快直连我--need-p2p
只想和特定节点建 P2P,不想被普通节点打扰--disable-p2p + --need-p2p
彻底安静,只走中继,不建任何 P2P--disable-p2p(不搭配 --need-p2p

只走 P2P 直连:--p2p-only

--p2p-only 要求所有流量只能通过已建立的 P2P 直连传输。如果与某个节点之间还没有 P2P 直连,发往它的流量会被直接丢弃,不会走 relay 中转。

适合场景:安全敏感环境,强制要求所有流量必须端到端直连,不允许经过第三方 relay 节点转发。

注意

如果同时开启 --lazy-p2p--p2p-only,第一次访问尚未建立直连的节点时流量会先失败(因为 p2p-only 不允许走中继),失败会触发按需打洞,等直连建好后后续通信才恢复。因此不要把高实时业务和这个组合一起使用;如需低延迟,应在目标节点上开启 --need-p2p 提前建立直连。

禁用特定打洞方式

如果你发现某种打洞方式在当前网络环境下频繁失败或不稳定,可以单独禁用该方式,避免无效尝试浪费资源。

参数作用适用场景
--disable-udp-hole-punching完全禁用 UDP 打洞网络环境完全阻断 UDP(如某些企业防火墙),或 UDP 打洞频繁失败
--disable-tcp-hole-punching完全禁用 TCP 打洞TCP 打洞在当前网络下不稳定
--disable-sym-hole-punching禁用对称型 NAT (NAT4) 的 UDP 打洞对称型 NAT 打洞基于端口预测(生日攻击原理),在某些网络中可能被运营商识别并阻断。开启后,对称型 NAT 节点之间不再尝试 UDP 打洞(会走 relay),但对称型 NAT 节点与锥型 NAT 节点之间仍可按普通逻辑打洞

IPv6

EasyTier 支持节点间通过 IPv4 和 IPv6 进行 P2P 通信,默认情况下 EasyTier 在每个监听器上同时监听 IPv4 和 IPv6 地址。

只要监听器监听地址为 0.0.0.0 EasyTier 就会自动监听 IPv6 地址,该行为可以通过 --disable-ipv6 参数禁用。

也可以手动配置仅监听 IPv6 地址。 例如:

sh
easytier-core -l 'tcp://[::]:12345' -l 'udp://[::]:12345'

如果您的节点都拥有公网 IPv6 地址,并且可以入站(即被外网访问),就可以通过监听地址+默认监听端口(11010)来建立 P2P 连接。

如果您的节点都拥有公网 IPv6 地址,但不可入站(即不能被外网访问),可以利用 Easytier(版本2.3.0以上) 的 IPv6 打洞功能进行 P2P 连接,默认情况下开启此功能。

当然如果您能够修改公网 IPv6 的防火墙使其可以入站,也可以大幅度提高 p2p 的成功几率。

如果您的 IPv6 使用了 NAT66 技术,即网络地址转换技术,可以参考 IPv4 部分,如果可以的话建议关闭 NAT66 技术。

IPv4

如果您的节点拥有公网 IPv4 地址,并且可以入站(即被外网访问),就可以通过监听地址+默认监听端口(11010)来建立 P2P 连接。

如果您的节点都公网 IPv4 地址,但不可入站(即不能被外网访问),可以利用 Easytier的 IPv4 打洞功能进行 P2P 连接,默认情况下开启此功能。

如果您的节点是普通家庭宽带,无公网 IPv4 ,需要修改 NAT 类型来提高 P2P 的成功几率,分为以下几种情况:(如何修改 NAT 类型可自行百度搜索方法)

有关 NAT 类型的知识可参考这篇文章:各种 NAT 类型的解释

NAT1(在 RFC3489 中为:Full Cone NAT / 完全锥型 NAT ;在 RFC5780 中为:端点无关映射+端点无关过滤 )

对于 Easytier 来说如果您的设备是 NAT1 类型,建立 P2P 连接时对方 NAT 类型可以是 NAT1、NAT2、NAT3、NAT4。

NAT2(在 RFC3489 中为:Restricted Cone NAT / 限制锥型 NAT ;在 RFC5780 中为:端点无关映射+地址相关过滤 )

对于 Easytier 来说如果您的设备是 NAT2 类型,建立 P2P 连接时对方 NAT 类型可以是 NAT1、NAT2、NAT3、NAT4。

NAT3(在 RFC3489 中为:Port Restricted Cone NAT / 端口限制锥型 NAT ;在 RFC5780 中为:端点无关映射+地址和端口相关过滤 )

对于 Easytier 来说如果您的设备是 NAT3 类型,建立 P2P 连接时对方 NAT 类型可以是 NAT1、NAT2、NAT3、NAT4。

NAT4(在 RFC3489 中为:Symmetric NAT / 对称型 NAT ;在 RFC5780 中为:地址和端口相关映射+地址和端口相关过滤 )

对于 Easytier 来说如果您的设备是 NAT4 类型,建立 P2P 连接时对方 NAT 类型可以是 NAT1、NAT2、NAT3、NAT4(部分)。

注:对于 NAT4 类型来说,由于某些原因部分 NAT4 每次建立的端口是递增或递减的,可以通过端口预测技术来实现 P2P,这种 NAT4 可以简称为 NAT4E / 对称型递增。

注意

由于某些防火墙的策略,常见于学校、公司等,即使 NAT 类型为 1 2 3 ,也可能无法建立 P2P 连接。 部分地区的运营商可能会采取阻断 P2P 连接的策略,即使为 NAT 类型为 1 也无法进行 P2P 连接! IPv6 在开启 NAT66 功能后和 IPv4 NAT44 功能一样,也分为以上类型。

指定公网 IP 和端口

某些情况下,节点拥有公网的 IP 和 端口,但 EasyTier 无法正确识别 (比如 NAT 主机),可以使用 --mapped-listeners 配置公网 IP 和端口。 例如:

sh
easytier-core --mapped-listeners tcp://8.8.8.8:12345 -l tcp://0.0.0.0:11010

该 EasyTier 实例监听本地的 11010 TCP 端口,且该端口被映射到公网的 12345 端口。其他节点会尝试连接到公网的 12345 端口。

关闭上网辅助工具

一些上网辅助工具会影响 STUN 测试的结果,导致 EasyTier 无法识别 NAT 类型,或者识别到错误的公网 IP 和端口。可以尝试关闭这些工具。