我遇到 IPv6 连接问题。只有那些。它们大约每 10 分钟超时一次(我想是由于地址更新)。
我在一年左右的时间内尝试过的每一个基于 debian 的 Linux 版本(x86 和 x64),在不同的 PC(有线和无线)上都会发生这种情况。
我目前使用的是 Linux Mint 17.1,内核为 3.13.0-37-generic x86_64(之前为 3.2.0-60)和 NetworkManager 0.9.8.8。有时,当我尝试立即重新启动下载时,我会收到“没有到主机的路由”。因为我的 IPv6 地址似乎暂时消失了。
像这样:http://pastebin.com/4Xida2qu
我正在运行双栈 IPv4 - IPv6 (PPPoE),这就是我的 Netgear DGND3700v2 路由器(固件版本 V1.1.00.22_1.00.22)的配置方式:https://i.stack.imgur.com/VWkcV.png
相关网络配置文件设置为忽略IPv6,但无论如何我都会获得全球 IPv6 地址。更改为自动没有任何区别。这很令人困惑,但我想这只是内核在做它的工作。
防火墙规则或缺乏防火墙规则没有任何区别,但它们基本上是:
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
尝试使用 DHCP 而不是 LAN 的 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}
路由器征集:
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}
路由器广告:
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}
我也时常收到这样的信息,不知道是否重要:
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
路由器的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;
};
};
答案1
关于 IPv6 地址的自动配置
目前,IPv6 自动配置(通常)始终依赖于基于 ICMPv6 数据包交换的路由器发现。基本思想是从路由器向客户端获取有关网络的信息。一旦客户收到路由器广告通过这些信息,它还将了解是否使用 DHCP,特别是是否仅将其用于其他配置或也用于地址配置。使用 NetworkManager 测试的具体配置是Fedora Wiki 中描述。
使用 NetworkManager 配置 IPv6
从 NetworkManager 0.9.6 开始,NetworkManager 中的 IPv6 支持大部分可用,但严重依赖于有限的内核自动配置功能。从 NetworkManager 0.9.10 开始,IPv6 配置完全由用户空间管理,并且内核的配置方式更加有效。 NetworkManager 当前的分支是 1.0。
以下部分应帮助您使用 NetworkManager 配置良好的主机测试设置,适合调试类似问题。
连接配置
/etc/NetworkManager/system-connections/:
[ipv6]
method=auto
method=ignore
当您希望 IPv6 连接正常工作时,请勿使用。尽管忽略允许基于有限内核的 IPv6 配置,无需 DNS 之类的东西,首选方法是让 NetworkManager 处理 IPv6 配置。我们实际上希望删除忽略将来。 NetworkManager 正在尝试解决 IPv6 自动配置标准中的[已知错误][1] method=auto
。
确保您的防火墙没有阻止重要数据包
对于简单的测试,请允许防火墙:
ip6tables -P INPUT ACCEPT
ip6tables -F INPUT
ip6tables -P OUTPUT ACCEPT
ip6tables -F OUTPUT
确保您没有使用隐私扩展程序
过去存在隐私扩展(也称为临时地址)的问题。您正在使用 Linux Mint,它是默认打开它们的发行版之一。
注意:您遇到的问题是不是因为隐私扩展。您可能可以跳过本节,但我想为可能正在调试具有类似症状的另一个问题的任何人保留它。
/etc/sysctl.conf:
net.ipv6.conf.default.use_tempaddr = 0
通常你会使用全部插入的默认但 NetworkManager 正在读取文件并寻找默认具体来说。此设置应该足以说服 NetworkManager 我们不想对任何连接使用隐私扩展。 NetworkManager 现在应该忽略每个连接的隐私配置。之后只需重新启动 NetworkManager 即可。
路由器请求和广告定时
从您更新的问题中,我可以看到,当 Networkmanager 发出路由器请求时,路由器会立即响应路由器通告,从主机的角度来看,这是良好的行为,因为您收到了必要的信息。问题是这种情况是否总是发生。
此外,路由器还应定期发送路由器通告,发送频率应高于地址超时的频率。当超时临近时,您的主机可能应该发送路由器请求,以防您错过来自路由器的信息。对于您的 NetworkManager 版本,这将是内核的责任。
从另一个更新来看,很明显,路由器没有按照应有的频率发送路由器通告。某些信息的有效期短至360秒但路由器通告的频率最多为600秒。正确的配置是在360秒时间跨度以防万一其中一些人迷路。
另一方面,当生命周期即将到期时,您的主机可能应该通过路由器请求来请求信息。您可以使用 tcpdump 监视请求和广告,以查看您的内核是否在距最后一次广告大约六分钟内发出请求。如果没有,可能的症状是您的连接自上次广告起仅持续六分钟,这意味着自连接建立以来有六分钟或更长时间。
推荐的路由器配置
标准似乎推荐了一些值,但我宁愿使用常识。在非常糟糕的链接(适用于 wifi 和其他)上,您可能会丢失许多数据包。因此,我基本上会将所有生命周期至少保持在最大路由器通告间隔的好倍数上。
你的最大RtrAdv间隔是600秒这很酷,因为您每隔十分钟或更短的时间就会收到更新的信息。唯一的目的就是最小RtrAdv间隔就是稍微随机化时间,这样你就可以保留它或使用它300秒例如。所有生命周期都可以更改为最大间隔的五倍,这意味着3600秒这意味着所有信息将在一个小时内有效,但大约每十分钟更新一次。
最后的笔记
您可能需要联系供应商来修复他们机器中的计时。不知道是否可以配置。但直接更改文件可能不会对您有帮助,因为路由器会在提交配置时重写它。
您可能还想联系内核网络开发人员以评论发送路由器请求。请随意让我参与任何交流。