以gopacket为起点学习Golang
我最近(一月)开始学习咕噜。我试图复制我们内部使用的一个工具,它是用Python在Go中编写的 因此,我有一个完全用于DNS UDP解码的工具,但是我已经为基于TCP的DNS解码努力了一周。我的目标是记录每个到达我们DNS服务器的数据包的DNS源、目的地、查询和应答。不过,我们有一个内部解决方案,目前正在使用Python来适应我们内部的自定义日志记录和事件关联系统以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
func Listen(h *pcap.Handle, c *Config, logger chan<- *dnslog) {
qType := decodeQuery()
OpCode := decodeOpCode()
parser := gopacket.NewDecodingLayerParser(
layers.LayerTypeEthernet,
ð,
&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:%…”;以及如何从“挖掘”或什么获取程序输入?请提供确切的命令行。)如果你还没有解决这个问题,也请阅读这篇文章:你解决了这个问题吗?还有…你的解决方案是开源的吗?我需要解决一个非常类似的问题,我很想重用你的解决方案。