求一个 openwrt 的 iptables 规则

2022-04-04 19:59:07 +08:00
 simplove

有多台网络设备想通过 zerotier 组网,要求能够过 upd 的广播包。 试了以下两种方案。

方案一是直接在两台电脑上面安装 zerotier 客户端,一台电脑发包,另外一台电脑抓包,实测可以收到 udp 包。

方案二是直接在 openwrt 上用插件组网,电脑删除客户端,测试收不到 udp 包。 测试的 upd 抓包如下: 方案一可行那说明 zerotier.com 上面的设置是 OK 的。

方案二过了 oepwnrt 路由器,那说明应该是 openwrt 导致的问题,在网上找了很多转发广播包的贴子,试了很多次发现都不行。

有没有大佬给解个惑,谢谢

3633 次点击
所在节点    宽带症候群
22 条回复
Tyanboot
2022-04-04 20:05:35 +08:00
方案二需要 zt 开启桥接功能吧。
Aixiaoa
2022-04-04 20:08:24 +08:00
看看 op 的防火墙设置
simplove
2022-04-04 20:15:43 +08:00
@Aixiaoa #iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
[ -n "$(command -v ip6tables)" ] && ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
只有默认的,试过了很多规则发现都不行。
simplove
2022-04-04 20:16:33 +08:00
@Tyanboot 桥接那个勾很早就打上了,就是不行。
PC1 直接 ping PC2 是没问题的。
cinhoo
2022-04-04 20:33:23 +08:00
iptables -I FORWARD -i ztxxxxxxxx -j ACCEPT
iptables -I FORWARD -o ztxxxxxxxx -j ACCEPT
iptables -t nat -I POSTROUTING -o ztxxxxxxxx -j MASQUERADE
Aixiaoa
2022-04-04 20:47:42 +08:00
@simplove 你有试过关闭 firewall 么 或者更改过接口的 multicast_snooping 配置么
hbytw1
2022-04-04 20:52:34 +08:00
需要在 zerotier 控制端做路由。
10.10.10.0/24 192.168.99.3
192.168.1.0/24 192.168.99.1
0.0.0.0/0 192.168.99.1
192.168.3.0/24 192.168.99.3
192.168.8.0/24 192.168.99.3
指定访问那个 ip 段扔给那个 openwrt
simplove
2022-04-04 21:13:16 +08:00
@Aixiaoa ![]( https://s3.bmp.ovh/imgs/2022/04/04/1178fa9a412c6607.png)
防火墙关闭了还是不行。
在 openwrt 的实时连接里面可以看到能收到包,就是怎么样能把它转发给电脑是个问题
simplove
2022-04-04 21:14:47 +08:00
@yuantianwei 路由是有做的,不然 PC1 也不能 ping 通 PC2 了
Aixiaoa
2022-04-04 21:16:34 +08:00
@simplove 嗯 我知道你的 op 肯定可以收到广播包
现在的问题实际上就在于 op 似乎默认把你的广播包给丢了 没有传给你 op 下面的设备
如果你可以在 op 上抓包的话 我希望你能看下这个包在哪里被丢弃的 我需要更多的信息
JohnSmith
2022-04-04 21:54:35 +08:00
抓包看看是不是 mss 的问题 我之前也才过坑
Aixiaoa
2022-04-04 22:17:57 +08:00
@simplove 正常来讲 广播包跨域默认丢弃的 所以你内网直接发和在 pc 上直接跑 zerotier 都是正常的 但是过了 op 就是不同的广播域 你现在应该看下是在 op 的哪里丢掉的 不过希望应该不大
是否可以把你的 broadcast 转换成 multicast 呢?
Aixiaoa
2022-04-05 00:11:05 +08:00
simplove
2022-04-05 00:12:29 +08:00
@Aixiaoa 用 Wireshark 抓了下 openwrt 上的包。
plink.exe -batch -ssh -pw password root@192.168.1.254 "tcpdump -ni br-lan -s 0 -w - not port 22" | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -
发现并没有抓到目的地址是 255.255.255.255 的包,实时链接里面有,看来应该是 openwrt 把包给丢了。
上面的这种环境实用算是方案三,一边是 pc 端安装 zerotier 客户端,一边是 openwrt 插件。
在这种环境下,openwrt 实时链接里面还能看到有 udp 包过来。
而在方案二里,openwrt 收不到 udp 包,应该是包直接被丢了。
目前在网上找到的最靠谱的是这个贴子: https://www.haiyun.me/archives/1443.html
可惜由于版本过高安装不了 iptables-mod-tee 。
q403809607
2022-04-05 00:14:47 +08:00
你把 zerotier 上的路由表发上来看看
simplove
2022-04-05 00:22:24 +08:00
@Aixiaoa 这个我之前看到了。
整理之后应该是这个样子的
iptables -t mangle -A INPUT -i br-lan -d 255.255.255.255 -m ttl --ttl-gt 0 -j TTL --ttl-set 1
iptables -t mangle -A INPUT -i ztrtatf7n4 -d 255.255.255.255 -m ttl --ttl-gt 0 -j TTL --ttl-set 1
iptables -t mangle -A INPUT -i br-lan -d 255.255.255.255 -m ttl --ttl-gt 0 -j TEE --gateway 192.168.1.255
iptables -t mangle -A INPUT -i ztrtatf7n4 -d 255.255.255.255 -m ttl --ttl-gt 0 -j TEE --gateway 192.168.192.255

192.168.192.255 是 zerotire 的广播地址
192.168.1.255 是本地的广播地址。
这么写应该没错,不过仍然不行
simplove
2022-04-05 00:26:36 +08:00
@q403809607 ![]( https://www.png8.com/imgs/2022/04/05/8a1877e285b6c870.png)
两台 pc 都可以直接 ping 通了,路由是可达的。
Aixiaoa
2022-04-05 00:38:25 +08:00
@simplove 这个规则和你说的 tee 装不了。其实都是同样的啊。 这个规则也需要 tee 支持。 不过你可以看下这个 https://github.com/nomeata/udp-broadcast-relay 编译一个带这个的 op 试试
haohaolee
2022-04-05 16:52:14 +08:00
这是广播域的问题,iptables 主要还是三层的,(虽然也有 ebtables )
建议还是规规矩矩来,跑一个 UDP proxy 监听你要的端口,然后转发到另外一个接口,比如 br-lan
st05329602009
2022-04-05 20:54:10 +08:00
@yuantianwei 大佬的 planet 怎么联系你

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

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

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

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

© 2021 V2EX