发布时间:2024-12-04 02:02:52
```go import ( "github.com/google/gopacket" "github.com/google/gopacket/pcap" ) ```
```go // 列出所有可用的网络设备 devs, err := pcap.FindAllDevs() if err != nil { log.Fatal(err) } // 选择一个设备 var deviceName string for _, dev := range devs { deviceName = dev.Name break } // 打开所选设备 handle, err := pcap.OpenLive(deviceName, 65536, true, pcap.BlockForever) if err != nil { log.Fatal(err) } ```
```go // 设置过滤条件 err = handle.SetBPFFilter("tcp and port 80") if err != nil { log.Fatal(err) } ```
在上面的例子中,我们过滤了TCP协议和端口号为80的网络包。```go // 捕获和处理网络包 packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) for packet := range packetSource.Packets() { // 处理每一个网络包 } ```
在上面的例子中,`packetSource.Packets()`返回一个通道,我们可以使用它来迭代所有捕获到的网络包。```go // 获取网络包的源/目标IP地址和端口号 networkLayer := packet.NetworkLayer() if networkLayer != nil { srcIP := networkLayer.NetworkFlow().Src() dstIP := networkLayer.NetworkFlow().Dst() } transportLayer := packet.TransportLayer() if transportLayer != nil { srcPort := transportLayer.TransportFlow().Src() dstPort := transportLayer.TransportFlow().Dst() } ```
在上面的例子中,我们使用`NetworkFlow`和`TransportFlow`方法从网络包中提取了源/目标IP地址和端口号。