Linux 内核允许我添加仅可到达网关的路由,因为实际上它们没有问题。但现在我收到“错误:Nexthop 网关无效”,这很符合规范,但使临时测试变得很麻烦。
有什么办法可以绕过这个检查并强制我的路线?
是的,我确实想通过公共接口发送我的私人局域网路由包,原因是有效的、低量且无害的:)
Linux 内核允许我添加仅可到达网关的路由,因为实际上它们没有问题。但现在我收到“错误:Nexthop 网关无效”,这很符合规范,但使临时测试变得很麻烦。
有什么办法可以绕过这个检查并强制我的路线?
是的,我确实想通过公共接口发送我的私人局域网路由包,原因是有效的、低量且无害的:)
要使用位于同一本地网络(例如与您位于同一以太网)上的网关,但该网关仅在您的 IP 地址范围之外,因此操作系统无法意识到它是本地可访问的:
使用最新的内核:
onlink
为命令指定参数。对于较旧的内核,该选项仅适用于单个 IP 版本(我不记得是哪个版本)。另一种方法是首先为网关添加一个“设备”路由作为 /32 或 /128,这将使操作系统认为它是可访问的:
这在功能上与您从自己的 IP 地址自动添加的“本地子网”路由相同。事实上,如果您愿意,您可以通过这种方式将整个地址范围/子网定义为“本地”。
通常,即使以太网使用多个不相交的 IPv4 子网,所有设备也可能位于单个 IPv6 子网中,因此如果您碰巧知道网关的 IPv6 地址(全局或链路本地),则可以通过该地址路由 IPv4:
(这并不使用隧道或地址转换——只是解析网关 MAC 地址的另一种方式。)
请注意,ISP 可以通过阻止客户之间的直接 ARP 并执行 ARP 代理来轻松防止所有这些问题,这样所有数据包最终都会通过网关,即使目的地看起来像是本地子网。
如今,大多数家庭网关还带有预定义的防火墙规则,可以阻止从 WAN 到其内部网络的数据包,专门用于防止此类黑客攻击。
要使用与您物理上不在同一本地网络(以太网等)上的网关:
无法完成。网关 IP 地址实际上是网关本地网络 MAC 地址的替代品(即它不是 IP 标头字段而是较低层的东西),因此如果网关与您不在同一个本地网络上,那么您就无法将数据包发送到其 MAC 地址,因此您无法通过它进行路由。
IPv4 曾经在某些时候支持“源路由”标头(类似 IPv6 中的“RH0”),可用于要求网关 A 接下来通过网关 B 进行路由,但它几十年前就被普遍弃用并删除了。
这可以用两种方式来解释,但只有当操作系统实际上忽略“可通过 0.0.0.0 路由访问”部分并将网关视为可通过链接直接访问时(如答案的第一部分)才真正有效。
按照答案的第二部分,遵循0.0.0.0 路由的操作系统的另一种解释(即将您的路由视为“递归”)将不起作用 - 它只会导致数据包通过您的常规网关,而您无法再控制它。
(Linux 实际上有一个
pervasive
路由标志,它似乎曾经用于执行递归网关查找,但它不起作用,并且似乎在 2010 年删除了它的(两行)支持代码。实际上,递归查找通常由路由守护进程完成。)