考虑以下拓扑:
我将 ICMP(ping)数据包从 发送host B
到10.0.1.1
。他们到达了目标,而目标的答案是reply
。连接工作正常。
运行时,开host A
tcpdump -i eth1 icmp
: 我没有看到任何数据包tcpdump -i eth2 icmp
: 看到包了
有没有办法检查打算接口的数据包是否eth1
确实到达了该接口?
我依稀记得有一天读到内核正在处理eth2
级别(这是数据包到达的第一个接口)的回复,因此可以解释为什么监控eth1
不会产生任何结果。
至于为什么我需要检查这样的特定情况:我有数据包到达主机接口(第一个接口)但似乎没有到达预期接口(实际应用程序没有启动)的情况)。这样的测试将确保防火墙/转发正常并且问题出在其他地方(在应用程序的配置中,应用程序中的错误等)
在 Linux 中,通过检查数据包是否应由本地计算机处理来路由传入数据包。如果应该,则直接对其进行处理,而无需先通过“正确的接口”对其进行路由。IP 地址只是机器的别名,数据包到达哪个接口并不重要。
如果您在本地进行,也会发生同样的情况
telnet 10.0.1.1
- 它不会出现在它上面,eth1
而是在lo
它处理从本地机器到自身的所有数据包。但是,对于出站数据包,地址所属的接口确实有所不同。内核首先决定如何路由数据包,然后据此为数据包选择最佳源 IP。
如果您需要查看“所有数据包”
tcpdump
,您可以使用tcpdump -i any icmp
. 它不会向您显示接口,但您会看到所有数据包都在发送,例如10.0.1.1
。您正在谈论的主题是弱/强主机模型,Linux 默认使用弱主机模型。
我会说防火墙将允许设置这样的约束。
您在前面的示例中提到了 ICMP。完全使用它来验证是否存在真实连接有什么问题?
此外,在这一点上,您已经非常接近为服务使用环回接口的实践了——它主要与动态路由结合使用,但主要思想非常简单:请求来自什么接口并不重要,它只是它找到了它的方式的事情,也可以发送回复。除非手动告知,否则环回接口永远不会关闭——“真实”接口 OTOH 可以由于链路丢失等原因更改其状态。