![SIOCADDRT:在 IPv6 中添加路由时没有到主机的路由](https://linux22.com/image/722221/SIOCADDRT%EF%BC%9A%E5%9C%A8%20IPv6%20%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%B7%AF%E7%94%B1%E6%97%B6%E6%B2%A1%E6%9C%89%E5%88%B0%E4%B8%BB%E6%9C%BA%E7%9A%84%E8%B7%AF%E7%94%B1.png)
我遇到了一个奇怪的问题。我有一些 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
据我所知,在最近的内核中,只有一个点可以获得EHOSTUNREACH
IPv6 路由添加。
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 会成功。