
wireguard 支持 IPv6 slaac 吗? 我知道 static ipv6 是可以,但是出局就得 nat6 了;dhcpv6 pd 拿到的前缀又会变,static 该怎么写?要是支持 slaac ,配置文件里 address 应该怎么写?
1 busier 2023-06-07 22:51:39 +08:00 via Android 不知道,不过弄 openvpn 的时候也遇到过这种问题,幸运的是 openvpn 服务器拿到了 /64 段,直接往下分配并路由,不用 NAT |
2 zbinlin 2023-06-07 22:53:09 +08:00 什么场景下需要把 slaac 分配的 ipv6 地址给 wireguard 用? |
4 yunisky 2023-06-07 23:04:29 +08:00 个人理解: wireguard 就是个隧道,只要隧道建立了,理论上来说在隧道接口上启动和 nd-ra 是没问题的。 但是这个 nd-ra 拿到的地址能不能通,和 allow-ips 又有关系。所以这两个配置应该要综合起来看。 以上是推测,未测试过。 |
5 shenyuzhi 2023-06-07 23:07:44 +08:00 wireguard 唯一的作用,就是基于三层的 udp ,建立了一个二层的点对点链接而已,就像 pppoe 那样。 不清楚 slaac ,不过理论上 IPv6 slaac 这些东西和 wireguard 没有一毛钱关系。wireguard 配置文件里面,你可以把 address 之类的字段都删掉,然后手动修改这个二层点对点链接的配置。 |
6 baobao1270 2023-06-07 23:15:34 +08:00 不支持,Wireguard 是三层协议,不是二层协议 |
7 shenyuzhi 2023-06-07 23:19:42 +08:00 |
8 dcsuibian 2023-06-07 23:59:36 +08:00 按我的理解: [Peer] PublicKey = peer 的公钥 Address = 192.168.3.4/32 Endpoint = 你的 remote 的 ipv6 地址 这样就完事了 |
10 3dxfood OP @yunisky 是这个道理,但是 windows client 上没有看到相关配置。貌似 wg 接口地址无论是 v4 还是 v6 都是在 wg 连接建立的时候才读取配置文件确定的,连接之后无论怎么更改 ipv4 或者 v6 地址连接都会断掉;配置文件中又没有任何字段能去配置 nd-ra ,所以这好像仅仅是理论。 |
12 3dxfood OP @dcsuibian 你对我需求的理解有偏差,我想实现的是通过 v4 的 wg 隧道通过 slaac 拿到远端的 v6 地址。 |
13 3dxfood OP @zbinlin 是的,没错。static 可以实现,但是远端的 prefix 是动态的,static 的方式是不可持续的。 |
14 NXzCH8fP20468ML5 2023-06-08 01:29:15 +08:00 wireguard 可以做到,但没有现成方案,需要你自行编码实现。 |
15 NXzCH8fP20468ML5 2023-06-08 01:31:20 +08:00 建议仔细评估 wireguard 上拿到 ipv6 slaac 地址是不是一个伪需求? |
16 CoolZxp 2023-06-08 02:12:48 +08:00 目前没有现成方案,需要自己修改源码编译才可以。 最简单的方法是用 nat ,可以用 netmap 做内网地址和公网地址的 1 对 1 映射,用起来的公网没有区别。 |
17 zbinlin 2023-06-08 10:39:21 +08:00 就像上面有人说的,wireguard 是在三层上的,而 slaac 是在二层上的,所以是不能直接支持的。 但理论上可以创建一个 gretap 类型的 tunnel ,而 gretap 跑在 wireguard 上来间接支持 SLAAC 。(但好像你的系统是 win 的,不太清楚是否在 win 上没有没类似 gretap 的 tunnel ) |
18 thereone 2023-06-08 10:52:14 +08:00 直接用 softether 就行,这个传递二层不要太简单了。 |
19 raysonx 2023-06-08 13:18:03 +08:00 @baobao1270 @shenyuzhi @zbinlin SLAAC 基于 ICMPv6 ,是跑在三层之上的。理论上可以在 wireguard 上跑(如果配置好 link-local 地址并且接受相应的组播地址的话),但没有现成的实现。 |
21 raysonx 2023-06-08 21:49:58 +08:00 @zbinlin RFC 4443: https://www.rfc-editor.org/rfc/rfc4443#section-2.1 Every ICMPv6 message is preceded by an IPv6 header and zero or more IPv6 extension headers. ICMPv6 消息外层是 IPv6 头,所以三层隧道上是可以路 ICMPv6 的。ping 也是基于 ICMPv6 ,二层不能跨路由器,而你可以 Ping 全球任何一个地址。 |
23 raysonx 2023-06-08 22:00:07 +08:00 一个典型的 SLAAC 分配地址的过程是: 1. 客户端向 ff02::2 组播地址发送 ICMP6 router solicitation 。所有支持 IPv6 的路由器都会监听这个组播地址。 2. 路由器向 ff02::1 组播地址发送 ICMP6, router advertisement ,包含前缀等信息。所有支持 IPv6 的任何设备都会监听这个组播地址。 3. 客户端拿前到前缀后,自己拼接一个 64 位的后缀,然后向一个特殊的组播地址(根据后缀利用哈希算法计算得出,自己也会监听这个地址)发送多次 ICMP6 neighbor solicitation 来检测地址冲突。 4. 如果没有其他设备回应,则表示这地地址没有被使用,则客户端使用这个地址。 |
24 ayasakinagi 2023-06-09 02:21:31 +08:00 不支持, wireguard 是 l3, SLAAC 需要 l2 通信, 可以基于 wireguard 建立 vxlan 隧道, 这个可以 l2 通信 |
25 tavimori 2023-06-09 12:49:51 +08:00 @raysonx 是的,从协议上看,主要是现在 wg 的内部路由不支持组播特性。如果是只有一个客户端和一个服务端的话,貌似只要把组播地址加到 AllowedIP 里好像还是有可能实现的。不过不知道现成的 SLAAC 协议服务支不支持 tun device 。 |
26 nullizer 2023-06-12 17:08:42 +08:00 可以使用 NPTv6 自动转换前缀,wireguard 里配个静态地址就好了。这些功能在 nftables/iptables 里又叫 netmap 。 https://stackoverflow.com/questions/53683498/how-to-do-netmap-by-nftables |
27 wolonggl 2023-06-23 23:53:41 +08:00 via Android gretap over wg |
28 dalaoshu25 2024-10-16 19:32:42 +08:00 在 RouterOS 上用 netmap 搞定了,本质还是静态地址,但是从外面可以直接访问。其实还挺简单的。 |