【发布时间】:2018-11-09 03:05:00
【问题描述】:
似乎通过使用 gopacket/gopcap 发送的数据包以某种方式“发送”,因为它们在 tshark 跟踪中可见:
444 143.613451037 127.0.0.1 → 127.0.0.1 UDP 66 6000 → 8888 Len=22
但这些数据包永远不会到达在同一台机器上侦听 127.0.0.1:8888 的进程(例如 netcat -ul 8888)。
有人对为什么会这样或要尝试的事情有任何提示吗?如前所述,这些数据包实际上在 tshark 跟踪中可见......之后它们似乎完全消失了。
... irrelevant
out , err := pcap.OpenLive(*iface, 65535, true, -1 * time.Second)
out.WritePacketData(buf.Bytes())
... irrevelant
这个想法是构造数据包并将它们发送到lo,以便侦听127.0.0.1:<some port>的进程实际上可以看到这些数据包。
IP src/dst 均为 127.0.0.1,以太网 src/dst 均为 00:00:00:00:00:00。
编辑:
就更多研究而言,似乎使用 pcap 发送数据包会绕过 IP 网络堆栈,从而使进程无法看到数据包。一种解决方法是在跟踪中剥离较低级别的数据包并打开常规 udp/tcp 套接字并通过该套接字发送有效负载。
【问题讨论】:
-
疯狂猜测。由于某些防止欺骗的规则,某些本地防火墙规则是否会丢弃数据包?如果您的防火墙规则被清除/关闭,是否也会发生这种情况?
-
nah... pcap 似乎绕过了 ip 堆栈。
-
pcap 中数据包的以太网地址是什么?你是如何捕获 pcap 的?您在发送之前是否更改了它的内容?
-
我在本地机器上捕获了它们,所以地址应该没问题。
-
为了它的价值:以太网地址全为零(可能是因为它的
lo而不是eth*)。 ip src 和 dst 显然是 127.0.0.1。
标签: linux go network-programming pcap