使用Ubuntu 14
我有一个Linux机器,其中有两个接口: eth1: 172.16.20.1 ppp0: 192.168.0.2
ppp0连接到具有PPP接口(192.168.0.1)和广域网接口(172.16.20.2)的设备。我可以验证这个装置能达到172.16.20.1
我遇到的问题是,如果我在同一台机器上使用Python发送数据包:
import socket
cl = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cl.sendto("Hello", ("172.16.20.1", 5005))import socket
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.bind(("", 5005))
while True:
data, addr = srv.recvfrom(2048)
print("Message: ", data)脚本运行良好,但我看不到Wireshark上的数据包来自eth1 (只有当我选择在lo接口上捕获时才能看到它)。我假设操作系统已经检测到数据包是用于它的一个本地接口,而不是通过创建的192.168.0.2套接字发送它。
当我添加以下规则以防止这种情况发生时:
sudo ip route del table local 172.16.20.1 dev eth1
sudo ip route add table local 172.16.20.1 dev ppp0
sudo ip route flush cache所发生的是:
忽略ppp0接口并使用两个ethx接口:如果我尝试在两台单独的机器(客户机和服务器)中运行程序(不应用规则),我可以看到到达Wireshark eth1的数据包,以及server.py上的输出。如果我尝试在两台独立的机器上运行该程序,并将上述规则应用于ppp0连接(我还没有删除它),我将无法再看到来自server.py的任何输出,但仍然可以看到到达Wireshark的数据包。我对TCP/IP协议栈的了解不是很好,但是看来链路层已经不再转发到应用层了?
发布于 2018-01-17 07:48:22
看起来链接层不再转发到应用层了。
链接层不是问题;它不受您的配置的影响。这是关于网络层(IP)的。
local表是内核确定包是否可以在本地传递的方法。如果删除IP地址,数据包将被路由或丢弃。
我想这只是因为MAC地址位于另一个系统的ARP缓存中。如果本地表中缺少地址,则接收系统不会响应ARP请求。
发布于 2019-09-17 11:59:33
确保接收到的数据包的UDP和IP4校验和是正确的。在wireshark中启用校验和计算,并检查是否捕获。
发布于 2023-02-15 14:42:52
在我的情况下,最初,我无法看到和捕获本地流量。
经过调查,根本原因是我在错误的网络接口上捕获了网络流量。
例如,我捕获eth0网络接口流量而不是loopback网络接口流量。
因此,要查看和捕获本地网络流量,您应该选择loopback或any来捕获所有可用网络接口的流量。
https://unix.stackexchange.com/questions/417676
复制相似问题