funcmain() { devs, err := pcap.FindAllDevs() if err != nil { return } for _, dev := range devs { for _, addr := range dev.Addresses { fmt.Println(dev.Name, "=>", addr.IP.String()) } } }
设备信息:
1 2 3 4 5 6 7
// Interface describes a single network interface on a machine. type Interface struct { Name string Description string Flags uint32 Addresses []InterfaceAddress }
Addresses :
1 2 3 4 5 6
type InterfaceAddress struct { IP net.IP Netmask net.IPMask // Netmask may be nil if we were unable to retrieve it. Broadaddr net.IP // Broadcast address for this IP may be nil P2P net.IP // P2P destination address for this IP may be nil }
dumpFile, _ := os.Create("dump.pcap") defer dumpFile.Close() packetWriter := pcapgo.NewWriter(dumpFile) packet := packetSource.Packets() for packet := range packet{ packetWriter.WritePacket(packet.Metadata().CaptureInfo, packet.Data()) }
数据包解码
Layers 包是 gopacket 的 Go 库中的新功能,在底层 libpcap 库中不存在。它是 gopacket 库的非常有用的一部分。它允许我们轻松地识别数据包是否包含特定类型的层。
1 2 3 4 5
for _, layer := range packet.Layers() { fmt.Println(layer.LayerType().String()) // 当前层的类型 (TCP/DNS/UDP...) fmt.Println(layer.LayerContents()) fmt.Println(layer.LayerPayload()) }
分析某层的数据:
1 2 3 4 5 6 7 8 9 10 11 12
for packet := range packetSource.Packets() { // 判断数据包是否为 dns 数据包 dnsLayer := packet.Layer(layers.LayerTypeDNS) if dnsLayer != nil { // 断言为 DNS 类型 dns := dnsLayer.(*layers.DNS) for _, q := range dns.Questions { // 遍历 Questions 输出 Name fmt.Println(string(q.Name)) } } }