如何检查数据包是否到达多接口上下文中的接口?

如何检查数据包是否到达多接口上下文中的接口?

考虑以下拓扑:

在此输入图像描述

我正在从 发送 ICMP (ping) 数据包host B10.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 可以由于链路丢失等原因更改其状态。

相关内容