我遇到过一个 Linux 系统,其中配置了一些通过以太网接口的路由,但没有指定网关。我一直认为指定接口而不是网关的路由仅适用于点对点链路。这对于以太网接口来说没有意义,因为以太网不是点对点介质。
当数据包通过未指定网关的以太网接口匹配路由时,Linux 如何传递数据包?它是否从接口广播对目标 IP 地址的 ARP 请求? (并且未指定的网关必须充当 ARP 代理?)在具有多个路由表的基于策略的路由的情况下,行为是否有所不同? (下面第二个例子)
以下是此类路线的示例:
[Gaia]# ip route list
10.25.35.0/24 dev eth3 proto routed
...
[Gaia]# cat /proc/net/route
Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
eth3 0023190A 00000000 0011 0 0 0 00FFFFFF 0 0 0
...
[Gaia]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.25.35.0 0.0.0.0 255.255.255.0 UD 0 0 0 eth3
...
此类 PBR 路由的示例:
[Gaia]# ip route list table 2
default dev eth7 proto routed
...
该系统运行的是基于 RHEL 5.2、Linux 内核 2.6.18 的 Check Point Gaia R77.30。
答案1
您的假设是正确的(您可以使用 轻松检查tcpdump -i eth7 -n
)。我从来没有见过这种情况default
,只见过网络,但这可能没有什么区别。针对目标 IP 地址的 ARP 请求在该接口上广播。
策略路由只是选择路由表,不会影响未定义下一跳的问题。
答案2
如果您有一个与其他网络没有连接的隔离网络,则不需要网关。主机彼此直接通信,并使用 ARP(或邻居发现,在 IPv6 的情况下)找到彼此。
本地连接的处理方式如下,即使您做有一个网关。如果您在网络外部进行通信,则还可以使用相同的机制来定位网络上的网关。主机需要知道网关主机的 MAC 地址才能通过它发送传出数据包,因此它使用 ARP/ND 来查找它。
答案3
每个以太网网络接口都会有一条指定到其本地网段的路由。如果没有网关,您应该始终能够联系本地网段上的主机,并且每个网卡都连接到本地网络。
要联系本地网络之外的主机,您需要通过网关路由流量。在网关(路由器)处,目标 IP 要么是其本地 IP,要么转发到另一个路由器,依此类推。
当数据包通过未指定网关的以太网接口匹配路由时,Linux 如何传递数据包?
你的问题对我来说有点不清楚:
- 您的意思是数据包的目的地位于接口的本地网络内(您确实说过路由“匹配”)?然后,正如您所建议的,它使用 ARP 来定位设备并向其发出以太网帧 - 在这种情况下不涉及路由,您可以直接联系主机,因为它是您本地的;
- 您的意思是目的地不在本地段上?然后路由不会发生,数据包被丢弃,因为您的路由表无法计算出需要将数据包发送到的位置(无论您拥有哪个接口或本地网络);
网关被定义为启用非主机本地数据包的路由。