首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gopacket正确手工创建DNS数据包?

如何使用gopacket正确手工创建DNS数据包?
EN

Stack Overflow用户
提问于 2021-02-16 00:46:40
回答 2查看 406关注 0票数 0

我正在尝试使用gopacket发送手工创建的DNS数据包。

下面是我的代码:

代码语言:javascript
复制
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,
        &eth,
        &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,但它没有解决我的问题。

EN

回答 2

Stack Overflow用户

发布于 2021-02-16 17:09:19

问题似乎出在Wireshark端,我尝试了您的代码,如果您执行以下任一操作,它将显示为DNS:

代码语言:javascript
复制
 udp := layers.UDP{
        SrcPort: 62003,
        DstPort: 53, // < --- changed here
 }

  1. 右键单击条目并选择Decode As,然后更改UDP端口9000并将Current设置为UDP
票数 0
EN

Stack Overflow用户

发布于 2022-01-21 13:00:30

尝试定义真实的MAC地址(eth.SrcMACeth.DstMAC)。

同样,你也应该尝试像这样设计一个问题:

代码语言:javascript
复制
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},
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66212036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档