IPv6 连接超时

ppp*_*dox 7 networking debian ipv6 timeout

我遇到了 IPv6 连接问题。只有那些。他们大约每 10 分钟超时一次(我想是因为地址更新)。

发生在我在一年左右的时间里尝试过的每种基于 debian 的 linux,x86 和 x64,跨不同的 PC,有线和无线。

我目前正在使用带有内核 3.13.0-37-generic x86_64(以前是 3.2.0-60)和 NetworkManager 0.9.8.8 的 Linux Mint 17.1。有时,当我尝试立即重新启动下载时,我会收到“没有到主机的路由”。因为我的 IPv6 地址似乎暂时消失了。
像这样:http : //pastebin.com/4Xida2qu

我正在运行双栈 IPv4 - IPv6 (PPPoE),这是我的 Netgear DGND3700v2 路由器(固件版本 V1.1.00.22_1.00.22)的配置方式:http ://i.imgur.com/YgxAyQb.png

有问题的网络配置文件设置为忽略IPv6,但无论如何我都在获取全球 IPv6 地址。更改为 auto 没有任何区别。这令人困惑,但我想这只是内核在做它的工作。

防火墙规则或缺乏规则没有任何区别,但它们基本上是:

iptables -P INPUT DROP
ip6tables -P INPUT DROP
iptables -P FORWARD DROP
ip6tables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -I INPUT  -p icmpv6 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

尝试在 LAN 中使用 DHCP 而不是 autoconf,现在我在 Windows 上没有超时,但在 linux 上没有 ipv6 连接(即使我似乎有一个全局地址,但无论如何我都会遇到“网络无法访问”错误)。

tcpdump -vvni wlan0 icmp6输出的相关部分

目的地不可达:

19:25:05.381081 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 88) {GW's ipv6 - redacted} > {My pc's ipv6 link-local addr - redacted}: [icmp6 sum ok] ICMP6, destination unreachable, beyond scope 2001:760:ffff:b1::34, source address {My pc's ipv6 link-local addr - redacted}
19:25:12.948944 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 88) {GW's ipv6 - redacted} > {My pc's ipv6 link-local addr - redacted}: [icmp6 sum ok] ICMP6, destination unreachable, beyond scope 2001:760:ffff:b1::34, source address {My pc's ipv6 link-local addr - redacted}
19:25:18.446900 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 88) {GW's ipv6 - redacted} > {My pc's ipv6 link-local addr - redacted}: [icmp6 sum ok] ICMP6, destination unreachable, beyond scope 2001:760:ffff:b1::34, source address {My pc's ipv6 link-local addr - redacted}
Run Code Online (Sandbox Code Playgroud)

路由器请求:

19:25:18.775794 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) {Unknown link-local ipv6 addr - redacted} > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
      source link-address option (1), length 8 (1): {Unknown MAC - redacted}
        0x0000:  {Unknown MAC - redacted}
Run Code Online (Sandbox Code Playgroud)

路由器广告:

19:25:18.777825 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 112) {GW's ipv6 - redacted} > ff02::1: [icmp6 sum ok] ICMP6, router advertisement, length 112
    hop limit 64, Flags [other stateful], pref medium, router lifetime 1800s, reachable time 30000s, retrans time 1000s
      prefix info option (3), length 32 (4): 2a01:2000:2001:91b1::/64, Flags [onlink, auto], valid time 360s, pref. time 360s
        0x0000:  40c0 0000 0168 0000 0168 0000 0000 2a01
        0x0010:  2000 2001 91b1 0000 0000 0000 0000
      unknown option (24), length 24 (3): 
        0x0000:  4000 0000 0168 2a01 2000 2001 91b1 0000
        0x0010:  0000 0000 0000
      rdnss option (25), length 24 (3):  lifetime 600s, addr: 2a01:2000:2001:91b1:861b:{Gateway}
        0x0000:  8800 0000 0258 2a01 2000 2001 91b1 861b
        0x0010:  {gateway MAC - redacted}
      mtu option (5), length 8 (1):  1492
        0x0000:  0000 0000 05d4
      source link-address option (1), length 8 (1): {gateway MAC - redacted}
        0x0000:  {gateway MAC - redacted}
Run Code Online (Sandbox Code Playgroud)

我也时不时收到这样的消息,不知道有没有意义:

17:09:42.546840 IP6 (hlim 64, next-header ICMPv6 (58) payload length: 1240) {GW's ipv6 - redacted} > {My pc's temp ipv6 addr - redacted}: [icmp6 sum ok] ICMP6, packet too big, mtu 1462
Run Code Online (Sandbox Code Playgroud)

路由器的 radvd.conf(使用 telnet 找到)

interface group1 {
    AdvSendAdvert on;
    AdvManagedFlag off;
    AdvOtherConfigFlag on;
    MaxRtrAdvInterval 600;
    MinRtrAdvInterval 198;
    AdvSourceLLAddress on;
    AdvReachableTime 30000;
    AdvRetransTimer 1000;
    AdvDefaultLifetime 1800;
    AdvCurHopLimit 64;
    AdvLinkMTU 1492;
    prefix 2a01:2000:2001:cd96::/64 {
        AdvPreferredLifetime 360;
        AdvValidLifetime 360;
        AdvOnLink on;
        AdvAutonomous on;
    };
    route 2a01:2000:2001:cd96::/64 {
            AdvRouteLifetime 360;
    };
    RDNSS 2a01:2000:2001:cd96:XXXX:XXXX:XXXX:XXXX  {
        AdvRDNSSOpen on;
    };
};
Run Code Online (Sandbox Code Playgroud)

Pav*_*rda 7

关于 IPv6 地址的自动配置

目前,IPv6 自动配置(通常)总是依赖于基于 ICMPv6 数据包交换的路由器发现。基本思想是从路由器到客户端获取有关网络的信息。一旦客户端收到带有信息的路由器通告,它也会知道是否使用 DHCP,特别是是否仅将其用于其他配置或地址配置。Fedora Wiki描述了使用 NetworkManager 测试的特定配置。

使用 NetworkManager 配置 IPv6

自 NetworkManager 0.9.6 起,NetworkManager 中的 IPv6 支持大部分可用,但严重依赖有限的内核自动配置功能。从 NetworkManager 0.9.10 开始,IPv6 配置完全由用户空间管理,内核以更好的方式配置。NetworkManager 的当前分支是 1.0。

以下部分将帮助您使用 NetworkManager 配置一个良好的主机测试设置,适用于调试类似问题。

连接配置

/etc/NetworkManager/system-connections/:

[ipv6]
method=auto
Run Code Online (Sandbox Code Playgroud)

method=ignore当您希望 IPv6 连接正常工作时,您不得使用。虽然忽略允许基于内核的有限 IPv6 配置而没有 DNS 之类的东西,但首选方法是让 NetworkManager 处理 IPv6 配置。我们实际上希望将来删除ignore。在 IPv6 自动配置标准中也存在 [已知错误][1],NetworkManager 在method=auto.

确保您的防火墙没有阻止重要的数据包

对于简单的测试,请允许防火墙:

ip6tables -P INPUT ACCEPT
ip6tables -F INPUT

ip6tables -P OUTPUT ACCEPT
ip6tables -F OUTPUT
Run Code Online (Sandbox Code Playgroud)

确保您没有使用隐私扩展

过去存在隐私扩展(也称为临时地址)的问题。您使用的是 Linux Mint,它是默认打开它们的发行版之一。

注意:您遇到的问题不是因为隐私扩展。您可能可以跳过本节,但我希望将其保留给可能正在调试具有类似症状的另一个问题的任何人。

/etc/sysctl.conf:

net.ipv6.conf.default.use_tempaddr = 0
Run Code Online (Sandbox Code Playgroud)

通常,您只会使用所有insetad默认值,但 NetworkManager 正在读取文件并专门寻找默认值。这个设置应该足以说服 NetworkManager 我们不想对任何连接使用隐私扩展。NetworkManager 现在应该忽略每个连接的隐私配置。之后只需重新启动 NetworkManager。

路由器请求和广告定时

从您更新的问题中,我可以看到,当 Networkmanager 发出路由器请求时,路由器会立即响应路由器广告,从您的主机的角度来看,这是一种良好的行为,因为您收到了必要的信息。问题是它是否总是发生。

此外,路由器应该定期发送路由器广告,比地址超时更频繁。并且您的主机可能应该在超时临近时发送路由器请求,以防您错过了来自路由器的信息。使用您的 NetworkManager 版本,这将是内核的责任。

从另一个更新中,很明显路由器没有像它应该的那样经常发送路由器广告。有些信息的有效期短至360秒,但路由器通告的频率却高达600秒。正确的配置是在360 秒的时间跨度内向您发送几个路由器广告,以防其中一些丢失。

另一方面,当生命周期即将到期时您的主机可能应该通过路由器请求请求信息。您可以使用 tcpdump 观察请求和广告,以查看您的内核是否在上次广告后大约六分钟内发出请求。如果不是,则可能的症状是您的连接从最后一个广告开始只能持续六分钟,这意味着自连接建立后六分钟或更长时间。

推荐的路由器配置

标准似乎推荐了一些价值观,但我宁愿使用常识。在非常糟糕的链接上(适用于 wifi 和其他),您可能会丢失一些数据包。所以我基本上会保持所有生命周期至少是最大路由器广告间隔的好倍数。

您的MaxRtrAdvInterval600 秒,这很酷,因为您将每十分钟或更短时间获得更新信息。MinRtrAdvInterval的唯一目的是将时间随机化一点,例如,您可以保留它或使用300 秒。所有的生命周期都可以更改为例如最大间隔的五倍,这意味着3600 秒,这意味着所有信息将在一个小时内有效,但大约每十分钟更新一次。

最后的笔记

您可能需要联系供应商以修复他们机器中的时间。不知道可不可以配置。但是直接更改文件可能对您没有帮助,因为路由器会在提交配置时重写它。

您可能还想联系内核网络开发人员以评论发送路由器请求。随意将我包括在任何交流中。