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