Linux中的IPv6源地址选择和路由

Linux中的IPv6源地址选择和路由

我正在我的测试网络上设置 ipv6。

我使用 /56 网络和 CentOS 6.2。

我有一个在两个不同网络上具有两个 IPv6 地址的接口:

  • 2b01:abcd:4001:c00::30/56 已连接到互联网(默认网关 2b01:abcd:4001:c00::1/56)
  • 2b02:abcd:4001:c00::30/56 仅限本地网络。

因此,通常情况下,如果我 ping 一个未知网络的地址,我会使用第一个地址 IPv6 作为源地址,并通过默认网关:

$ ping6 -v -c 1 -w 1 -I eth0 2620:0:ccc::2 
PING 2620:0:ccc::2(2620:0:ccc::2) from 2b02:abcd:4001:c00::30 eth0: 56 data bytes

--- 2620:0:ccc::2 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1000ms

但是不行...但是,如果我将地址标记为已弃用,那就没问题了(Linux 上的 IPv6 源地址选择)。

$ ip addr change 2b02:abcd:4001:c00::30 dev eth0 preferred_lft 0

但是,如果我 ping 同一个本地网络上的主机,则会使用第一个/错误的地址源!

$ ping6 -v -c1 -w1 -I eth0 2b02:abcd:4001:c00::10
PING 2b02:abcd:4001:c00::10(2b02:abcd:4001:c00::10) from 2b01:abcd:4001:c00::30 eth0: 56 data bytes
64 bytes from 2b02:abcd:4001:c00::10: icmp_seq=1 ttl=64 time=2.17 ms

--- 2b02:abcd:4001:c00::10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.175/2.175/2.175/0.000 ms

有人可以解释这种行为吗?

配置 :

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=a.b.c.d
GATEWAY=a.b.c.d
NETMASK=a.b.c.d
TYPE=Ethernet
NM_CONTROLLED=no

IPV6INIT=yes
IPV6ADDR="2b01:abcd:4001:c00::30/56"
IPV6ADDR_SECONDARIES="2b02:abcd:4001:c00::30/56"
IPV6_DEFAULTGW="2b01:abcd:4001:c00::1"

DNS1=208.67.222.222
DNS2=208.67.220.220
DNS3=2620:0:ccc::2
DNS4=2620:0:ccd::2
DOMAIN="test.local"

路由表:

$ route -n -A inet6
Table de routage IPv6 du noyau
Destination                                 Prochain Hop                            Indic Metric Ref    Utilis. Iface
2b01:abcd:4001:c00::/56                     ::                                      UA    256    5        0 eth0    
2b02:abcd:4001:c00::/56                     ::                                      U     256    0        0 eth0    
fe80::/64                                   ::                                      U     256    0        0 eth0    
::/0                                        2b01:abcd:4001:c00::1                   UG    1      605       0 eth0    
::/0                                        fe80::2237:6ff:fe46:e320                UGDA  1024   2        0 eth0    
::1/128                                     ::                                      U     0      0        1 lo      
2b01:abcd:4001:c00::30/128                  ::                                      U     0      0        1 lo      
2b02:abcd:4001:c00::30/128                  ::                                      U     0      0        1 lo      
fe80::1ec1:deff:feb8:a3fd/128               ::                                      U     0      53       1 lo      
ff02::1/128                                 ff02::1                                 UC    0      1        0 eth0    
ff00::/8                                    ::                                      U     256    0        0 eth0 

答案1

它似乎在关注规则正确。

当您 ping 时2620:0:ccc::2,所有规则均不适用:

  • 规则 1(优先使用相同地址)不适用
  • 规则 2(优选适当的范围)两个候选源地址具有相同的范围
  • 规则 3(避免使用已弃用的地址)两个候选源地址均未被弃用
  • 规则 4(首选家庭住址)不适用
  • 规则 5(传出接口)两个候选源地址都分配给同一接口
  • 规则 6(首选匹配标签)您可能没有配置任何标签
  • 规则 7(首选公共地址)两个地址都是公开的
  • 规则 8(使用最长匹配前缀)两种情况下的公共前缀是相同的:它可能是 2000::/4 或更长,具体取决于您的实际 IP 地址。

因此它是任意选择的。

在下一个测试中,您将其中一个地址设置为弃用。那么根据规则 3,它将始终避免使用那个地址。

一个解决方案是重新考虑为什么您的本地专用前缀与全局前缀如此相似。也许您的本地专用前缀应该位于 fc00::/7 下(联合航空联盟)。

另一个解决方案是确保您的本地地址被标记不同,以便规则 6 能够选择正确的地址。此解决方案的缺点是您必须手动修改本地网络中的所有主机上的标签表。无论如何,类似这样的方法可能会有效:

ip addrlabel add 2XX2:Y:4001:c00::30/56 label 42

相关内容