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 1
不支持,Wireguard 是三层协议,不是二层协议
|
7
shenyuzhi 2023-06-07 23:19:42 +08:00
到底支不支持,取决于 IPv6 slaac 能否运行在二层点对点链接上,和 wireguard 没关系。
|
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 1
@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 全球任何一个地址。 |
22
terrancesiu 2023-06-08 21:56:13 +08:00 via iPhone
没有现成的实现,cloudflare 大规模使用 wg 还是基于 api 的方式
|
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 37 天前
在 RouterOS 上用 netmap 搞定了,本质还是静态地址,但是从外面可以直接访问。其实还挺简单的。
|