使用Ubuntu 14
我有一台 Linux 机器,有两个接口: eth1: 172.16.20.1 ppp0: 192.168.0.2
ppp0 连接到具有 PPP 接口 (192.168.0.1) 和 WAN 接口 (172.16.20.2) 的设备。我可以验证该设备可以到达172.16.20.1
我遇到的问题是,如果我在同一台机器上使用 Python 发送数据包:
客户端.py
import socket
cl = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
cl.sendto("Hello", ("172.16.20.1", 5005))
服务器.py
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
发生的情况是:
- 我可以看到Wireshark上的数据包现在到达eth1,源地址是WAN地址(172.16.20.2)
- 重新启动程序后,我看不到 server.py 的任何输出。
忽略 ppp0 接口并使用两个 ethx 接口: 如果我尝试在两台(客户端和服务器)独立的机器上运行该程序(不应用规则),我可以在 Wireshark 中看到到达 eth1 的数据包,以及 server.py 上的输出。如果我尝试在两台单独的机器上运行该程序,并且对 ppp0 连接应用上述规则(我没有删除它),我将无法再看到 server.py 的任何输出,但仍然可以看到到达 Wireshark 的数据包。我对TCP/IP协议栈的了解不好,但是看起来链路层不再转发到应用层了?
答案1
看起来链路层不再转发到应用层
链路层不是问题;它不受您的配置影响。这是关于网络层(IP)的。
该local
表是内核确定数据包是否可以在本地传递的方式。您删除 IP 地址,数据包将被路由或丢弃。
我猜这之所以有效只是因为 MAC 地址位于其他系统的 ARP 缓存中。如果本地表中缺少地址,我希望接收系统不会应答 ARP 请求。
答案2
确保接收到的数据包的 UDP 和 IP4 校验和正确。在wireshark中启用校验和计算并检查捕获情况。
答案3
就我而言,最初,我无法查看和捕获本地流量。
经过排查,根本原因是我抓到了网络流量网络接口错误。
例如,我捕获eth0
网络接口流量而不是loopback
网络接口流量。
因此,要查看并捕获本地网络流量,您应该选择loopback
或any
which 捕获所有可用网络接口的流量。