在 linux 中使用 gogpacket 给本地发送 icmp 包无响应,windows 中给本机发正常,给其他 Ip 发正常、linux 中给其他 Ip 发包也正常,但是给自己发包五响应,下图前两个包是使用 ping 发送的,显示正常,第三个包是 gopacket 发送的,没有响应 
func TestPingPacket(t *testing.T) { dstIP := net.ParseIP("192.168.2.12") // 目标 IP 地址 // 创建 ICMPv4 层 icmpLayer := &layers.ICMPv4{ TypeCode: layers.CreateICMPv4TypeCode(layers.ICMPv4TypeEchoRequest, 0), Id: uint16(os.Getpid()), Seq: 1, } // 创建 IPv4 层 ipLayer := &layers.IPv4{ SrcIP: net.ParseIP("192.168.2.12"), // 源 IP 地址 DstIP: dstIP, Version: 4, TTL: 64, Id: uint16(os.Getpid()), Protocol: layers.IPProtocolICMPv4, Flags: layers.IPv4DontFragment, } // 创建以太网( Ethernet )层 ethernetLayer := &layers.Ethernet{ SrcMAC: net.HardwareAddr{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, // 源 MAC 地址 DstMAC: net.HardwareAddr{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, // 目标 MAC 地址 EthernetType: layers.EthernetTypeIPv4, // 使用 IPv4 } h := "cd470e0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637" b, _ := hex.DecodeString(h) // 构造数据包 buffer := gopacket.NewSerializeBuffer() // time currentTime := time.Now().Unix() byteData := make([]byte, 8) binary.LittleEndian.PutUint64(byteData, uint64(currentTime)) byteData = append(byteData, b...) payload := gopacket.Payload(byteData) serializerOptions := gopacket.SerializeOptions{FixLengths: true, ComputeChecksums: true} err := payload.SerializeTo(buffer, serializerOptions) if err != nil { println(err.Error()) return } err = icmpLayer.SerializeTo(buffer, serializerOptions) if err != nil { println(err.Error()) return } err = ipLayer.SerializeTo(buffer, serializerOptions) if err != nil { println(err.Error()) return } err = ethernetLayer.SerializeTo(buffer, serializerOptions) if err != nil { println(err.Error()) return } handle, err := pcap.OpenLive("lo", 65536, false, pcap.BlockForever) if err != nil { fmt.Println("Error opening interface:", err) return } defer handle.Close() err = handle.WritePacketData(buffer.Bytes()) if err != nil { fmt.Println("Error sending packet:", err) return } println("send icmp ok") } 