我注意到我们 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 有时会显示通过路由器的流量,有时会直接流向主机。似乎每次重新启动都不同。路由表每次都完全相同,如果我启用/禁用 dnsmasqoff-link
选项也是如此。
Edit2:例如,IPv4 始终有一条路由表明,对于您自己的子网,它应该只通过 eth0 发送。因此,当我在 IPv6 中添加此路由时,流量不再通过路由器:
/sbin/route -A inet6 add xxxx:1b0:5256:1337::/64 dev eth0
那么,为什么xxxx:1b0:5256:1337::/64
默认不包括在内(在此处的任何机器上)?不应该存在一条告诉内核对于当前子网,只需通过以太网(或 wlan,等等)发送出去的路由吗?
Edit3:我刚刚查看了 tcpdump+wireshark,发现L
路由器广告中未设置标志 On-Link,尽管未设置离线链接:
dhcp-range=xxxx:1b0:5256:1337::, ra-only, inifite
IPv6 主机始终获得链路本地地址。其他地址取决于 RA 中的标志和主机设置的组合。RA 可以向主机发出信号,表明 DHCPv6 服务器可能会分发地址,主机可以根据这些地址进行操作。如果 RA 包含允许自动配置的前缀并且主机没有禁用自动配置,则使用 SLAAC。
最初的规范说 interface-id(IPv6 地址的最后 64 位)是从链路层地址(通常是 MAC 地址)构造的。但这样就可以通过互联网跟踪设备。想象一个经常联系的服务 Google 或 Dropbox:无论您将笔记本电脑或手机连接到何种网络,子网都会发生变化,但 interface-id 将始终保持不变。因此,如今操作系统提供了隐私扩展。
隐私扩展使您的 interface-id 定期更改。确切的计时器取决于实现,但我们假设它每小时更改一次。您的设备每小时都会为自己配置一个新的 IPv6 地址。旧地址已被弃用,一旦您的软件停止使用它们,它们就会被删除。这样你就可以得到多个地址。
另外:当 RA 包含多个设置了自动配置标志的前缀时,您的设备将在每个前缀中配置地址。
这通常取决于 RA 前缀中的 On-Link 标志。如果设置了 on-link 标志,则设备可以创建
/64
到接口的路由。如果未设置该标志,则设备无法知道前缀中的其他地址是否处于链接状态,并将所有这些数据包发送到默认网关。当然,您的设备始终可以选择(有意或由于错误)忽略 on-link 标志并将所有内容发送到默认网关。
显然,DNSMasq 没有设置 on-link 是 2.63 中修复的错误,对于 Debian 7 来说太新了。无论如何都需要升级到 Debian 8,所以今天就这样做。
编辑,升级完成。DNSmasq 配置行更改为:
现在添加了本地子网的路由。