我正在尝试使用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)
}
}但是,当我使用Wireshark捕获它时,它在“协议”列中被标记为" UDP“,但是如果我尝试host www.google.com,捕获的数据包被标记为"DNS”。所以我猜我发送的是格式错误的数据包,但是我找不到我丢失的内容。

我已经检查了这个question,但它没有解决我的问题。
发布于 2021-02-16 17:09:19
问题似乎出在Wireshark端,我尝试了您的代码,如果您执行以下任一操作,它将显示为DNS:
udp := layers.UDP{
SrcPort: 62003,
DstPort: 53, // < --- changed here
}Decode As,然后更改UDP端口9000并将Current设置为UDP发布于 2022-01-21 13:00:30
尝试定义真实的MAC地址(eth.SrcMAC和eth.DstMAC)。
同样,你也应该尝试像这样设计一个问题:
qst := layers.DNSQuestion{
Name: []byte{'w', 'w', 'w', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm'}, // without last dot
Type: layers.DNSTypeA,
Class: layers.DNSClassIN,
}
dns := layers.DNS{
RD: true, // enable recursion (should be just enough)
Questions: []layers.DNSQuestion{qst},
}https://stackoverflow.com/questions/66212036
复制相似问题