以gopacket为起点学习Golang

以gopacket为起点学习Golang,go,dns,gopacket,Go,Dns,Gopacket,我最近(一月)开始学习咕噜。我试图复制我们内部使用的一个工具,它是用Python在Go中编写的 因此,我有一个完全用于DNS UDP解码的工具,但是我已经为基于TCP的DNS解码努力了一周。我的目标是记录每个到达我们DNS服务器的数据包的DNS源、目的地、查询和应答。不过,我们有一个内部解决方案,目前正在使用Python来适应我们内部的自定义日志记录和事件关联系统 func Listen(h *pcap.Handle, c *Config, logger chan<- *dnslo

我最近(一月)开始学习咕噜。我试图复制我们内部使用的一个工具,它是用Python在Go中编写的

因此,我有一个完全用于DNS UDP解码的工具,但是我已经为基于TCP的DNS解码努力了一周。我的目标是记录每个到达我们DNS服务器的数据包的DNS源、目的地、查询和应答。不过,我们有一个内部解决方案,目前正在使用Python来适应我们内部的自定义日志记录和事件关联系统

    func Listen(h *pcap.Handle, c *Config, logger chan<- *dnslog) {
        qType := decodeQuery()
        OpCode := decodeOpCode()
        parser := gopacket.NewDecodingLayerParser(
            layers.LayerTypeEthernet,
            &eth,
            &ip4,
            &ip6,
            &tcp,
            &udp,
            &dns,
            )

            decoded := make([]gopacket.LayerType, 0, 10)

        for {
            data, _, err := h.ZeroCopyReadPacketData()
            if err != nil {
                log.Println("Error reading packet data ", err)
                continue
            }

            dnslog := &dnslog{}

            err = parser.DecodeLayers(data, &decoded)
            for _, layer := range decoded {
                switch layer {
                case layers.LayerTypeIPv4:
                    dnslog.Dst = ip4.DstIP.String()
                    dnslog.Src = ip4.SrcIP.String()
                case layers.LayerTypeIPv6:
                    dnslog.Dst = ip6.DstIP.String()
                    dnslog.Src = ip6.SrcIP.String()
                case layers.LayerTypeTCP:
                    dnslog.Srcport = fmt.Sprintf("%d", tcp.SrcPort)
                    dnslog.Dstport = fmt.Sprintf("%d", tcp.DstPort)
                case layers.LayerTypeUDP:
                    dnslog.Srcport = fmt.Sprintf("%d", udp.SrcPort)
                    dnslog.Dstport = fmt.Sprintf("%d", udp.DstPort)
                case layers.LayerTypeDNS:
                    dnslog.Truncated = dns.TC
                    for _, q := range dns.Questions {
                        dnslog.OpCode = OpCode[uint8(dns.OpCode)]
                        dnslog.QueryCount = dns.QDCount
                        dnslog.AnswerCount = dns.ANCount
                        }
                    }
            }
        logger <- dnslog
    }
func-Listen(h*pcap.Handle,c*Config,logger-chanI),但最终失败了


它还不支持TCP段的分段,但对于我的用例来说已经足够好了(目前)。

如果没有更多的数据,很难/不可能回答。建议制作并发布一个简短的示例(尽可能小)来演示您的确切问题,包括您希望在什么时候显示什么数据(例如一些fmt.Printf)(“这应该是X,但打印Y:%…”;以及如何从“挖掘”或什么获取程序输入?请提供确切的命令行。)如果你还没有解决这个问题,也请阅读这篇文章:你解决了这个问题吗?还有…你的解决方案是开源的吗?我需要解决一个非常类似的问题,我很想重用你的解决方案。