wireguard 支持 IPv6 slaac 吗? 我知道 static ipv6 是可以,但是出局就得 nat6 了;dhcpv6 pd 拿到的前缀又会变,static 该怎么写?要是支持 slaac ,配置文件里 address 应该怎么写?
1
busier 118 天前 via Android
不知道,不过弄 openvpn 的时候也遇到过这种问题,幸运的是 openvpn 服务器拿到了 /64 段,直接往下分配并路由,不用 NAT
|
2
zbinlin 118 天前
什么场景下需要把 slaac 分配的 ipv6 地址给 wireguard 用?
|
4
yunisky 118 天前
个人理解:
wireguard 就是个隧道,只要隧道建立了,理论上来说在隧道接口上启动和 nd-ra 是没问题的。 但是这个 nd-ra 拿到的地址能不能通,和 allow-ips 又有关系。所以这两个配置应该要综合起来看。 以上是推测,未测试过。 |
![]() |
5
shenyuzhi 118 天前
wireguard 唯一的作用,就是基于三层的 udp ,建立了一个二层的点对点链接而已,就像 pppoe 那样。
不清楚 slaac ,不过理论上 IPv6 slaac 这些东西和 wireguard 没有一毛钱关系。wireguard 配置文件里面,你可以把 address 之类的字段都删掉,然后手动修改这个二层点对点链接的配置。 |
![]() |
6
baobao1270 118 天前 ![]() 不支持,Wireguard 是三层协议,不是二层协议
|
![]() |
7
shenyuzhi 118 天前
到底支不支持,取决于 IPv6 slaac 能否运行在二层点对点链接上,和 wireguard 没关系。
|
8
dcsuibian 118 天前
按我的理解:
[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 ,所以这好像仅仅是理论。
|
14
xxfye 118 天前
wireguard 可以做到,但没有现成方案,需要你自行编码实现。
|
15
xxfye 118 天前
建议仔细评估 wireguard 上拿到 ipv6 slaac 地址是不是一个伪需求?
|
16
CoolZxp 118 天前
目前没有现成方案,需要自己修改源码编译才可以。
最简单的方法是用 nat ,可以用 netmap 做内网地址和公网地址的 1 对 1 映射,用起来的公网没有区别。 |
17
zbinlin 118 天前
就像上面有人说的,wireguard 是在三层上的,而 slaac 是在二层上的,所以是不能直接支持的。
但理论上可以创建一个 gretap 类型的 tunnel ,而 gretap 跑在 wireguard 上来间接支持 SLAAC 。(但好像你的系统是 win 的,不太清楚是否在 win 上没有没类似 gretap 的 tunnel ) |
18
thereone 118 天前
直接用 softether 就行,这个传递二层不要太简单了。
|
![]() |
19
raysonx 118 天前 ![]() @baobao1270
@shenyuzhi @zbinlin SLAAC 基于 ICMPv6 ,是跑在三层之上的。理论上可以在 wireguard 上跑(如果配置好 link-local 地址并且接受相应的组播地址的话),但没有现成的实现。 |
![]() |
21
raysonx 117 天前
@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 全球任何一个地址。 |
![]() |
22
terrancesiu 117 天前 via iPhone
没有现成的实现,cloudflare 大规模使用 wg 还是基于 api 的方式
|
![]() |
23
raysonx 117 天前
一个典型的 SLAAC 分配地址的过程是:
1. 客户端向 ff02::2 组播地址发送 ICMP6 router solicitation 。所有支持 IPv6 的路由器都会监听这个组播地址。 2. 路由器向 ff02::1 组播地址发送 ICMP6, router advertisement ,包含前缀等信息。所有支持 IPv6 的任何设备都会监听这个组播地址。 3. 客户端拿前到前缀后,自己拼接一个 64 位的后缀,然后向一个特殊的组播地址(根据后缀利用哈希算法计算得出,自己也会监听这个地址)发送多次 ICMP6 neighbor solicitation 来检测地址冲突。 4. 如果没有其他设备回应,则表示这地地址没有被使用,则客户端使用这个地址。 |
24
ayasakinagi 117 天前
不支持, wireguard 是 l3, SLAAC 需要 l2 通信, 可以基于 wireguard 建立 vxlan 隧道, 这个可以 l2 通信
|
25
tavimori 117 天前
@raysonx 是的,从协议上看,主要是现在 wg 的内部路由不支持组播特性。如果是只有一个客户端和一个服务端的话,貌似只要把组播地址加到 AllowedIP 里好像还是有可能实现的。不过不知道现成的 SLAAC 协议服务支不支持 tun device 。
|
26
nullizer 113 天前
可以使用 NPTv6 自动转换前缀,wireguard 里配个静态地址就好了。这些功能在 nftables/iptables 里又叫 netmap 。
https://stackoverflow.com/questions/53683498/how-to-do-netmap-by-nftables |
27
wolonggl 102 天前 via Android
gretap over wg
|