我注意到我们的 LAN 存在 IPv6 路由问题。大多数客户端 PC 都是 LTSP 瘦客户端。它们通过 SLAAC 获得一个地址。Tracepath6
到同一子网上的主机显示所有流量都是直接的。但是,我正在使用的笔记本电脑(Linux Mint 17,标准网络管理器)为自己提供了两个 IPv6 地址,并设置了路由全部流量首先到达路由器,包括同一子网中的流量:
tracepath6 xxxx:1b0:5256:1337:10:50:0:8
1?: [LOCALHOST] 0.183ms pmtu 1500
1: xxxx:1b0:5256:1337:10:50:0:1 1.217ms
问题:
1) 为什么有些主机只有一个地址,而有些主机有多个地址?我经常看到这种情况。
2)为什么这台机器选择通过路由器路由所有流量?
路由器是dnsmasq,确实只有SLAAC:
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: IPv6 router advertisement enabled
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.102.20.1 -- 10.102.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.101.20.1 -- 10.101.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.100.0.100 -- 10.100.0.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: DHCP, IP range 10.50.20.1 -- 10.50.20.254, lease time 12h
Jan 22 11:34:36 gatekeeper dnsmasq-dhcp[9796]: SLAAC on xxxx:1b0:5256:1337:: prefix valid 2h
这是我的 eth0:
eth0 Link encap:Ethernet HWaddr 18:67:b0:34:2d:dd
inet addr:10.50.20.158 Bcast:10.50.255.255 Mask:255.255.0.0
inet6 addr: fe80::1a67:b0ff:fe34:2ddd/64 Scope:Link
inet6 addr: xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/64 Scope:Global
inet6 addr: xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12094 errors:0 dropped:0 overruns:0 frame:0
TX packets:17250 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2848542 (2.8 MB) TX bytes:3002689 (3.0 MB)
这些是 IPv4 路由:
> route -n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.50.0.1 0.0.0.0 UG 0 0 0 eth0
10.50.0.0 0.0.0.0 255.255.0.0 U 1 0 0 eth0
这些是 IPv6 路由:
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
fe80::/64 :: U 256 1 0 eth0
::/0 fe80::213:3bff:fe0f:c02c UG 1 0 0 eth0
::/0 fe80::213:3bff:fe0f:c02c UGDAe 1024 0 0 eth0
::/0 :: !n -1 1 261 lo
::1/128 :: Un 0 3 243 lo
xxxx:1b0:5256:1337:1a67:b0ff:fe34:2ddd/128 :: Un 0 1 0 lo
xxxx:1b0:5256:1337:2532:eb1a:1151:d2f0/128 :: Un 0 1 86 lo
fe80::1a67:b0ff:fe34:2ddd/128 :: Un 0 1 178 lo
ff00::/8 :: U 256 1 0 eth0
::/0 :: !n -1 1 261 lo
直接访问其他主机的主机上不存在以下行:
::/0 fe80::213:3bff:fe0f:c02c UG 1 2 0 eth0
fe80::213:3bff:fe0f:c02c
确实是路由器的LAN端的链路本地地址。
编辑:我看到的行为可能是随机的。我多次重启了一台瘦客户端,tracepath6 有时显示流量通过路由器,有时直接流向主机。似乎每次重启都不一样。每次路由表都完全相同,即使我启用/禁用 dnsmasq 选项也是如此off-link
。
编辑 2:IPv4 始终有一条路由,指出对于您自己的子网,它应该只通过 eth0 发送。因此,当我在 IPv6 中添加此路由时,流量不再通过路由器:
/sbin/route -A inet6 add xxxx:1b0:5256:1337::/64 dev eth0
那么,为什么xxxx:1b0:5256:1337::/64
默认情况下不包含它(在此处的任何机器上)?难道不应该存在一条路由来告诉内核,对于当前子网,只需通过以太网(或 wlan,无论什么)发送出去吗?
编辑3:我刚刚用tcpdump+wireshark查看了一下,发现L
尽管没有设置off-link,但路由器通告中没有设置标志On-Link:
dhcp-range=xxxx:1b0:5256:1337::, ra-only, inifite
答案1
1) 为什么有些主机只有一个地址,而有些主机有多个地址?我经常看到这种情况。
IPv6 主机始终会获得一个链路本地地址。其他地址取决于 RA 中的标志和主机设置的组合。RA 可以向主机发出信号,表示 DHCPv6 服务器可能会分发地址,主机可以据此采取行动。如果 RA 包含允许自动配置的前缀,并且主机未禁用自动配置,则使用 SLAAC。
最初的规范规定,接口 ID(IPv6 地址的最后 64 位)由链路层地址(通常是 MAC 地址)构成。但这样一来,就可以在互联网上跟踪设备。想象一下经常使用的 Google 或 Dropbox 服务:无论您将笔记本电脑或手机连接到哪个网络,子网都会发生变化,但接口 ID 始终相同。因此,如今的操作系统提供了隐私扩展。
隐私扩展会定期更改您的接口 ID。确切的计时器取决于实现,但我们假设它每小时更改一次。您的设备每小时都会为自己配置一个新的 IPv6 地址。旧地址已弃用,一旦您的软件停止使用它们,它们就会被删除。这样,您最终就可以拥有多个地址。
另外:当 RA 包含多个设置了自动配置标志的前缀时,您的设备将在每个前缀中配置地址。
2)为什么这台机器选择通过路由器路由所有流量?
这通常取决于 RA 中前缀的 On-Link 标志。如果设置了 on-link 标志,设备可以为/64
接口创建路由。如果未设置该标志,则设备无法知道前缀中的其他地址是否为 on-link,并将所有这些数据包发送到默认网关。
当然,您的设备始终可以选择(有意或由于错误)忽略链接标志并将所有内容发送到默认网关。
答案2
显然,DNSMasq 没有设置 on-link 是一个在 2.63 中修复的错误,对于 Debian 7 来说太新了。无论如何都需要升级到 Debian 8,所以今天就这么做。
编辑,升级完成。DNSmasq 配置行已更改为:
dhcp-range=::,ra-only,constructor:eth1,infinite
现在已添加本地子网的路由。