Go语言用GoPacket抓包分析

本文介绍了在Go语言中利用gopacket库进行网络数据包抓取和分析的方法,包括离线pcap包解析和源码分析。通过新建packetSource和读取数据包,使用gopacket实现对网络流量的捕获和理解,同时提醒在使用过程中需要注意的要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近有了一个抓取网络数据包来分析的需求,最近在使用go语言,于是乎,决定是用go语言来进行抓包分析。使用的Google的gopacket包来进行。基于的是libcap包。

github地址:https://github.com/google/gopacket

我并不喜欢GoDoc的行文风格,对于demo可以看着这里的文章。(自备梯子)

http://www.devdungeon.com/content/packet-capture-injection-and-analysis-gopacket

离线pcap包解析

package main

import (
    "fmt"
    "log"
    "reflect"
    "strings"

    "github.com/google/gopacket"
    "github.com/google/gopacket/layers"
    "github.com/google/gopacket/pcap"
)

func main() {
    path := "/Users/liruopeng/Downloads/test2.pcap"
    handler, err := pcap.OpenOffline(path)
    if err != nil {
        log.Fatal(err)
    }
    defer handler.Close()

    packetSource := gopacket.NewPacketSource(handler, handler.LinkType())

    i := 0
    for packet := range packetSource.Packets() {
        // if i < 1 {
   
        //  fmt.Println(packet)
        //  // break
        // }
        i++
        if i == 2915 {
            printPacketInfo(packet)
        }
    }

    fmt.Println(i)
}

func printPacketInfo(packet gopacket.Packet) {
    // Let's see if the packet is an ethernet packet
    ethernetLayer := packet.Layer(layers.LayerTypeEthernet)
    if ethernetLayer != nil {
        fmt.Println("Ethernet layer detected.")
        ethernetPacket, _ := ethernetLayer.(*layers.Ethernet)
        fmt.Println("Source MAC: ", ethernetPacket.SrcMAC)
        fmt.Println("Destination MAC: ", ethernetPacket.DstMAC)
        // Ethernet type is typically IPv4 but could be ARP or other
        fmt.Println("Ethernet type: ", ethernetPacket.EthernetType)
        fmt.Println()
    }

    // Let's see if the packet is IP (even though the ether type told us)
    ipLayer := packet.Layer(layers.LayerTypeIPv4)
    if ipLayer != nil {
        fmt.Println("IPv4 layer detected.")
        ip, _ := ipLayer.(*layers.IPv4)

        // IP layer variables:
        // Version (Either 4 or 6)
        // IHL (IP Header Length in 32-bit words)
        // TOS, Length, Id, Flags, FragOffset, TTL, Protocol (TCP?),
        // Checksum, SrcIP, DstIP
        fmt.Printf("From %s to %s\n", ip.SrcIP, ip.DstIP)
        fmt.Println("Protocol: ", ip.Protocol)
        fmt.Println()
    }

    // Let's see if the packet is TCP
    tcpLayer := packet.Layer(layers.LayerTypeTCP)
    if tcpLayer != nil {
        fmt.Println("TCP layer detected.")
        tcp, some := tcpLayer.(*layers.TCP)
        // tcp := tcpLayer
        fmt.Println(reflect.TypeOf(tcp), reflect.TypeOf(tcpLayer))
        // fmt.Println(tcpLayer)
        fmt.Println("some=", some)

        // TCP layer variables:
        // SrcPort, DstPort, Seq, Ack, DataOffset, Window, Checksum, Urgent
        // Bool flags: FIN, SYN, RST, PSH, ACK, URG, ECE, CWR, NS
        // fmt.Printf("From port %d to %d\n", tcpLayer.SrcPort, tcpLayer.DstPort)
        fmt.Printf("From port %d to %d\n", tcp.SrcPort, tcp.DstPort)
        fmt.Println("Sequence number: ", tcp.Seq)
        fmt.Println()
    }

    // Iterate over all layers, printing out each layer type
    fmt.Println("All packet layers:")
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值