我有一台计算机(运行 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