尝试用 Zerotier 桥接两个 LAN 失败

276 天前
 cpstar

情况是这样的:

结果是,只能做到主网 OP 的 ZT 以二层桥接内外网实现直接交换数据包,而子 OP 的 ZT 本体接入没问题但子网设备最多实现 NAT 转换后接入而不能同样以二层桥接的方式互通到主网。

企图实现的目标很简单,通过 OP 构建的两个网,在网段等基本配置上实现一致的基础上,通过 ZT 做到桥接,把两个网并成一个大网。

搜了一搜,中文世界基本没有答案,英文世界里犄角旮旯里提到了关闭主网 DHCP ( ZT 配置流量控制丢弃 UDP67UDP68 )流量,但好像并没有生效,然后还有官网说明里的 FAQ 第一条 https://docs.zerotier.com/bridging/ ,但也没啥效果。也有说做不到的 https://discuss.zerotier.com/t/joining-two-zerotier-networks/14692

所以能么?怎么搞?哪里需要什么小技巧?

4107 次点击
所在节点    宽带症候群
57 条回复
sapphire
268 天前
@cpstar Zetotier 等同网线,本身是 VL1 ,二层互通没有任何问题。DHCP 能过可通就说明不是通过其他三层通道。我做的最简环境,为了避免干扰 eth1 都放在 VLAN 里。OP 不熟悉,它也是用的 linux 设施,不通只能是配置原因,不是网络架构原理不支持。
lazyyz
268 天前
@matate B 、C 都是 Linux ,已经开启 IP 转发,直接访问对方局域网内其他没有安装 zerotier 的设备都没问题
sapphire
268 天前
我的测试环境
c1(dhcp)-sw1-(eth1)s1(eth0)-r1(office)~~~~(home)r2-(eth0)s2(eth1)-sw2-c2
c2 作为 dhcp 客户端,从 c1 拿到 IP ,并且 c2 和 c1 互通
okletgo
253 天前
@cpstar
首先你的第 2OpenWRT 配置就不对,主网是 192.168.100.0/24 ,子网是 192.168.101.0/24 ,你算算这 2 个网络号都不一样,不在同一网段,自然是不能组成一个大网的,你再查查桥接是什么意思,网桥将网络的同一网段在数据链路层连接起来,只能连接同构网络(同一网段),不能连接异构网络(不同网段)。
192.168.100.0/23 倒是对了,可是你怎么能关掉 DHCP 呢?子网向谁要 IP ? ZT 配置流量控制丢弃 UDP67UDP68 的意思是,防止主网和子网互相向对方的网关请求 DHCP ,导致 2 个 DHCP 服务器分配了同一个 IP 地址给多台终端,进而造成 IP 冲突。
所以正确的做法是,172.25.0.0/16 或者 192.168.0.0/16 ,子网掩码 255.255.0.0 ,例如主网可以是 172.25.1.100~172.25.1.250 ,网关 172.25.1.1 ,子网是 172.25.2.100~172.25.2.250 ,网关 172.25.2.1 ,都开启 DHCP ,但是地址池要像这样正确配置。在 OpenWRT 把 zerotier 开启,zerotier 的管理后台允许该接口桥接,然后给主网 zerotier 设置地址 172.25.1.10 ,子网 zerotier 设置地址 172.25.2.10 ,不要和网关和其他设备重复就行,然后规则丢弃 UDP67UDP68 。不过我自己存在的问题是,不知道怎么丢弃 IPV6 的 DHCP ,也许大家讨论下能得到答案。
okletgo
253 天前
@cpstar 对了,做完这些,别忘了在 OpenWRT ,把 br-lan 和 zerotier 的接口桥接起来
cpstar
251 天前
@okletgo 44#
额。。。
- 首先,DHCP 。有文章说,不要通过 ZT 的网络发送 DHCP 的 UDP 包,会导致意想不到的情况;
- 其次,网段。100/24+101/24 两个网段是不行,但是 100/23 也好还是 100/24 也好,首先二层一个网,然后无非就是 256 台还是 256+256 台主机数量而已,这也不是关键;
- 再次,桥接。桥接操作很简单,ZT 配置上勾上,OP 上绑定端口,主网和次网均此;

然后问题就出现了,主网内不废话,DHCP 也好,ARP 也罢,二层互通,但是次网只有接入的 OP 设备能够找到主网的所有设备(主网也能找到这个 OP ),OP 下边的所有设备只在 OP 内运转,不能找到主网任何一台设备(主网的也找不到子网的设备),拦包观察的是,子网设备找主网的 ARP 广播包不能传到主网里,所以别说 DHCP 了就算手动配置子网的 IP ,也无法获取主网设备的 MAC ,更不要说通信了。

最后按照官方文档的说法,如附言 1 的图,右侧只能各个节点接入,节点下再挂就得是另外一个网段,通过节点[路由|NAT]到主网——那也就是网段不同了。至于原因,我判断,ZT 属于三层(甚至以上)做互通,并不能完成二层的一些协议,所以无法完全做到两个网络的二层桥接,即使用两个 ZT 实现软虚拟的网桥或者交换机设备。

最最后,这个事情,我干脆通过路由解决了。即右侧 NodeA 下挂一个 10.0.1.x 的网络,通过 NodeA 路由到 10.0.0.x 的主网,同时配置主网的路由策略,10.0.1.0/24 via 10.0.0.101 。
okletgo
251 天前
@cpstar 你要不画个网络拓扑图吧,你这样描述我想不出来真实情况,我描述的是异地组网方法,可能跟你的问题不一致
sapphire
251 天前
楼上很多回答对网络原理理解不足,勿在浮沙筑高台。比如说 Zerotier 是三层,Zerotier 是 VL1 好吗,Zerotier 结合自己的网络后,相当于有通明防火墙的网线。

Zerotier 的一对节点通了之后,这两个 tun 接口就相当于一根网线连接起来,有点像运营商给你做了一对专线(,相当于给你扯一根网线,不需要配置 IP ,二层互通就没有任何问题,是否配 IP 都是自己的选择,有点像交换机的端口,可以作为二层口,也可以作为三层口。但是接下来有问题:

1.为何要做二层桥接而不是三层路由?
Zerotier 官方文档说了自己是 V1 ,也是为了让链路层广播和多播通过,比如要用 AirPlay 之类,或者其他以来广播的协议,否则可以用三层,而且一般大多数人也是用三层的。如果要当连接链路层也要考虑广播流量通过互联网传输的负担。

2.二层联通后增么处理各自的原生网络?
如果要把 Office 和 Home 两个链路层通过一根线直通了,那 Home 原来的一些基于广播的协议自然要小心考虑,比如 DHCP ,二层联通后,只能在 Home 原生和 Office 原生二选一,要选择两个都用,只能走一些透明网关类的处理,或者用三层网络。如果选择了使用 Office 原生,由 OfficeDHCP 自然也不是问题。Zerotier 自身也在二层做了一个透明防火墙,可以用规则过滤。

明白以上的原理后,配置二层互通自然不是问题。
sapphire
251 天前
上面的 tun 接口应该是 tap 接口,Zerotier 是把自己当成有透明三层防火墙的交换机,每个客户侧(非移动端)放置一个 tap 端口。
cpstar
250 天前
@sapphire 48#
ZT 做出来几层,你也不能否认他在三层以上做互通,做到了 VL1 那肯定是用软件模拟,毕竟不是网线,不是交换机。如果是 VL1 ,理论上,你说的 DHCP 以及 ARP 我认为都应该没问题。但事实上,什么是事实,事实就是实践,实践告诉我,没搞定,¯\(°_o)/¯,office 端(子端)收不到 DHCP ,ARP 广播也只能在 H 端或 O 端内部运转。我在主题和回复中提及了数次,有文章说需要在 ZT 的流量控制上禁止 UDP67UDP68 也就是 DHCP ,因为会产生不可预测的情况发生。那这些,就与所谓的 VL1 不匹配了,所以才有本主题,失败了。
cpstar
250 天前
补 50#,如果说另建一个 tun 端口,那是不是就是类似构建 gre 隧道的形式来保证广播双向可达,这个我是没有实践,不知道具体什么情况。
sapphire
250 天前
@cpstar Zerotier 创建的虚拟口就是 tap ,48#我写错了,tap 本身就是一个链路层的口,当你把它 bridge 到物理端口时,自然实现了二层互通,但是互通后你需要自己解决二层划分和使用的问题,比如 bridge 一个和 Home 原生网络隔离的 VLAN 。Zerotier 当然是基于三层,但是它自身是 VL1 ,那原理上就可以当 VL1 用,要按你的说法,运营商也没法跨区域做光交换专线了,而且有很多虚拟专线,都是 Ethernet over IP 。

我当然是实践后才这么说。没有收不到 DHCP 和 ARP 这些问题,文章说的 DROP 掉 UDP67/68 只是简单的让两个网络各自使用自己的 DHCP ,实际上如果你有用一个的需求,无需过滤这些包。另外可以把文章链接放出来,一起看看。

最后要说的是:只是你失败了!并不是原理不通。讨论修正理解不对的地方,找出自己配置不当,实现就完了。
sapphire
250 天前
user@misc:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:14:a7:xx:a7:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.10.53/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
link/ether xx:30:xx:xx:32:f0 brd ff:ff:ff:ff:ff:ff
4: zth6123456: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel master br0 state UNKNOWN group default qlen 1000
link/ether de:4d:9d:9f:10:7c brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether be:c0:ff:fd:6d:72 brd ff:ff:ff:ff:ff:ff
user@misc:~$ brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.bec0fffd6d72 no eth1
zth6123456
user@misc:~$ sudo tcpdump -i br0 -nn -l arp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on br0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
09:18:41.845729 ARP, Request who-has 192.168.1.1 (b6:ff:16:xx:xx:80) tell 192.168.1.149, length 46
09:18:41.853347 ARP, Reply 192.168.1.1 is-at b6:ff:16:xx:xx:80, length 28
09:18:46.633253 ARP, Request who-has 192.168.1.118 tell 0.0.0.0, length 46
09:18:48.646430 ARP, Request who-has 192.168.1.1 tell 192.168.1.118, length 46
09:18:48.700308 ARP, Request who-has 192.168.1.1 (ff:ff:ff:ff:ff:ff) tell 192.168.1.11, length 46
^C
5 packets captured
cpstar
249 天前
@sapphire 53#
额,看情况,根据附言 1 的图,我猜你测试的是右侧 NodeA 上的,我不知道你继续测试右侧 NodeA 下如果再带一台机器比如 NodeA-A ,能否继续广播通。我没有实现的就是 NodeA 下的 NodeA-A 寻找左侧 0.11 或者 0.2 这些机器。
单纯做到附言 1 的图,没有任何问题。
sapphire
249 天前
@cpstar A 侧能通自然 B 侧也通,二层不考虑交换机的作用,本身就是广播的。从原理出发,不会质疑这个,只要解决自己哪里没做对就行。

A 侧网络是 192.168.10.0/23 ,B 侧是 192.168.1.0/24 ,这是 B 侧桥接 VLAN 下的另一台机器 ui (非 Zerotier 所在 ecs )的 DHCP 的结果:

root@ui:~# dhclient -v eth4
root@ui:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 0a:4c:51:c4:9c:c8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.8/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
76: eth4@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether da:0c:23:82:ad:de brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.10.123/24 brd 192.168.10.255 scope global dynamic eth4
valid_lft 691181sec preferred_lft 691181sec

root@ecs:~# tcpdump -i br0 -nn -l port 67 or port 68
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on br0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
11:41:57.970084 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 4a:f7:33:3b:e8:29, length 300
11:41:57.983324 IP 192.168.10.8.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 315
11:41:57.984336 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 4a:f7:33:3b:e8:29, length 300
11:41:57.986453 IP 192.168.10.1.67 > 192.168.10.123.68: BOOTP/DHCP, Reply, length 315
11:41:57.991644 IP 192.168.10.8.67 > 255.255.255.255.68: BOOTP/DHCP, Reply, length 315
11:41:57.998054 IP 192.168.10.1.67 > 192.168.10.123.68: BOOTP/DHCP, Reply, length 315
sapphire
249 天前
@cpstar #55 楼的截屏中 tcpdump 是另一次 dump 的结果,和 10.123 这次不一样,request from 的 mac 是不一样的,那次被屏幕滚动冲掉了。
sapphire
249 天前
“A 侧网络是 192.168.10.0/23”,此处笔误是 192.168.10.0/24 。

实际上,我不觉得你的真实需求必须要二层互通,一般远程办公这种情况绝大多数应用三层互通就足够,有个别需要广播或者多播的,可以通过各种三层技术引入,比如 DHCP Relay 以及 ARP Proxy 和 IGMP Proxy 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1015835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX