一些 IPv6 主机将所有流量(即使在同一子网中)发送到路由器

一些 IPv6 主机将所有流量(即使在同一子网中)发送到路由器

我注意到我们的 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

现在已添加本地子网的路由。

相关内容