如何将 ping 包从 A 路由到 C?

如何将 ping 包从 A 路由到 C?

我开始了解网络概念和工具。我设置了三台虚拟机,配置如下:

A: 192.168.1.3
B: 192.168.1.1 192.168.2.1
C: 192.168.2.2

在 A 中,我 ping 192.168.1.1,结果发出了 Ping 信号。我认为 A 不知道 192.168.2.1 位于何处。因此,当我 ping 192.168.2.1 时,它不知道应该路由到哪个接口。我的第一个问题是,当只有一个接口时,它为什么会感到疑惑?:D 无论如何,要进行路由,请在 AI 中添加以下内容:

sudo route add default enp0s3

我可能会使用以下命令:

sudo route add default gw 192.168.1.1
sudo route add default gw 192.168.1.3
  1. 我的命令正确吗?
  2. 最后一个命令也有效!为什么?!它正确吗?!怎么做到的?!

使用其中一个命令 A 也可以 ping 192.168.2.1。然后,我从 A ping C。我期望 B 收到 ping 数据包时知道如何路由并通过 192.168.2.x 接口将其路由到 C,但事实并非如此。

  1. 为什么?我应该在 B 中做点什么吗?
  2. 我该在 B 中做什么才能让 ping 得到 C 的响应?

答案1

为了实现您的愿望,您需要做:

A,需要配置到192.168.2.X的路由,也就是经过192.168.1.1:

ip route add 192.168.2.0/24 via 192.168.1.1

注意:您可以指定设备名称,dev DEVICE_NAME或者在这种情况下可以省略它。

,您需要确保数据包可以被转发,例如 ip_forwaring 已启用:

sysctl -w net.ipv4.ip_forward=1

或者

echo 1 > /proc/sys/net/ipv4/ip_forward

此外,您需要在防火墙中允许两个网络之间的通信。因此,以下命令应该可以完成这项工作:

iptables -I FORWARD -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
iptables -I FORWARD -s 192.168.2.0/24 -d 192.168.1.0/24 -j ACCEPT

有两个接口(192.168.1.1 和 192.168.2.1),并且它已经知道在哪里可以找到这两个子网。因此在这种情况下,您不需要在其上添加其他路由。

C,与A例如,您需要告诉 192.168.2.2 如何到达 192.168.1.X,即通过 192.168.2.1:

ip route add 192.168.1.0/24 via 192.168.2.1

最后,您必须使所有这些更改永久生效,因为如果您现在重新启动这些节点,您已应用的配置将消失。如何实现这一点取决于您使用的 Linux 发行版,并且不在您当前问题的范围之内 :)

答案2

经过一番尝试和调查,我找到了一种更简单的方法,它省去了在 B 中使用 iptables 的要求。尽管大部分部分都是一样的。让我们看看 A 未收到 ping 数据包响应的问题是什么。通过在 A 中执行以下命令:

route add -net 192.168.2.0/24 gw 192.168.1.1

或者正如你提到的:

ip route add 192.168.2.0/24 via 192.168.1.1

它们是相同的,A 不知道 vmnet 192.168.2.x,但知道 192.168.1.1 可以访问此网络,并且可能会路由目的地为 192.168.2.x 的数据包。现在 ping 数据包可能被 192.168.1.1(也是 192.168.2.1)接收。由于 B 中启用了数据包转发,它知道应该再次发送它们,并且知道应该发送到哪个接口。由于数据包的目的地,这应该通过 192.168.2.x 接口进行。到目前为止,A 可能收到对 ping 192.168.2.1 的响应,但不会收到对 192.168.2.2 的响应,但这并不意味着 192.168.2.2 没有收到 ping 数据包。如果我使用 Wireshark,我可能会在 C 中看到它们。但问题是 C 不了解 192.168.1.x 网络,也不知道如何路由到这个目的地的数据包。因此,由 C 生成的 pong 数据包无法路由回来。在 C 中添加类似的路由规则就足够了,我们可以将其称为路由返回规则,如下所示:

route add -net 192.168.1.0/24 gw 192.168.2.1

就是这样。无需在 B 中定义任何规则,也无需在其 IP 表或路由表中定义任何规则。虽然您的解决方案也是正确的,但我认为这可能是一种更简单的方法,可以更准确地解决问题,尽管我不会坚持我的解决方案,如果我有错误,我会赞扬任何建议或更正。

相关内容