我正在尝试使用 gopacket 发送手工制作的 DNS 数据包。
这是我的代码:
package main
import (
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func main() {
handle, err := pcap.OpenLive("lo", 1500, false, pcap.BlockForever)
if err != nil {
panic(err)
}
// Create ethernet layer
eth := layers.Ethernet{
SrcMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
DstMAC: net.HardwareAddr{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
EthernetType: layers.EthernetTypeIPv4,
}
// Create ip layer
ip := layers.IPv4{
Version: 4,
TTL: 64,
SrcIP: net.IP{1, 3, 3, 7},
DstIP: net.IP{127, 0, 0, 1},
Protocol: layers.IPProtocolUDP,
}
// Create udp layer
udp := layers.UDP{
SrcPort: 62003,
DstPort: 9000,
}
udp.SetNetworkLayerForChecksum(&ip)
qst := layers.DNSQuestion{
Name: []byte{'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '.'},
Type: layers.DNSTypeCNAME,
Class: layers.DNSClassIN,
}
dns := layers.DNS{
BaseLayer: layers.BaseLayer{},
ID: 0,
QR: true,
OpCode: 0,
AA: false,
TC: false,
RD: true,
RA: true,
Z: 0,
ResponseCode: 0,
QDCount: 1,
ANCount: 1,
NSCount: 0,
ARCount: 0,
Questions: []layers.DNSQuestion{qst},
}
buffer := gopacket.NewSerializeBuffer()
options := gopacket.SerializeOptions{
ComputeChecksums: true,
FixLengths: true,
}
if err = gopacket.SerializeLayers(buffer, options,
ð,
&ip,
&udp,
&dns,
); err != nil {
panic(err)
}
outgoingPacket := buffer.Bytes()
if err = handle.WritePacketData(outgoingPacket); err != nil {
panic(err)
}
}
没有问题,我正确地看到了通过线路传输的 UDP 数据包,但是,当我使用 Wireshark 捕获它时,它在“协议”列中被标记为“UDP”,但如果我尝试host www.google.com
,捕获的数据包被标记为“DNS”。所以我想我正在发送格式错误的数据包,但我找不到我丢失的东西。
我已经检查过这个问题,但它并没有解决我的问题。