为什么在似乎已定义的情况下,会出现“Nexthop具有无效网关”的错误?

我有自己的无线路由器,远程VPN客户端10.7.0.6连接到它上面。我希望其中一个无线客户端的流量通过它传输,但是我得到了“下一跳具有无效网关”的错误提示。(我知道我需要说服10.7.0.6合作,但目前的问题似乎在此之前。) 这是路由器的IP地址,10.0.0.1:
[ad@rout ~]$ ip addr
1: lo: ...
2: wlp0s20f0u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 78:32:1b:06:18:1b brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global wlp0s20f0u1
       valid_lft forever preferred_lft forever
...
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.7.0.1 peer 10.7.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
...
23: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 82.69.221.62 peer 62.3.89.162/32 scope global ppp0
       valid_lft forever preferred_lft forever

[ad@rout ~]$ ip route
default dev ppp0 scope link 
10.0.0.0/24 dev wlp0s20f0u1 proto kernel scope link src 10.0.0.1 
10.7.0.0/24 via 10.7.0.2 dev tun0 
10.7.0.2 dev tun0 proto kernel scope link src 10.7.0.1 
62.3.89.162 dev ppp0 proto kernel scope link src 82.69.221.62 
这是客户端,10.0.0.2,在我开始折腾之前。
ad@blackmail:~$ ip addr
1: ...
2: ...
3: wls1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 60:57:18:43:12:fa brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global noprefixroute wls1
       valid_lft forever preferred_lft forever
    inet6 fe80::6257:18ff:fe43:12fa/64 scope link 
       valid_lft forever preferred_lft forever

ad@blackmail:~$ ip route
default via 10.0.0.1 dev wls1 proto dhcp src 10.0.0.2 metric 303 mtu 1492 
10.0.0.0/24 dev wls1 proto dhcp scope link src 10.0.0.2 metric 303 mtu 1492 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

ad@blackmail:~$ ping google.com
PING google.com (216.58.198.238) 56(84) bytes of data.
64 bytes from lhr26s04-in-f238.1e100.net (216.58.198.238): icmp_seq=1 ttl=53 time=17.0 ms

ad@blackmail:~$ ping 10.7.0.6
PING 10.7.0.6 (10.7.0.6) 56(84) bytes of data.
64 bytes from 10.7.0.6: icmp_seq=1 ttl=63 time=626 ms

ad@blackmail:~$ traceroute 10.7.0.6
traceroute to 10.7.0.6 (10.7.0.6), 30 hops max, 60 byte packets
 1  rout (10.0.0.1)  3.777 ms  5.372 ms  7.143 ms
 2  10.7.0.6 (10.7.0.6)  153.924 ms  153.948 ms  153.999 ms
现在我尝试让它通过10.7.0.6去传输:
ad@blackmail:~$ su
Password:

[root@blackmail ~]# ip route del default

[root@blackmail ~]# ip route add 10.7.0.0/24 via 10.0.0.1

[root@blackmail ~]# ping 10.7.0.6
PING 10.7.0.6 (10.7.0.6) 56(84) bytes of data.
64 bytes from 10.7.0.6: icmp_seq=1 ttl=63 time=428 ms

[root@blackmail ~]# ip route add default via 10.7.0.6
Error: Nexthop has invalid gateway.
为什么?

2你的默认网关必须是主机配置子网上的有效IP地址。 - Thomas
6个回答

或许可以这样说:
ip route add <gateway IP> dev <interface on which it should be reachable>

然后

ip route add default via <gateway ip>
“直连”可以成为第二层桥接的一部分,正如我发现的那样,非常有用,可以将备用的公共IP地址分配给内部设备,而无需使用复杂和繁琐的NAT技术。

1是的。最后终于成功了,但我还得做两件事情:A)在主机电脑上删除一些IP路由。B)在主机电脑上添加DNS服务器:“sudo nano /etc/resolv.conf # 将nameserver设置为wlan0网关的IP地址。谢谢!:-) - xerostomus

网关地址只能在直接连接的网络上。10.7.0.0/24网络与您的主机10.0.0.2不是直接连接的,而是通过另一个网络分隔开来,该网络与主机连接在10.0.0.1上。 您必须使用10.0.0.1作为此网络的网关,并且该主机还必须配置为以所需方式路由数据包。

好的,但我只想将其中一个无线客户端路由到这种方式。我该如何告诉路由器只将来自那个客户端的数据包绕远路发送? - Adrian May
@AdrianMay 你可能需要进行路由和防火墙设置。 - Michael Hampton
@MichaelHampton,我也遇到了同样的问题,真的不知道该如何解决。你能帮忙看一下吗?链接是https://serverfault.com/questions/1016591/could-not-set-dhcpv4-route-nexthop-has-invalid-gateway-network-is-unreachable - αԋɱҽԃ αмєяιcαη

我也遇到过这个问题,你需要什么帮助?
ip link set LINK_NAME up
请注意,如果该链接依赖于其他链接(例如veth对),您还需要启用它们。

1这只是在第二层上提升了连接(从控制台输出日志中可以看到已经连接)。OP的问题是一个路由(第三层)问题。是的,连接需要保持正常,但是除非你直接连接到该网络,或者通过路由器发送数据包,否则无法将数据包发送到不同的网络。 - nevelis
@nevelis 你说得对。"直接连接"是必须的。 - osexp2000
1我点赞了这个帖子,因为它确实解决了标题中所述的问题。 - Nathan Chappell

我认为这个命令可以解决你的问题:
ip route add default via 10.7.0.6 onlink
在这种情况下,我们认为网关始终处于“onlink”状态。

4对我没用!“需要下一跳设备以进行在线连接” - Milad Yarmohammadi
1@MilaDroid 你需要在那里加入一些参数 dev somedevice,其中somedevice是具有10.7.0.0/x地址的设备。我不认为这对于这个问题实际上是可能的(因为wls1只有10.0.0.2/24),但它适用于我的情况,其中子网始终相同且简单,但出于无明显原因,我会在正常操作时遇到该错误。 - Peter
还需要一个可以到达该地址的接口,并且可能需要指标来降低这条新路由的优先级,这可能会破坏原始的默认路由: ip route add default via 10.7.0.6 dev xxxx onlink metric 200 - clarkttfu

我遇到了和OpenPVN隧道一样的问题,最后通过使用tap设备而不是tun来解决。 我认为网络第二层可以绕过这个问题,尝试独立路由每个数据包,无论接口状态如何(对于这一点我不是很确定,但最终能够工作)。 如果您正在使用OpenVPN,请更改每个ovpn配置文件(服务器和客户端)中的dev。
;dev tun
dev tap
其他非OpenVPN设置必须以不同的方式解决(如果也使用tap接口解决,请在此处进行评论)。

你需要在路由器上使用基于策略的路由,因为客户端没有直接连接到下一跳。这里有一个关于基于策略的路由的简要介绍,同时也在superuser上的这个问题中进行了讨论。 在你的情况下,可能会是这样的:
ip rule add from 10.0.0.2/32 table viavpn
ip route add 0.0.0.0/0 via 10.7.0.6 dev eth4 table viavpn

我成功地为一个openvpn POINTTOPOINT tun添加了一条路由;我不知道openvpn是如何添加现有的路由的,这些路由看起来就像我想要的,而且我也不知道如何使用ip r add ... [scope link]来做到这一点,它会显示"RTNETLINK answers: File exists"(文件已存在,但不是作为scope link... "x via x dev tun"...同一个IP出现在两个地方)...但是使用route add -host <host> dev <tun>(这将使VPN路由器成为scope link),然后我可以为任何特定的IP添加我期望使用VPN的路由(例如ip r add <ip> via <vpngateway>),并且ping可以正常工作,mtr显示它使用VPN作为第一跳。 - Peter

  • 相关问题