我遇到了多宿主路由问题的变体,我就是无法弄清楚。
我们有一个有两个子网的站点,N1和氮气,有些主机在两个网络上都有一个接口(如下图所示,乙和C),有些则只N1(即主机A) 或者氮气(即主机德)。
---+--------------+--------------+---------------------- N1
| | |
|A1 |B1 |C1
+--+---+ +--+---+ +--+---+ +--+---+
| | | | | | | |
| A | | B | | C | | D |
| | | | | | | |
+------+ +--+---+ +--+---+ +--+---+
|B2 |C2 |D2
| | |
------------------+--------------+--------------+------- N2
主持人乙充当网络网关氮气对于仅位于N1。这对于到达大多数地方来说都很好,除了尝试与在两个网络上都有接口的主机通信时。也就是说,如果主机Aping 主机德或主办C在其地址C1,一切正常。如果它在C2,我可以看到tcpdump
ping 到达C2,但我没有看到它离开任何 C 的接口。
为什么没有发送响应?这是路由表的问题还是其他问题?
答案1
这可能是由于反向路径过滤。简而言之:
当启用了反向路径过滤的机器接收到数据包时,该机器将首先检查接收到的数据包的源是否可以通过其传入接口访问。
- 如果它可以通过它所来自的接口进行路由,那么机器就会接受该数据包。
- 如果无法通过其所来自的接口进行路由,那么机器将丢弃该数据包。
正如您给出的示例,主机 C 在其 C2 接口上接收源地址为 A1 的数据包;但是从主机 C 到 A1 的路由将经过 C1 接口。因此数据包到达了“错误”的接口,并被丢弃。
执行以下命令:
grep . /proc/sys/net/ipv4/conf/*/rp_filter
您可能会看到至少 C2 接口的值为“1”,这意味着反向路径过滤已打开。
您可以关闭此过滤,但对于您而言,“松散模式过滤”可能更合适:将根据所有接口检查传入的源地址,如果匹配,则即使它严格来自错误的接口,也会被接受。在这种情况下,您需要使用值“2”。要将其应用于所有接口:
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 2 > $i; done
请参阅ip-sysctl.txt
内核源代码提供的文件,或在线访问www.kernel.org并检查rp_filter
那里的描述。