SIOCADDRT:在 IPv6 中添加路由时没有到主机的路由

SIOCADDRT:在 IPv6 中添加路由时没有到主机的路由

我遇到了一个奇怪的问题。我有一些 RHEL-7.2 上的服务器,我无法添加路由。

这条路线的添加是我做过无数次的事情。我得到的错误是没有到主机的路由这有点奇怪。


我在添加路线时遇到以下错误#

route -A inet6 add 1203:900:223:3524:21::/112 gw 1203:270:713:3214:34::1
SIOCADDRT: No route to host

以下是我的设备的输出#

[root@localhost ~]# ifconfig eth2

eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 1203:270:713:3214:34::12  prefixlen 112  scopeid 0x0<global>
        inet6 fe80::250:56ff:feaf:3ab7  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:af:3a:b7  txqueuelen 1000  (Ethernet)
        RX packets 23405  bytes 1429434 (1.3 MiB)
        RX errors 0  dropped 22220  overruns 0  frame 0
        TX packets 4129  bytes 352750 (344.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

网关 IP 可访问

[root@localhost ~]# ping6 1203:270:713:3214:34::1
PING 1203:270:713:3214:34::1(1203:270:713:3214:34::1) 56 data bytes

64 bytes from 1203:270:713:3214:34::1: icmp_seq=1 ttl=254 time=0.678 ms

64 bytes from 1203:270:713:3214:34::1: icmp_seq=2 ttl=254 time=0.576 ms


--- 2405:200:613:3214:34::1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.576/0.627/0.678/0.051 ms

设备接口已启动并正在运行##

[root@localhost ~]# ethtool eth2

Settings for eth2:

    Supported ports: [ TP ]
    Supported link modes:   1000baseT/Full 
                            10000baseT/Full 
    Supported pause frame use: No
    Supports auto-negotiation: No
    Advertised link modes:  Not reported
    Advertised pause frame use: No
    Advertised auto-negotiation: No
    Speed: 10000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: off
    MDI-X: Unknown
    Supports Wake-on: uag
    Wake-on: d
    Link detected: yes

搜索了很多关于这个主题的内容。找不到解决方案 ROUTE-ADDITION-FAILURE。似乎没有与这个主题相关的内容。这个问题只出现在部分 RHEL 上,而不是所有机器上。

如果有人在某个地方见过这个问题。请回复,这将非常有帮助。

答案1

据我所知,在最近的内核中,只有一个点可以获得EHOSTUNREACHIPv6 路由添加。

https://elixir.bootlin.com/linux/v4.3/source/net/ipv6/route.c#L1922

            /* IPv6 严格禁止使用非本地链路
               地址作为下一跳地址。
               否则,路由器将无法发送重定向。
               这很好,但在某些(罕见!)情况下
               (SIT、PtP、NBMA NOARP 链路)可以方便地允许
               有一些例外。--ANK
             */

例外情况是,必须已经有到网关的 IPv6 路由。

grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);

上面这一行必须成功。

因此,此主机上的情况很可能不同,因为它尚未通过路由器通告配置下一跳。网关仍处于链接状态(由前缀确定),因此可以通过 ping 到达,但它并不自动成为路由,因此不能保证 rt6_lookup 会成功。

相关内容