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

我注意到我们的局域网使用IPv6的路由问题。 大多数客户端PC都是LTSP瘦客户端。 他们通过SLAAC获得一个地址。 Tracepath6到同一子网上的主机显示所有通信是直接的。 但是,我正在使用的笔记本电脑(Linux Mint 17,标准networkingpipe理器)为自己提供了两个IPv6地址,并且build立了所有stream量首先到达路由器的路由,包括同一子网中的stream量:

 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)为什么这台机器select路由所有stream量通过路由器?

路由器是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有时会显示通过路由器的stream量,有时直接stream向主机。 看起来几乎每一次重启都是不同的。 路由表是完全一样的每一次,也是如果我启用/禁用dnsmasq off-link选项。

编辑2:IPv4总是有一个路由,说明你自己的子网,它应该只是通过eth0发送,例如。 所以,当我在IPv6中添加此路由时,stream量不再通过路由器:

 /sbin/route -A inet6 add xxxx:1b0:5256:1337::/64 dev eth0 

那么,为什么xxxx:1b0:5256:1337::/64默认不包含在这里的任何机器上? 不应该有一个path,告诉内核,目前的子网,只是通过以太网(或无线)发送?

Edit3:我只是看着tcpdump + wireshark,看到L标志,On-Link,没有在路由器通告中设置,尽pipeoff-link没有被设置:

 dhcp-range=xxxx:1b0:5256:1337::, ra-only, inifite 

1)为什么有些主机得到一个和一些主机更多的地址? 我经常看到这种情况。

IPv6主机总是获得链路本地地址。 其他地址取决于RA中的标志和主机设置的组合。 RA可以向主机发信号通知DHCPv6服务器可以发出主机可以采取行动的地址。 如果RA包含允许自动configuration的前缀并且主机没有禁用自动configuration,则使用SLAAC。

原来的规范说,interface-id(IPv6地址的最后64位)是由链路层地址(通常是MAC地址)构成的。 但是,这将有可能跟踪互联网上的设备。 想象一下经常联系的服务Google或Dropbox:无论你连接你的笔记本电脑或手机的networking,子网都会改变,但接口ID将始终是相同的。 因此,操作系统现在提供隐私扩展。

隐私扩展程序会定期更改您的界面ID。 确切的计时器是依赖于实现的,但是让我们假设它每小时都在变化。 你的设备每隔一小时configuration一个新的IPv6地址。 旧地址已弃用,一旦您的软件停止使用它们,它们将被删除。 这样你可以结束多个地址。

另外:当RA包含多个前缀与自动configuration标志设置您的设备将在每个configuration地址。

2)为什么这台机器select路由所有stream量通过路由器?

这通常取决于RA中前缀中的On-Link标志。 如果设置了连接上标志,则设备可以为/64接口创build路由。 如果该标志没有被设置,则设备不能知道前缀中的其他地址是否在链路上,并且将所有这些分组发送到默认网关。

当然你的设备总是可以select(有意或者是因为一个bug)忽略链接上的标志,并且把所有的东西都发送到默认网关。

显然,DNSMasq没有设置链接是一个在2.63中修复的bug,对于Debian 7来说太新了。无论如何,需要升级到Debian 8,所以今天这样做。

编辑,升级完成。 DNSmasqconfiguration行已更改为:

 dhcp-range=::,ra-only,constructor:eth1,infinite 

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