有了 ipv6 地址就可以直连了吗?

37 天前
 FaiChou

在这样的网络下,双方 OpenWrt 负责 pppoe 拨号上网,下发 ipv6 地址,OP 另一个网口连接着电脑。电脑有 ipv6 地址。OpenWrt 的防火墙 FORWARD 链默认是 DROP 的,没有添加其他防火墙设置。

这样双方有 ipv6 地址就可以直连了吗?算 p2p 吗?经过我的测试,a 电脑起一个 server python3 -m http.server 8080 --bind ::,然后 b 电脑使用 ipv6 地址+端口是无法访问的。

只有在 a 电脑的 OpenWrt 防火墙下转发一下,才可以正常访问。

但是,双方电脑都使用 tailscale 组网的情况下,双方是可以通过 ipv6 直连的。通过 tailscale ping 就可以看到 pong from b (100.64.0.4) via [2408:xxxx:xxx:xxx::9c8]:35973 in 8ms

我不理解,为什么 tailscale ( WireGuard )是可以做到直连的?双方电脑上建了个虚拟网卡进行连接,但是电脑的上一级是 OpenWrt ,OpenWrt 网口 1 收到数据包后发现不是自己的数据包,要转发给网口 2 ,所以也需要走 FORWARD 链吧?这样的话,默认 DROP 应该阻止连接。那 tailscale 又是怎么突破这一限制的?

3262 次点击
所在节点    程序员
33 条回复
FaiChou
37 天前
@COW #20 可能网络拓扑结构我没讲清楚。发送给 B 电脑的数据包,先是到达 B 的上级 OpenWrt ,OpenWrt 有两个网口,一个公网,一个内网,数据包先到达公网,然后转发给内网。对于 OpenWrt 来讲,什么虚拟网卡都不知道,数据包不是发给 OpenWrt 自己的,就不会再一层层解包处理,会根据路由表转发给内网,数据到达 B 电脑后,才会将数据转发到虚拟网卡来处理。
zbinlin
37 天前
你把所有的防火墙规则贴出来看下
FaiChou
37 天前
@lovelylain 对的,不管是 v4 还是 v6 ,防火墙默认是有 "iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT"这样一条的。从内部发出去的包,如果收到响应,默认是接收的。
FaiChou
37 天前
@zbinlin 我现在更倾向于我这 OpenWrt 的问题,昨天防火墙的 FORWARD 默认是 DROP ,经过开一个 server 测试,确实是这样的。但是 tailscale 能用 v6 直连。但今天再测,就不能用 v6 直连了,而且我现在把 FORWARD 规则改成默认 ACCEPT 也不行。

由于是办公室的网络环境,不太方便 flush 掉所有规则做测试,具体是这样的:


$ ip6tables -L FORWARD -vn
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
257K 161M forwarding_rule all * * ::/0 ::/0 /* !fw3: Custom forwarding rule chain */
226K 153M ACCEPT all * * ::/0 ::/0 ctstate RELATED,ESTABLISHED /* !fw3 */
16675 2716K zone_lan_forward all br-lan * ::/0 ::/0 /* !fw3 */
14322 5367K zone_wan_forward all pppoe-ppp * ::/0 ::/0 /* !fw3 */
0 0 zone_docker_forward all docker0 * ::/0 ::/0 /* !fw3 */
0 0 zone_ipsecserver_forward all ipsec0 * ::/0 ::/0 /* !fw3 */
0 0 reject all * * ::/0 ::/0 /* !fw3 */

# root @ OpenWrt in ~ [20:32:49]
$ iptables -L forwarding_rule -v -n
Chain forwarding_rule (1 references)
pkts bytes target prot opt in out source destination
1314K 1142M RETURN all -- pppoe+ * 0.0.0.0/0 0.0.0.0/0
886K 333M RETURN all -- * pppoe+ 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp+ * 0.0.0.0/0 0.0.0.0/0 ctstate NEW
0 0 ACCEPT all -- * ppp+ 0.0.0.0/0 0.0.0.0/0 ctstate NEW
FaiChou
37 天前
@FaiChou #24 数据包是这样走的,数据包来到网口 1 后,经过 forward 链,然后第一条是自建的`forwarding_rule`(我也不知道谁建的这条 rule ),这个 rule 表示,如果是从 `pppoe` 开头的网口,那么数据包会 RETURN ,RETURN 代表向下一条规则过滤,也就是走到 ACCEPT 这一条,这一条后面是 `ctstate RELATED,ESTABLISHED`,代表如果是出站过的流量,那么返回的响应是正常接收的。

然后就是下面这些 OpenWrt 自定义的规则了。能够看到数据包也小,数据量都是在 forwarding_rule 上,估计使用 tailscale 连接是被这条链捕获记录。
zbinlin
37 天前
@FaiChou 你试试分别 ping openwrt 和 a 电脑的 ipv6 ,看能不能 ping 通。
phenixc
37 天前
我猜 两台电脑的 tailscale 都是先主动连接 derp 服务器,属于出站请求,不受防火墙影响,电脑都和 derp 建立连接以后,防火墙会记录连接状态,不会阻断已经连接的入站数据。如果 derp 发现可以直连就把连接状态移交给电脑,不受防火墙影响
phenixc
37 天前
@phenixc 而你直接 连接 ip 对发起连接的一方是出站数据,不被阻断,对接收数据的一方属于入站数据,被阻断,所以不通
FaiChou
36 天前
@zbinlin #26 能 ping 通,有 icmp 和 icmpv6 相关的防火墙配置。这是 OpenWrt 默认的。
FaiChou
36 天前
@phenixc #27 你说的这种是打洞的原理。但实际上会复杂很多,如果是 v4 ,大部分网络环境都会限制来源 ip, derp 服务器的 ip 和别的 ip 不一样,防火墙也是给过滤掉的。也就是说,中转的数据包如果是一来一回的建立了连接,这种防火墙是准许的。也就是我在 25 楼讲的 ctstate RELATED,ESTABLISHED 行为。
TsukiMori
36 天前
Openwrt 防火墙规则里要允许 forward 啊
从 wan 侧到 lan 侧的
可以单独对一个主机的一个端口进行放行
zbinlin
36 天前
@FaiChou 既然 openwrt 放行了,电脑是什么系统的,有没有防火墙阻止。你在 openwrt 上抓下包看下
phenixc
36 天前
@FaiChou 我想表达的是客户端和 derp 服务器建立连接以后,可以让 derp 服务器协商两个客户端发起指向对方的出站请求

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

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

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

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

© 2021 V2EX