如果你看这个diagram http://www.brendangregg.com/Perf/linux_perf_tools_full.png,你会注意到tcpdump
作用于Ethernet
层。然后来了,IP
then TCP/UDP
, then Sockets
. nc
运行于TCP/UDP
layer.
In the IP
级别,数据包可能会被丢弃。很多时候的情况是反向路径过滤 https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.rpf.html.
因此,您可以看到到达以太网层的数据包,可以通过以下方式看到tcpdump
,但数据包未到达nc
因为它们可能会被路由到其他地方,或者被丢弃。
所以,最好检查一下是否禁用RP filtering
并检查iptable
规则,有帮助!
Update:
当您在环回接口上操作时:
MAC 用于以太网流量的最低级别,并且仅在一个 LAN 内使用,并帮助引导 LAN 内的流量。本地网络接口上不需要它(lo
)因为数据包正在内部处理。
环回地址直接在IP层连接到同一台计算机,无需使用任何物理硬件。因此,它可以让您绕过以太网、PPP 和其他驱动程序。
package main
import (
"fmt"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func main() {
handle, err := pcap.OpenLive("lo0", 1500, false, pcap.BlockForever)
if err != nil {
fmt.Printf("%s\n", err.Error())
return
}
eth := layers.Ethernet{
EthernetType: layers.EthernetTypeIPv4,
SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
}
_ = eth // Ignore. Use where ethernet interface is used
// Used for loopback interface
lo := layers.Loopback{
Family: layers.ProtocolFamilyIPv4,
}
ip := layers.IPv4{
Version: 4,
TTL: 64,
SrcIP: net.IP{127, 0, 0, 1},
DstIP: net.IP{127, 0, 0, 1},
Protocol: layers.IPProtocolUDP,
}
udp := layers.UDP{
SrcPort: 62003,
DstPort: 9000,
}
udp.SetNetworkLayerForChecksum(&ip)
payload := []byte{'a', 'b', 'c', '\n'}
options := gopacket.SerializeOptions{
ComputeChecksums: true,
FixLengths: true,
}
buffer := gopacket.NewSerializeBuffer()
// if err = gopacket.SerializeLayers(buffer, options,
// ð,
// &ip,
// &udp,
// gopacket.Payload(payload),
// ); err != nil {
// fmt.Printf("[-] Serialize error: %s\n", err.Error())
// return
// }
if err = gopacket.SerializeLayers(buffer, options,
&lo,
&ip,
&udp,
gopacket.Payload(payload),
); err != nil {
fmt.Printf("[-] Serialize error: %s\n", err.Error())
return
}
outgoingPacket := buffer.Bytes()
if err = handle.WritePacketData(outgoingPacket); err != nil {
fmt.Printf("[-] Error while sending: %s\n", err.Error())
return
}
}
我正在 macOS Catalina 上运行该程序,如果您看到屏幕截图,它正在运行。nc
可以接收自定义生成的数据包。如果校验和不正确,那么它将被丢弃。
我希望它有帮助!