在 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")
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.