Ubuntu下在GoLand中使用gopacket进行网络数据抓包并分析

前提:

安装好 go 环境,下载地址如下:
https://golang.google.cn/dl/

然后使用命令 tar -zxvf 解压安装

之后建立一个文件夹(我建的是 goprojects),用来存放之后的go项目

在终端里输入一下命令:

1、编辑环境变量(没有安装vim的,可以根据提示命令进行安装):

vim /etc/profile

2、设置 GOROOT以及GOPATH:

export GOPATH=/home/wyj/mine/software/goprojects
export GOROOT=/home/wyj/mine/software/go
export PATH=$PATH:/home/wyj/mine/software/go/bin
export PATH=$PATH:$GOPATH:$GOROOT:/bin

3、输入以下命令更改后的境变量生效:

source /etc/profile

测试是否安装 go 成功:

go version

Ubuntu下在GoLand中使用gopacket进行网络数据抓包并分析
之后,每次新打开一个终端,运行go命令,都需要先输入以下命令:

source /etc/profile

一、首先,下载gopacket包,libpcap库,配置下条件

在终端中输入以下命令:

# Get the gopacket package from GitHub
go get github.com/google/gopacket
# Pcap dev headers might be necessary
sudo apt-get install libpcap-dev
  • 如果提示go: missing Git command. 则是因为 ubuntu 中没有安装 git ,需要去安装,命令如下:
sudo apt install git
  • 如果是提示Command 'go' not found ,则需要输入命令:
source /etc/profile
  • 如果一直下载不成功的话,则是因为被墙了,这个解决方式因人而异,总体上就是设置代理之类的

  • 注意: 下载的 gopacket 要存放在 GOPATH 中,如果不在,自己去移过去,不然程序无法成功导入 gopacket 相关包

二、进行测试

1、获取本机所有的网络设备信息

package main

import (
	"fmt"
	"github.com/google/gopacket"
	"github.com/google/gopacket/pcap"
	"log"
	"time"
)

func main() {
	// Find all devices
	devices, err := pcap.FindAllDevs()
	if err != nil {
		log.Fatal(err)
	}

	// Print device information
	fmt.Println("Devices found:")
	index:=1
	for _, d := range devices {
		fmt.Printf("\n%d———— Name:%s\n", index, d.Name)
		fmt.Println("Description: ", d.Description)
		fmt.Println("Devices addresses: ", d.Addresses)
		index++

		for _, address := range d.Addresses {
			fmt.Println("- IP address: ", address.IP)
			fmt.Println("- Subnet mask: ", address.Netmask)
		}
	}
}

输出如下:

Ubuntu下在GoLand中使用gopacket进行网络数据抓包并分析
2、打开设备实时捕捉数据信息

首先,判断需要用哪个网络设备,这个可以根据 IP address 去判断,以192开头的一般就是,我的是 ens33
然后就在 main 方法中添加以下代码:

//抓包
// Open device
handle, err = pcap.OpenLive(device, snapshot_len, promiscuous, timeout)
if err != nil {log.Fatal(err) }
defer handle.Close()

// Use the handle as a packet source to process all packets
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
	// Process packet here
	fmt.Println(packet)
}

并且,需要在 main 方法外同时添加一个:

var (
	device       string = "ens33"//根据个人情况而定
	snapshot_len int32  = 1024
	promiscuous  bool   = false
	err          error
	timeout      time.Duration = 30 * time.Second
	handle       *pcap.Handle
)

输出获取的数据结果如下:
Ubuntu下在GoLand中使用gopacket进行网络数据抓包并分析
*****如果报以下错误

you don’t have permission to capture on that device

则说明没有访问权限,此时,需要打开运行程序所生成的 build 文件,在终端中用root 用户,cdbuild 文件所在路径,之后 通过 ./文件 运行即可!
例如:./go_build_main_go

如果还是不可以,说明此用户没有 root 权限,需要去赋予,使用 vim /etc/sudoers 命令,在 root ALL=(ALL:ALL) ALL 这一行下加上一行:

用户名 ALL=(ALL:ALL) ALL

再去执行 exe 文件即可!

上一篇:GoLand——windows下如何编译Linux二进制文件


下一篇:(转)java多线程的一篇好文