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

联通宽带, Linux 下自动取得了 2 个 IPv6 地址从而无法上连接 IPv6 网站的问题(Windows 正常)

  •  
  •   huyanprc · 2019-06-29 11:21:14 +08:00 · 6191 次点击
    这是一个创建于 1762 天前的主题,其中的信息可能已经有所发展或是发生改变。

    联通宽带,已开通 IPv6。电脑通过无线连接到家庭网关(光猫兼路由器)。电脑双系统(原生,非虚拟机),Windows+Linux ( Debian 9 )。

    在 Windows 下使用 IPv6 正常,ipconfig 命令看到可自动分配到 3 个公网 IPv6 地址。2 个普通的 1 个临时的,3 个地址都在路由器页面显示的前缀范围之内。

    在 Linux ( Debian 9 )下,无法访问 IPv6 网站。使用 ip addr 命令查看,分配到了 2 个公网 IPv6 地址,其中一个在路由器页面显示的前缀范围之内,另一个在前缀范围之外。经测试,如果使用 ip addr del 把后一个 IPv6 地址删除,则可以正常访问 IPv6 网站。但下一次联网之后,又会自动得到 2 个 IPv6 地址从而无法访问 IPv6 网站。

    请问这个异常的 IPv6 地址是怎么来的?为什么只有 Linux 有而在 Windows 下没有?如何解决这个问题,让 Linux 可以正常访问 IPv6 网站。谢谢!

    3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
        link/ether a0:a4:c5:xx:xx:xx brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic wlp3s0
           valid_lft 85412sec preferred_lft 85412sec
        inet6 2408:x:1506:x:x:x:x:x/128 scope global dynamic <- 异常的 IPv6 地址
           valid_lft 252165sec preferred_lft 165765sec
        inet6 2408:x:150c:x:x:x:x:x/64 scope global noprefixroute dynamic <- 正常的 IPv6 地址
           valid_lft 216820sec preferred_lft 130420sec
        inet6 fe80::x:f7dc:x:x/64 scope link 
           valid_lft forever preferred_lft forever
    
    19 条回复    2019-06-30 10:30:19 +08:00
    Judoon
        1
    Judoon  
       2019-06-29 11:31:28 +08:00
    看看本机上 v6 的路由先
    huyanprc
        2
    huyanprc  
    OP
       2019-06-29 11:36:46 +08:00
    @Judoon 是看这些吗? 150c 是正常的前缀,1502、1504、1506 不知道是些什么。
    ```
    $ ip -6 r
    2408:x:1502:x:x:x:x:x dev wlp3s0 proto kernel metric 256 expires 232916sec pref medium
    2408:x:1504:x:x:x:x:x dev wlp3s0 proto kernel metric 256 expires 245044sec pref medium
    2408:x:1506:x:x:x:x:x dev wlp3s0 proto kernel metric 256 expires 251110sec pref medium
    2408:x:150c:x::/64 dev wlp3s0 proto ra metric 600 pref medium
    fe80::1 dev wlp3s0 proto static metric 600 pref medium
    fe80::/64 dev wlp3s0 proto kernel metric 256 pref medium
    default via fe80::1 dev wlp3s0 proto static metric 600 pref medium
    ```
    raysonx
        3
    raysonx  
       2019-06-29 11:40:43 +08:00 via iPad
    提出贴出的那个异常的 ipv6 地址前缀是长度是 /128,初步估计是由 dhcpv6 分配的。正常的那个估计是由 RA 无状态分配的。
    推测楼主网关的 dhcpv6 服务配置有误或存在 bug
    iwtbauh
        4
    iwtbauh  
       2019-06-29 11:43:40 +08:00
    楼上正解,应该是路由器的 DHCPv6 服务器配置有误或存在 bug

    执行以下命令(以 root )

    apt install ndisc6

    #并贴出输出
    # 请自行替换接口名称

    rdisc6 -m -n -v wlan0
    dhclient -6 -v wlan0
    huyanprc
        5
    huyanprc  
    OP
       2019-06-29 11:45:57 +08:00
    @raysonx 我也看了我的家庭网关中的 DHCPv6 相关配置,它默认是开启的。但无论开启还是关闭 DHCPv6,重新连接网络之后效果都是一样的。这个 DHCPv6 页面中,分配地址段写的是“ fe80::1/64 ”,已分配的地址中并没有“ 2408:x:1506:x:x:x:x:x/128 ”。
    raysonx
        6
    raysonx  
       2019-06-29 11:50:21 +08:00 via iPad
    @huyanprc 看你二楼贴的路由表里面,150c 这条路由是 RA 分配无期限的,但其它几条都有租约倒计时,所以证明是 dhcpv6 分配。
    huyanprc
        7
    huyanprc  
    OP
       2019-06-29 11:55:52 +08:00
    @iwtbauh 命令输出如下。只看到了 150c,没有看到 1506。

    ```
    x@x:~$ sudo rdisc6 -m -n -v wlp3s0
    Soliciting ff02::2 (ff02::2) on wlp3s0...

    Hop limit : 255 ( 0xff)
    Stateful address conf. : Yes
    Stateful other conf. : Yes
    Mobile home agent : No
    Router preference : medium
    Neighbor discovery proxy : No
    Router lifetime : 1800 (0x00000708) seconds
    Reachable time : unspecified (0x00000000)
    Retransmit time : unspecified (0x00000000)
    Prefix : 2408:x:150c:x::/64
    On-link : Yes
    Autonomous address conf.: Yes
    Valid time : 214723 (0x000346c3) seconds
    Pref. time : 128323 (0x0001f543) seconds
    Recursive DNS server : fe80::1
    DNS server lifetime : 1800 (0x00000708) seconds
    MTU : 1500 bytes (valid)
    Source link-layer address: 30:50:FD:xx:xx:xx
    from fe80::1
    x@x:~$ sudo dhclient -6 -v wlp3s0
    Internet Systems Consortium DHCP Client 4.3.5
    Copyright 2004-2016 Internet Systems Consortium.
    All rights reserved.
    For info, please visit https://www.isc.org/software/dhcp/

    Listening on Socket/wlp3s0
    Sending on Socket/wlp3s0
    PRC: Confirming active lease (INIT-REBOOT).
    XMT: Forming Confirm, 0 ms elapsed.
    XMT: X-- IA_NA c5:93:f8:37
    XMT: | X-- Confirm Address 2408:x:150c:x::1
    XMT: V IA_NA appended.
    XMT: Confirm on wlp3s0, interval 1070ms.
    RCV: Reply message on wlp3s0 from fe80::1.
    RCV: X-- IA_NA c5:93:f8:37
    RCV: | X-- starts 1561780238
    RCV: | X-- t1 - renew +64169
    RCV: | X-- t2 - rebind +102670
    RCV: | X-- [Options]
    RCV: | | X-- IAADDR 2408:x:150c:x::1
    RCV: | | | X-- Preferred lifetime 128338.
    RCV: | | | X-- Max lifetime 214738.
    RCV: X-- Server ID: 00:03:00:06:30:50:fd:xx:xx:xx
    message status code Success.
    PRC: Bound to lease 00:03:00:06:30:50:fd:xx:xx:xx.
    ```
    iwtbauh
        8
    iwtbauh  
       2019-06-29 12:18:55 +08:00
    @huyanprc #7

    你的 DHCPv6 客户端在 renew 旧地址而不是请求新地址。

    首先,如果你正使用 X,关闭网络管理器

    service NetworkManager stop

    然后,删除接口上的已分配的所有地址(但必须保留链路本地地址)

    ifconfig wlan0
    .....

    ifconfig wlan0 inet6 del XXXX:XXXX:XXXX::7df
    ifconfig wlan0 inet6 del ...

    确保你在一个干净的环境下,然后运行 ISC DHCP Client

    dhclient -6 -v wlan0
    huyanprc
        9
    huyanprc  
    OP
       2019-06-29 13:22:19 +08:00
    在干净的环境中,DHCP 获得到了一个 150c 的 IP,是前缀网段中的第 1 个 IP。然而,子网是 /128 而非 /64 的。在仅得到这个 IP 之后,仍然无法访问 IPv6 网站。

    ```
    x@x:~$ sudo dhclient -6 -v wlp3s0
    ...

    Listening on Socket/wlp3s0
    Sending on Socket/wlp3s0
    PRC: Confirming active lease (INIT-REBOOT).
    XMT: Forming Confirm, 0 ms elapsed.
    XMT: X-- IA_NA c5:xx:xx:xx
    XMT: | X-- Confirm Address 2408:x:150c:x::1
    XMT: V IA_NA appended.
    XMT: Confirm on wlp3s0, interval 1090ms.
    XMT: Forming Confirm, 1090 ms elapsed.
    XMT: X-- IA_NA c5:xx:xx:xx
    XMT: | X-- Confirm Address 2408:x:150c:x::1
    XMT: V IA_NA appended.
    XMT: Confirm on wlp3s0, interval 2140ms.
    XMT: Forming Confirm, 3230 ms elapsed.
    XMT: X-- IA_NA c5:xx:xx:xx
    XMT: | X-- Confirm Address 2408:x:150c:x::1
    XMT: V IA_NA appended.
    XMT: Confirm on wlp3s0, interval 4170ms.
    XMT: Forming Confirm, 7400 ms elapsed.
    XMT: X-- IA_NA c5:xx:xx:xx
    XMT: | X-- Confirm Address 2408:x:150c:x::1
    XMT: V IA_NA appended.
    XMT: Confirm on wlp3s0, interval 2600ms.
    Max retransmission duration exceeded.
    PRC: Bound to lease 00:03:00:06:30:50:fd:xx:xx:xx.

    x@x:~$ ip addr
    ...
    3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a0:a4:c5:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 brd 192.168.1.255 scope global dynamic wlp3s0
    valid_lft 86382sec preferred_lft 86382sec
    inet6 2408:x:150c:x::1/128 scope global
    valid_lft forever preferred_lft forever
    inet6 fe80::x:f7dc:x:x/64 scope link
    valid_lft forever preferred_lft forever
    ```
    iwtbauh
        10
    iwtbauh  
       2019-06-29 14:48:46 +08:00 via Android
    @huyanprc #9

    DHCPv6 ( XA_NA )获得的地址就是 /128 的。即只分配一个地址。通过 DHCP-DP 或者才会分配“一段地址”。这也是为什么我们猜测认为你错误的地址来自 DHCPv6 的原因之一。

    “在仅得到这个 IP 之后,仍然无法访问 IPv6 网站。”
    查看路由表是否正确

    route -A inet6 -n
    huyanprc
        11
    huyanprc  
    OP
       2019-06-29 16:31:36 +08:00
    @iwtbauh 情况如下,没有看出异常在哪里……

    默认情况下,取得两个 IPv6 地址,无法访问 IPv6 网站时的路由:
    ```
    Kernel IPv6 routing table
    Destination Next Hop Flag Met Ref Use If
    2408:x:1502:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:1504:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:1506:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:150c:x::/64 :: U 600 0 0 wlp3s0
    fe80::1/128 :: U 600 0 0 wlp3s0
    fe80::/64 :: U 256 0 0 wlp3s0
    ::/0 fe80::1 UG 600 8 22 wlp3s0
    ::/0 :: !n -1 1 10082 lo
    ::1/128 :: Un 0 9 90 lo
    2408:x:1506:x:x:x:x:f837/128 :: Un 0 1 0 lo
    2408:x:150c:x:x:x:x:d83f/128 :: Un 0 2 3 lo
    fe80::x:x:x:x/128 :: Un 0 2 3 lo
    ff00::/8 :: U 256 7 27 wlp3s0
    ::/0 :: !n -1 1 10082 lo
    ```

    手工删除 1506 的 IP 地址,保留 150c 的 IP 地址之后,可以访问 IPv6 网站时的路由:
    ```
    Kernel IPv6 routing table
    Destination Next Hop Flag Met Ref Use If
    2408:x:1502:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:1504:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:1506:x:x:x:x:f837/128 :: Ue 256 0 0 wlp3s0
    2408:x:150c:x::/64 :: U 600 0 0 wlp3s0
    fe80::/64 :: U 256 0 0 wlp3s0
    ::/0 :: !n -1 1 9594 lo
    ::1/128 :: Un 0 9 80 lo
    2408:x:150c:x:x:x:x:d83f/128 :: Un 0 5 629 lo
    fe80::x:x:x:x/128 :: Un 0 5 475 lo
    ff00::/8 :: U 256 8 206 wlp3s0
    ::/0 :: !n -1 1 9594 lo
    ```


    手工删除所有 IP 地址,使用 dhclient 取得 IP 地址之后,无法访问 IPv6 网站时的路由:
    ```
    Kernel IPv6 routing table
    Destination Next Hop Flag Met Ref Use If
    2408:x:150c:x::1/128 :: U 256 0 0 wlp3s0
    fe80::/64 :: U 256 5 7 wlp3s0
    ::/0 :: !n -1 1 9821 lo
    ::1/128 :: Un 0 9 84 lo
    2408:x:150c:x::1/128 :: Un 0 1 0 lo
    fe80::x:x:x:x/128 :: Un 0 2 9 lo
    ff00::/8 :: U 256 6 20 wlp3s0
    ::/0 :: !n -1 1 9821 lo
    ```
    iwtbauh
        12
    iwtbauh  
       2019-06-29 19:29:27 +08:00 via Android
    @huyanprc #11

    在“手工删除 1506 的 IP 地址,保留 150c 的 IP 地址之后,可以访问 IPv6 网站时的路由”里面,你给的输出里面,默认路由都木有了,你是怎么上的 ipv6 网站啊,你确定不是因为你上的是双栈主机走的 v4 吗。

    traceroute6 test-ipv6.com

    浏览器访问 test-ipv6.com 能显示 ipv6 地址吗

    在“手工删除 1506 的 IP 地址,保留 150c 的 IP 地址之后,可以访问 IPv6 网站时的路由:”中,没有 ipv6 默认路由,因此无法访问 ipv6 网站是正常的。这可能是因为 isc dhcp client 的 ipv6 模式不会自动添加默认路由。

    至于第一次为什么会获取到另外不对的 ipv6 地址,很抱歉我现在并没有想明白。有可能是你的网络里还有其他设备也开启了 dhcpv6 服务器分配地址,最大的可能应该是路由器实现有 bug。此外可以抓包分析一下。debian 的 bug 也不是不可能,但 debian 9 和 debian10 我这里都不能复现问题。

    此外,说一点其他的,看你的第一个路由表,你的路由器的链路本地地址竟然是“ fe80::1 ”。现在我的内心毫无波动。这是哪个天才相出来的方案,还是单纯应付“要加 ipv6 支持”随便做出来的东西。换个路由器可能是个好办法。
    jousca
        13
    jousca  
       2019-06-29 21:20:35 +08:00
    @iwtbauh 插播一句,路由器的链路本地地址竟然是“ fe80::1 ”。

    你别说,我路由器的 LAN 端地址就是这个。哈哈哈。

    IPv6 地址 . . . . . . . . . . . . : 2409:8a62:51f:17e0::9(首选)
    获得租约的时间 . . . . . . . . . : 2019 年 6 月 29 日 19:08:24
    租约过期的时间 . . . . . . . . . : 2019 年 7 月 2 日 19:08:24
    本地链接 IPv6 地址. . . . . . . . : fe80::381a:38d3:c813:d2f5%11(首选)
    默认网关. . . . . . . . . . . . . : fe80::1%11

    不耽误我用 IPV6 上网……
    jousca
        14
    jousca  
       2019-06-29 21:23:28 +08:00
    我说个经验,如果光猫能自动分配 IPV6 地址,路由器就不要掺和 IPV6 分配,不要打开任何 IPV6 DHCP 配置。让光猫自己往下分就完了。 中途两个都在分地址就要出问题。
    huyanprc
        15
    huyanprc  
    OP
       2019-06-29 22:27:44 +08:00
    @iwtbauh 我刚才又确认了一下,在“手工删除 1506 的 IP 地址,保留 150c 的 IP 地址之后,可以访问 IPv6 网站时的路由”里面,route 命令的输出没有粘贴错,是没有显示默认路由。我之前是用 ipv6.he.net 测试的,web 和 traceroute6 都试过,这种情况下走的确实是 IPv6,web 能显示 IPv6 地址。其他两种不能访问 IPv6 的情况下,web 上显示的是 IPv4 地址,traceroute6 没有响应。
    huyanprc
        16
    huyanprc  
    OP
       2019-06-29 22:30:58 +08:00
    @jousca 我这边是联通 DT741-csf 家庭网关,兼具光猫与路由器功能。RA 的选项是有效果的,但 DHCPv6 的选项无论开启还是禁用都一个样,都是获得了两个 IPv6 地址。

    如果是光猫 /路由器的问题,为什么在 Windows 和 Linux 下行为不同呢?
    jousca
        17
    jousca  
       2019-06-30 01:22:43 +08:00
    @huyanprc 那么看看你 linux 内核的配置呢,/etc/sysctl.conf 看看这个。

    关于 IPV6 应该是下面的内容

    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
    jousca
        18
    jousca  
       2019-06-30 01:28:56 +08:00
    我用 centos 多一些。但是没遇到楼主这种情况。

    个人感觉是系统自动给你编了一个 IPV6 地址作为默认,然后就上不去了。而且你 WINDOWS 下获得的 IPV6 有和我有区别。我电脑 windows 只会自动获得一个 IP V6 地址,没有特殊的临时地址。而且这个 IP 长时间几乎固定(取决于光猫上设置的过期时间)。我光猫开了 V6 DHCP 的。光猫的 V6 LAN 地址我手动设置是 fe80::1。其他都是运营商自己配。
    tia
        19
    tia  
       2019-06-30 10:30:19 +08:00
    尽量还是别用 dhcpv6,radvd 大法好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2917 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 15:18 · PVG 23:18 · LAX 08:18 · JFK 11:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.