跳转到主要内容

Zerotier 的奇怪网络路径 —— 安装多种组网工具后

有时,我们同时安装了 Tailscale Zerotier Nebula 等多种组网工具,于是便有了多条通讯路径。

因为这些软件定义网络都比较智能所以我平时很少关注他们的通讯路径。
也很少关注 Zerotier 的性能,最近发现 Zerotier 性能时好时坏,以前觉得是运营商的 UDP QoS 策略导致的。
但最近需要大量使用 Zerotier,只好查了查。

Ping 网络中的其他主机,昨天还好好的,今天突然延迟奇高无比,还以为是走了中继服务器,但这几台服务器都有公网,不应该吧?
Google 了一下发现 zerotier-cli peers 可以看到是直接链接还是中继,也可以看到数据路径。
嗯,都是直接模式啊?为什么延迟这么高?

初看还没注意,直到某一天突然发现。
性能差时,A 到 B 主机的路径显示 IPv6 地址,但 B 主机并没有 IPv6 全球可路由地址(国内服务商什么时候能上 IPv6?)。
使用 ifconfig 一看,大受震撼,那个地址居然是 tailscale0 的,你这样套娃,怪不得性能特差呢。
嗯,屏蔽掉该地址,发现它居然走了负责 Kubernetes 通讯的 Cilium 的地址,而且似乎造成了环路,整个网络突然流量变得超高。
原来如此原来如此。


如何屏蔽

请参考此文档 https://docs.zerotier.com/zerotier/zerotier.conf 屏蔽相关地址。

Zerotier 工作路径:

  • Windows:: C:\ProgramData\ZeroTier\One
  • MacOS:  /Library/Application Support/ZeroTier/One
  • Linux:  /var/lib/zerotier-one
  • FreeBSD/OpenBSD:  /var/db/zerotier-one

即在上述路径中创建 local.conf 并以 JSON 格式书写。(JSON 格式检查JSON 格式化兼检查
Zerotier 会自动检测此文件,编写完后保存并重启 Zerotier,使用 zerotier-cli info -j 检查以确保正确配置。
使用 zerotier-cli info -j"listeningOn": 处即可看到 Zerotier 监听的地址。

例子:

{
	"physical": {
		"fd7a:115c:a1e0:0b1a::/64": {
			"blacklist": true
		},
      	"fd7a:115c:a1e0:ab12::/64": {
			"blacklist": true
		},
      	"100.64.0.0/10": {
			"blacklist": true
		},
		"10.96.0.0/14": {
			"blacklist": true
		},
		"10.32.0.0/12": {
			"blacklist": true
		}
	}
}

这个例子屏蔽掉了:

  • fd7a:115c:a1e0:0b1a::/64 这是 Tailscale 的 IPv4 映射到 IPv6 地址范围。(见此
  • fd7a:115c:a1e0:ab12::/64 这是 Tailscale 的 IPv6 地址范围。(见此
  • 100.64.0.0/10 电信级 NAT 地址,这同时也是 Tailscale 的 IPv4 地址范围。(见此
  • 10.96.0.0/14 我的 Kubernetes 服务网段。
  • 10.32.0.0/12 我的 Kubernetes 服务网段。

于是 Zerotier 便不会再使用这几个地址进行通讯。
不知道如何换算子网?推荐 Vultr 的子网计算器

除了屏蔽地址,也可以屏蔽接口:

{
    "settings": {
        "interfacePrefixBlacklist": [ "tailscale0","eth1","wlan0" ]
    }
}

不再走奇怪的路径后,网络性能,大大提升了。

 

开启多路径模式
当你有多条路径时,也可以尝试开启多路径模式。
白皮书里有说,但似乎实际实现不是这样的?

同样是 local.conf

{
    "settings": {
        "multipathMode": 模式编号
    }
}

模式介绍:

  • 0 = ZT_MULTIPATH_NONE:不激活多路径。流量仅通过最强路径发送。如果路径出现故障,此模式将自动故障转移到次强路径。
  • 1 = ZT_MULTIPATH_RANDOM流量在所有活动路径中随机分布。
  • 2 = ZT_MULTIPATH_PROPORTIONALLY_BALANCED流量根据观察到的稳定性和性能(质量)在所有活动路径上分配。将停止通过看似 stale 的路径发送流量。

设置完后重启 Zerotier,执行 zerotier-cli -j status 即可在 "multipath" 部分看到连接信息。

可以正常设置,但是似乎没有作用。
实现应该是和白皮书里面的不一样,具体请参阅 https://docs.zerotier.com/zerotier/multipath/

所以应该是这样?

{
   "settings":{
      "defaultBondingPolicy":"active-backup"
   }
}

详情选项请见文档

 

 

所以最后组合一下就是:

{
   "physical":{
      "fd7a:115c:a1e0:0b1a::/64":{
         "blacklist":true
      },
      "fd7a:115c:a1e0:ab12::/64":{
         "blacklist":true
      },
      "10.0.0.0/8":{
         "blacklist":false
      },
      "100.64.0.0/10":{
         "blacklist":true
      },
      "10.96.0.0/14":{
         "blacklist":true
      },
      "10.32.0.0/12":{
         "blacklist":true
      }
   },
   "settings":{
      "defaultBondingPolicy":"active-backup",
      "interfacePrefixBlacklist":[
         "tailscale0",
         "weave",
         "cilium_net",
         "cilium_host",
         "cilium_vxlan"
      ]
   }
}

 

 

 

 

 

 

 

 

 

检查节点间通信

Tailscale 

使用 tailscale status 确保节点间是 direct 连接而不是 relay "foo"。
然后使用 tailscale ping <节点名> 在节点间测试通信,确保没有经过中继服务器。
如果无法建立直接连接,请参考此文章 https://tailscale.com/kb/1082/firewall-ports/
无直接连接时性能会严重降低。


Zerotier

使用 zerotier-cli peers 确保节点间是 DIRECT 连接而不是 RELAY。
如果无法建立直接连接,请参考此文章 https://docs.zerotier.com/zerotier/troubleshooting
无直接连接时性能会严重降低。