我浏览了该网站上有关多接口 ping 的一些示例,但这些方法似乎都不适合我。
我有两个接口
- eth0(192.168.0.x)
- 无线局域网0 (192.168.1.2)
eth0 从 dhcp 服务器获取其 IP。
wlan0 有静态 IP。
当我运行命令时
ping -I eth0 www.google.com
我得到的结果似乎来自 eth0(ipv6 的东西)。
当我运行命令时
ping -I wlan0 www.google.com
我得到以下输出。
connect: Network is unreachable
如果我拔掉 eth0,然后再次运行该命令,我会得到所需的结果。
如何通过选择接口来 ping 外部服务器?这几乎就像一个人占据主导地位,如果一个人存在,另一个人就会被忽视。
答案1
问题是路由如何工作。
如果您有多个接口,则每个接口都可以配置一个网关。我不确定您的特定系统上的路由表是如何填充的,但我怀疑您的系统对出现的第一个默认路由给予了最佳优先级,然后对第二个出现的默认路由给予了第二个最佳优先级,依此类推。仅最佳默认路由处于活动状态。如果您关闭相应的接口,其默认路由也会消失,因此如果还有其他默认路由,它将接管。该优先级称为“度量”。
当您进行 ping 操作时,您的系统会创建一个带有某个源地址的数据包。它可以自行选择某个地址(从本地网络路由的“src”属性),但您可以使用 -I 开关指定要使用的地址或本地网络路由从中获取该地址的接口。这就是这个开关的作用; in 仅设置源地址。它不选择路由,并且本身不会影响使用哪个接口。
发生了什么:您从“第一个”接口向“第一个”网关发送一个源地址为“第二个”接口的数据包。最有可能的是它被丢弃在网关上,网关不知道如何到达该源地址(当需要回复时,它应该回复谁?),或者不希望它以这种方式出现。
该怎么办?您应该根据源地址设置路由。这是高级主题。在Linux中,您设置了多个路由表,每个路由表都有不同的默认路由,并指示系统根据数据包源地址选择使用哪个路由表。这称为多归属。
在 Linux 中,您的情况的基本多宿主设置将是:
ip route add default via 192.168.0.GW0 table 1
ip route add default via 192.168.1.GW1 table 2
ip rule add from 192.168.0.x lookup 1
ip rule add from 192.168.1.2 lookup 2
前两个是带有 resp 的默认路由。网关,第三和第四是哪个表用于哪个地址。当然,您最好将具体的实际值放入占位符中。动态主机配置协议?以太忘记多宿主,或者编写一个脚本,在接收地址时动态设置所有内容,并在地址丢失时删除它(通常路由将被自动删除,规则应始终手动删除)。开机自动配置?您的发行手册可以指导您采取正确的方法,准备好中断网络并知道如何将其恢复到干净的状态。