从另一个接口 ping 一个接口

从另一个接口 ping 一个接口

我有一台计算机(运行 Linux),它有 2 个接口 eth0 和 eth1。eth0 的
地址为 10.0.0.100/24
eth1 的地址为 192.168.1.100/24
它们连接到 2 个不同的网络(10.0.0.0/24 和 192.168.1.0/24),这些网络通过路由器连接。10.0.0.0 上的其他计算机可以 ping 192.168.1.0 上的计算机。

但如果我在这台电脑上尝试

ping -I eth0 192.168.1.100

我没有收到任何回复。如果我在 eth1 上监听,我会收到来自 10.0.0.100 的 icmp 请求,但它不会发送任何回复。

我尝试设置一些静态路由,但没有任何变化。我还阅读了内核 rp_filter 并将其更改为 2(和 0,和 1),但也没有产生任何变化。

有人知道为什么会这样,以及如何解决这个问题?

我想这样做的唯一原因是使用一台计算机测量两个网络之间的性能。

答案1

最简单的解决方案是禁用反向路径过滤。默认情况下,Linux 会过滤掉从某个接口传入的数据包,因为它认为这些数据包应该从其他接口传入(因为该数据包与其他接口的子网匹配)。

去做这个

echo 'net.ipv4.conf.eth0.rp_filter = 0' >> /etc/sysctl.conf
echo 'net.ipv4.conf.eth1.rp_filter = 0' >> /etc/sysctl.conf
echo 'net.ipv4.conf.lo.rp_filter = 0' >> /etc/sysctl.conf
sysctl -p

这会将设置添加到 sysctl 配置文件,然后重新加载配置。您也可以通过执行以下操作暂时禁用该设置echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

答案2

您可能需要使用 iproute2 为两个接口设置多个默认路由,以便从一个接口传入的数据包在同一个接口上得到回复

答案3

帕特里克的回答

去做这个

echo 'net.ipv4.conf.eth0.rp_filter = 0' >> /etc/sysctl.conf
echo 'net.ipv4.conf.eth1.rp_filter = 0' >> /etc/sysctl.conf
echo 'net.ipv4.conf.lo.rp_filter = 0' >> /etc/sysctl.conf
sysctl -p

在 Ubuntu 16.04 上对我来说不起作用。

这有效:

sysctl -w net.ipv4.conf.all.rp_filter=0

相关内容