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

开个新坑:写给 Geek 们的小范围 IPv6 组网最佳实践

  •  5
     
  •   raysonx · 2023-07-08 12:41:40 +08:00 · 6320 次点击
    这是一个创建于 508 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自 2017 年底,国内大多数地区的固定宽带和移动网络就开始提供 IPv6 接入了,平时逛宽带症候群区时也经常看到关于 IPv6 的种种问题。可能因为最近几年越来来多的用户失去了公网 IPv4 地址,肉眼可见 IPv6 有了更多的讨论度。

    本人自从十几年前就开始玩 IPv6 了,也在 V2EX 发过几篇关于 IPv6 的文章。之前曾打算专门抽出时间写一系列文章,旨在帮助各位 V 站 的 Geek 们在家庭等小范围进行 IPv6 组网,并为常见的问题提供解决方案,但是这个计划一再搁置,最终也没有去做。今天看到有人在我之前的帖子回复希望我能写点教程,这才又想起这件事。

    之前发过的帖主要有:

    根据我逛 V 站和其他地方得来的经验,我暂时想到了下面这些主题(想到的很多,不一定会写哪几个),不知各位有没有要补充的或者对某一方面特别感兴趣的?如果某一方面有很多人感兴趣,那我就多写一点或者提早写那一篇。目前想到的主题有:

    • 基础概念,如地址格式、子网划分、寻址过程(单播、组播、路由)、DNS 等
    • 地址分配 (无状态、有状态、DHCPv6-PD 、隐私扩展等)
    • 网络拓扑设计与网关配置
    • 各种系统下配置简单 IPv6 网关的最佳实践,如 OpenWRT 、RouterOS 、VyOS 、甚至是用普通的 Linux 发行版作路由器(配置比较麻烦可能懒得写)
    • 防火墙
    • 动态 DNS ( DDNS )
    • 网络地址转换( NPTv6 、NAT66 )
    • IPv6 路由 :静态路由、动态路由( OSPFv3 、BGP )
    • 各种隧道技术的应用,比如用 VPN 接通两地的内网、远程访问内网(内网穿透)等
    第 1 条附言  ·  2023-07-10 23:11:35 +08:00
    《处理动态前缀造成的种种问题》 https://v2ex.com/t/955636
    40 条回复    2023-08-20 23:37:32 +08:00
    xuangoer666
        1
    xuangoer666  
       2023-07-08 12:47:18 +08:00 via Android
    求:各种隧道技术的应用,比如用 VPN 接通两地的内网、远程访问内网(内网穿透)等
    tediorelee
        2
    tediorelee  
       2023-07-08 12:53:20 +08:00
    是大佬,mark 一下
    ylsf
        3
    ylsf  
       2023-07-08 14:07:39 +08:00 via Android
    期待大佬更新
    cpaig
        4
    cpaig  
       2023-07-08 14:23:10 +08:00
    都不太懂,等大佬都讲讲
    silverwolf
        5
    silverwolf  
       2023-07-08 14:32:25 +08:00
    IPv6 下开 AdGuard Home 服务器,如何像 IPv4 一样区分设备?目前的路由器支持 SLAAC 方式自动获取动态分配的 IPv6 公网地址,而 AdGuard Home 安装在一台 N1 盒子里。

    就 IPv4 网络而言,这很简单,在路由器上个每个设备设置 MAC 和 IPv4 绑定,LAN 口的 DNS 设置成 N1 盒子的 IP 即可。
    IPv6 打开以后,可以在 LAN 侧填写设置 IPv6 DNS 服务器地址,但这就要求填写一个固定地址。如果路由器可以配置 IPv6 ULA 地址还好说,但硬路由不支持。
    titanium98118
        6
    titanium98118  
       2023-07-08 15:37:59 +08:00 via Android
    我现在就是为局域网分配 ULA+NAT66 。双 wan 负载均衡貌似只能 NAT?
    Yien
        7
    Yien  
       2023-07-08 15:50:35 +08:00
    感谢大佬分享
    pk000
        8
    pk000  
       2023-07-08 15:58:07 +08:00 via iPhone
    可以通过 ULA 固定每个多个家之间设备地址,跨地域 IPv6 组网方式有简单的方案吗?
    raysonx
        9
    raysonx  
    OP
       2023-07-08 16:22:43 +08:00   ❤️ 1
    @silverwolf 请问区分设备的目的是什么?仅仅是为了在动态 IPv6 前缀的前提下给 N1 分配一个静态的 IPv6 地址来提供 DNS 服务吗?

    除了使用 ULA 之外,还可以使用 fe80 开头的 link-local 地址,对于绝大多数操作系统,这个地址通常是固定的。

    另外你还可以用第三个设备来跑 SLAAC 宣告一个 ULA 前缀,这个设备不必是你的路由器,这样所有设备都能拿到 ULA 地址,只需要记得不要宣告默认路由即可,比如用 radvd 的话,可以用下面的设置( AdvDefaultLifetime 0 可以关闭默认路由宣告):

    interface eth0
    {
    AdvSendAdvert on;
    prefix fd12:3456:7890:abcd::/64
    {
    AdvDefaultLifetime 0;
    };
    };
    raysonx
        10
    raysonx  
    OP
       2023-07-08 16:24:26 +08:00
    @xuangoer666
    @pk000
    跨地域组网肯定没有惟一方案,目前我是用 WireGuard + 动态路由协议。这个话题可以专门开一帖讨论。
    microka
        11
    microka  
       2023-07-08 16:24:50 +08:00
    向请问一下,普通家用路由器(比如华为 B610-4E )在开启 IPv6 拨号的使用环境下,能做(应该做)哪些安全设置?一个是路由器端,一个是局域网设备端(以 Windows 为例),谢谢。
    raysonx
        12
    raysonx  
    OP
       2023-07-08 16:26:48 +08:00
    @titanium98118 如果在路由器上做均衡只能 NAT ,因为个人用户没有自己的 PI ( provider-independent )地址,比如你没法向电信宣告联通的路由。如果把在客户端做均衡,可以直接把多个公网地址分配到客户端。这个确实是一个值得讨论的话题。
    silverwolf
        13
    silverwolf  
       2023-07-08 16:40:04 +08:00
    @raysonx 在 AdGuard Home 上根据 IP 地址区分设备,便于看到该设备请求了哪些域名。

    感谢科普,我打算按你给的方法在 N1 盒子上跑一个 SLAAC 宣告,给局域网的所有设备下发 IPv6 ULA 地址,并给 DNS 服务器一个固定的 ULA 地址。
    Jirajine
        14
    Jirajine  
       2023-07-08 16:57:06 +08:00
    一直想通过 nat64/dns64 部署纯 ipv6 内网,但主要有两大障碍:
    一是地址管理问题,因为 Android 的原因,ipv6 地址没法用纯有状态管理,slaac+隐私扩展让地址完全无法管理,没法根据设备的地址单独配置防火墙等。
    二是动态前缀问题。动态前缀让内网无法使用稳定地址,要稳定地址必须 nat ,但 nat 在 ipv6 里是 anti pattern ,坑也不少。很少有应用能支持在无状态前缀 nat 的情况下正确的地址发现。
    raysonx
        15
    raysonx  
    OP
       2023-07-08 17:16:49 +08:00
    @Jirajine 纯 IPv6 内网可是个大坑,大量应用软件甚至不能支持在 NAT64 环境下工作(只有 iOS 是个例外,多亏了苹果的审核机制)。

    > 一是地址管理问题,因为 Android 的原因,ipv6 地址没法用纯有状态管理,slaac+隐私扩展让地址完全无法管理,没法根据设备的地址单独配置防火墙等。

    你有专门为 Android 设备配置防火墙的需求吗?目前我自己的网络环境下,不提供服务的终端设备都是在同一个 VLAN 下,这个 VLAN 默认不允许从外网发起连接的。如果要提供服务,我看还是放弃 Android 为好。

    > 二是动态前缀问题。动态前缀让内网无法使用稳定地址,要稳定地址必须 nat ,但 nat 在 ipv6 里是 anti pattern ,坑也不少。很少有应用能支持在无状态前缀 nat 的情况下正确的地址发现。
    国内 ISP 给家宽分配的 PD 前缀确实是动态的。其实按照规范,如果设备的 DUID 不变,在租期内 ISP 应当分配静态的 PD 前缀,只是 ISP 不遵守而已。
    内网设备之间的通信还是用 ULA 吧。如果需要开放公网服务,只能建议用 DDNS 。
    veSir
        16
    veSir  
       2023-07-08 17:32:55 +08:00
    感谢分享!

    openwrt 23.05 fw4 需要设置 PMTU 命令吗?
    niubee1
        17
    niubee1  
       2023-07-08 17:39:13 +08:00
    @raysonx 确实如你所说,之前打算自己写个 P2P 穿透的程序的时候,被坑了
    0o0O0o0O0o
        18
    0o0O0o0O0o  
       2023-07-08 17:45:10 +08:00
    对第 4 5 9 3 1 2 7 8 条都感兴趣,排名分先后
    lih24338
        19
    lih24338  
       2023-07-08 17:51:34 +08:00 via Android
    所有的都感兴趣,期待更新。
    zooo
        20
    zooo  
       2023-07-08 17:53:36 +08:00
    正需要,期待更新呀
    raysonx
        21
    raysonx  
    OP
       2023-07-08 18:04:41 +08:00
    @veSir 需要。LUCI 上打开 Firewall 设置,点击 WAN 这个 zone 的设置,勾选 MSS clamping 。
    silverwolf
        22
    silverwolf  
       2023-07-08 19:10:27 +08:00   ❤️ 1
    @raysonx 成功了🎉

    上面那个 radvd.conf 有语法错误,改为:

    ```
    interface eth0
    {
    AdvSendAdvert on;
    AdvDefaultLifetime 0;
    prefix fd07:2023::/64 {};
    };
    ```
    silverwolf
        23
    silverwolf  
       2023-07-08 19:12:41 +08:00
    @silverwolf 我一开始看 error :6 不知道是什么语法错误,把第 6 行移出来就通过了
    Jirajine
        24
    Jirajine  
       2023-07-08 19:21:34 +08:00
    @raysonx 不工作的应用应该不多吧,也就 p2p 、nat traversal 以及网络相关的工具需要适配,普通应用应该是无感的(“fakeip”不会 break 的应用 nat64 应该也不会)。

    为不同设备配置不同的防火墙规则是刚需,比如限速、劫持、策略路由。因为 ap 的缘故我没法让设备通过不同 ssid 接入不同的 vlan ,即使换了 ap 这样也不方便,会破坏不同设备间依赖内网直连的应用。

    稳定地址不仅是内网通信,docker/虚拟机等不少应用也依赖稳定地址,ula 又失去了入站连通性,ula 配合 NAPT 无状态前缀转换好像很不错,但应用不一定能正确处理地址发现的问题。
    以及配置 ipv6 相关的 nat 基本要手写防火墙规则,也不好维护。
    u20237
        25
    u20237  
       2023-07-08 19:35:01 +08:00
    至少得实现聊天/上传/下载吧?那么根服务器在哪?
    Tink
        26
    Tink  
       2023-07-08 19:38:50 +08:00
    感谢大佬分享
    WhatTheBridgeSay
        27
    WhatTheBridgeSay  
       2023-07-08 21:02:21 +08:00
    我现在最想知道的是有没有可能在网关上 DDNS 更新局域网设备 SLAAC 出来的 IPV6 地址,以及 NDP 代理具体是是干嘛用的,按我的理解是用于设备发现用的,那是不是可以网关可以用来获取局域网设备的 IPV6 进而 DDNS ?
    yzc27
        28
    yzc27  
       2023-07-08 21:14:43 +08:00 via iPhone
    想请教一下大佬,路由器有 ipv6 防火墙开关,但没具体设置。把这个防火墙打开,那么这个路由器下面的设备的 ipv6 是不是处于被保护的状态?之面看有人说这个防火墙只保护路由器本身,它下面设备还是“裸奔”。
    sky96111
        29
    sky96111  
       2023-07-08 21:49:31 +08:00 via Android
    我最近使用 WireGuard IPv6 组网的时候遇到了 MTU 的问题,client 使用 wg 默认的 1420 ,服务端 OpenWrt 使用 PPPoE 拨号,dhcpv6-pd 获取 ipv6 地址。同时开启区域转发、MSS 钳制、IP 动态伪装,访问服务端出现有些资源无法访问,ping 又是正常的情况
    发现是 MTU 的问题后,用 ping -s 降低包大小进行测试,一直降低到 1382 时才正常
    想请教一下,为什么 MTU 会是 1382 ?而且它似乎有点太低了
    raysonx
        30
    raysonx  
    OP
       2023-07-09 08:40:34 +08:00   ❤️ 1
    @Jirajine 不工作的应用非常多,你试试就知道了。


    @WhatTheBridgeSay 有可能,但好像没有现成的实现,之前曾打算自己开发一个,但好像大家的兴趣不大。NDP proxy 类似于 IPv4 下的 ARP proxy ,一种让两个广播域共享同一网段的 hack 。

    @yzc27 路由器型号千奇百怪,无法统一回答。

    @sky96111 PPPoE 下 WireGuard 的 MTU 设定为 1412 就可以了。
    latteczy
        31
    latteczy  
       2023-07-09 11:01:11 +08:00
    请教一下,家里的网络已经支持 IPv6 ,主机也可以访问 IPv6 ,但是只有我的 MacBook 无法访问 IPv6 ,我的 MacBook 也有 IPv6 地址,但是 ping IPv6 网站解析出来的都是 IPv4 地址(比如 ping mirrors.aliyun.com ),在我家里的其他设备上 ping 这个域名解析出来的都是 IPv6 地址。
    请问这可能是什么原因?
    raysonx
        32
    raysonx  
    OP
       2023-07-09 13:32:43 +08:00
    @latteczy mac 要用 ping6
    t123yh
        33
    t123yh  
       2023-07-09 21:57:53 +08:00
    IPv6 怎么实现出口分流呢,比如我同时拉了电信和移动的宽带,是否可能在路由器上自动区分出口
    huaxie1988
        34
    huaxie1988  
       2023-07-09 23:15:53 +08:00   ❤️ 1
    @sky96111 测试的时候应该是 1384 吧? 1500-8 Bytes (PPPOE) – 40 Bytes (IPv6) – 8 Bytes (UDP) – 32 Bytes (WG) -20 Bytes (IPv4)-8 Bytes (ICMP),算出来就是 1384 ,mtu 1412
    huaxie1988
        35
    huaxie1988  
       2023-07-09 23:21:18 +08:00
    @t123yh 不用分流,只要把 2 个地址都分到用户侧,ipv6 会自动分流,IPV6 源地址选择有个特性,是优选和目标地址最长前缀匹配的地址,所以访问电信就选电信地址,访问移动就走移动地址,然后路由器上根据源地址送到对应的出口去,全自动分流。
    latteczy
        36
    latteczy  
       2023-07-10 17:26:31 +08:00
    @raysonx #32 感觉不是这个原因,在 mac 上刷 test-ipv6.com 也显示不支持 IPv6 ,就很奇怪。
    raysonx
        37
    raysonx  
    OP
       2023-07-10 22:34:01 +08:00
    @latteczy 所以你的 mac 真的获得 ipv6 地址了吗?你可以在 mac 上运行下面的命令并把结果发给我 (邮箱 base64 bWVAeXV4LmltCg==)看看:

    ifconfig

    netstat -nr
    ttvast
        38
    ttvast  
       2023-07-11 11:31:01 +08:00
    不用 nat 的 ipv6 就是垃圾。
    用了 nat ,为啥不直接用 v4 。

    除非宽带服务商给我分配固定/56 的网段。
    LodonBoy10086
        39
    LodonBoy10086  
       2023-07-13 15:16:47 +08:00
    raysonx 你好,有个有意思的防火墙相关 chaifeng/ufw-docker 。我想问问,怎么把它转成 ipv6 版?有什么其他的注意事项。
    echo1937
        40
    echo1937  
       2023-08-20 23:37:32 +08:00
    楼主有博客吗,方便进行历史内容的搜索和查看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:14 · PVG 10:14 · LAX 18:14 · JFK 21:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.