V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
3dxfood
V2EX  ›  宽带症候群

wireguard 支持 IPv6 slaac 吗?

  •  
  •   3dxfood · 2023-06-07 22:39:14 +08:00 · 2917 次点击
    这是一个创建于 566 天前的主题,其中的信息可能已经有所发展或是发生改变。

    wireguard 支持 IPv6 slaac 吗? 我知道 static ipv6 是可以,但是出局就得 nat6 了;dhcpv6 pd 拿到的前缀又会变,static 该怎么写?要是支持 slaac ,配置文件里 address 应该怎么写?

    28 条回复    2024-10-16 19:32:42 +08:00
    busier
        1
    busier  
       2023-06-07 22:51:39 +08:00 via Android
    不知道,不过弄 openvpn 的时候也遇到过这种问题,幸运的是 openvpn 服务器拿到了 /64 段,直接往下分配并路由,不用 NAT
    zbinlin
        2
    zbinlin  
       2023-06-07 22:53:09 +08:00
    什么场景下需要把 slaac 分配的 ipv6 地址给 wireguard 用?
    3dxfood
        3
    3dxfood  
    OP
       2023-06-07 23:00:04 +08:00
    @zbinlin
    remote 有 ipv6 而本地没有的时候
    yunisky
        4
    yunisky  
       2023-06-07 23:04:29 +08:00
    个人理解:
    wireguard 就是个隧道,只要隧道建立了,理论上来说在隧道接口上启动和 nd-ra 是没问题的。
    但是这个 nd-ra 拿到的地址能不能通,和 allow-ips 又有关系。所以这两个配置应该要综合起来看。
    以上是推测,未测试过。
    shenyuzhi
        5
    shenyuzhi  
       2023-06-07 23:07:44 +08:00
    wireguard 唯一的作用,就是基于三层的 udp ,建立了一个二层的点对点链接而已,就像 pppoe 那样。
    不清楚 slaac ,不过理论上 IPv6 slaac 这些东西和 wireguard 没有一毛钱关系。wireguard 配置文件里面,你可以把 address 之类的字段都删掉,然后手动修改这个二层点对点链接的配置。
    baobao1270
        6
    baobao1270  
       2023-06-07 23:15:34 +08:00   ❤️ 1
    不支持,Wireguard 是三层协议,不是二层协议
    shenyuzhi
        7
    shenyuzhi  
       2023-06-07 23:19:42 +08:00
    到底支不支持,取决于 IPv6 slaac 能否运行在二层点对点链接上,和 wireguard 没关系。
    dcsuibian
        8
    dcsuibian  
       2023-06-07 23:59:36 +08:00
    按我的理解:
    [Peer]
    PublicKey = peer 的公钥
    Address = 192.168.3.4/32
    Endpoint = 你的 remote 的 ipv6 地址
    这样就完事了
    zbinlin
        9
    zbinlin  
       2023-06-08 00:05:34 +08:00
    @3dxfood 你是想将 remote 的 ipv6 地址通过 wireguard 分配给本地用?
    3dxfood
        10
    3dxfood  
    OP
       2023-06-08 00:08:41 +08:00
    @yunisky 是这个道理,但是 windows client 上没有看到相关配置。貌似 wg 接口地址无论是 v4 还是 v6 都是在 wg 连接建立的时候才读取配置文件确定的,连接之后无论怎么更改 ipv4 或者 v6 地址连接都会断掉;配置文件中又没有任何字段能去配置 nd-ra ,所以这好像仅仅是理论。
    3dxfood
        11
    3dxfood  
    OP
       2023-06-08 00:09:20 +08:00
    @shenyuzhi 同上
    3dxfood
        12
    3dxfood  
    OP
       2023-06-08 00:10:45 +08:00
    @dcsuibian 你对我需求的理解有偏差,我想实现的是通过 v4 的 wg 隧道通过 slaac 拿到远端的 v6 地址。
    3dxfood
        13
    3dxfood  
    OP
       2023-06-08 00:12:19 +08:00
    @zbinlin 是的,没错。static 可以实现,但是远端的 prefix 是动态的,static 的方式是不可持续的。
    NXzCH8fP20468ML5
        14
    NXzCH8fP20468ML5  
       2023-06-08 01:29:15 +08:00
    wireguard 可以做到,但没有现成方案,需要你自行编码实现。
    NXzCH8fP20468ML5
        15
    NXzCH8fP20468ML5  
       2023-06-08 01:31:20 +08:00
    建议仔细评估 wireguard 上拿到 ipv6 slaac 地址是不是一个伪需求?
    CoolZxp
        16
    CoolZxp  
       2023-06-08 02:12:48 +08:00
    目前没有现成方案,需要自己修改源码编译才可以。
    最简单的方法是用 nat ,可以用 netmap 做内网地址和公网地址的 1 对 1 映射,用起来的公网没有区别。
    zbinlin
        17
    zbinlin  
       2023-06-08 10:39:21 +08:00
    就像上面有人说的,wireguard 是在三层上的,而 slaac 是在二层上的,所以是不能直接支持的。
    但理论上可以创建一个 gretap 类型的 tunnel ,而 gretap 跑在 wireguard 上来间接支持 SLAAC 。(但好像你的系统是 win 的,不太清楚是否在 win 上没有没类似 gretap 的 tunnel )
    thereone
        18
    thereone  
       2023-06-08 10:52:14 +08:00
    直接用 softether 就行,这个传递二层不要太简单了。
    raysonx
        19
    raysonx  
       2023-06-08 13:18:03 +08:00   ❤️ 1
    @baobao1270
    @shenyuzhi
    @zbinlin

    SLAAC 基于 ICMPv6 ,是跑在三层之上的。理论上可以在 wireguard 上跑(如果配置好 link-local 地址并且接受相应的组播地址的话),但没有现成的实现。
    zbinlin
        20
    zbinlin  
       2023-06-08 13:40:01 +08:00
    @raysonx ICMPv6 不是第二层(网络层)的吗?
    raysonx
        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 全球任何一个地址。
    terrancesiu
        22
    terrancesiu  
       2023-06-08 21:56:13 +08:00 via iPhone
    没有现成的实现,cloudflare 大规模使用 wg 还是基于 api 的方式
    raysonx
        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. 如果没有其他设备回应,则表示这地地址没有被使用,则客户端使用这个地址。
    ayasakinagi
        24
    ayasakinagi  
       2023-06-09 02:21:31 +08:00
    不支持, wireguard 是 l3, SLAAC 需要 l2 通信, 可以基于 wireguard 建立 vxlan 隧道, 这个可以 l2 通信
    tavimori
        25
    tavimori  
       2023-06-09 12:49:51 +08:00
    @raysonx 是的,从协议上看,主要是现在 wg 的内部路由不支持组播特性。如果是只有一个客户端和一个服务端的话,貌似只要把组播地址加到 AllowedIP 里好像还是有可能实现的。不过不知道现成的 SLAAC 协议服务支不支持 tun device 。
    nullizer
        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
    wolonggl
        27
    wolonggl  
       2023-06-23 23:53:41 +08:00 via Android
    gretap over wg
    dalaoshu25
        28
    dalaoshu25  
       70 天前
    在 RouterOS 上用 netmap 搞定了,本质还是静态地址,但是从外面可以直接访问。其实还挺简单的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3028 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:26 · PVG 22:26 · LAX 06:26 · JFK 09:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.