一、前言
近来,笔者想学习下用go构造tcp数据包,这里涉及到gopacket库的使用,故这里记录下关于gopacket库的一些学习记录
二、介绍
gopacket 是 Go 语言的网络数据包处理库,它提供了方便的 API 来读取、分析、修改和生成网络数据包。你可以使用这个库来修改数据包内容,以实现特定的网络测试或安全目的。
修改数据包的过程大致如下:
-
使用 gopacket 读取数据包并解码为特定协议的数据结构(如 IP、TCP 等)。
-
修改相应的字段,如源 IP 地址、目的 IP 地址、源端口、目的端口等。
-
将数据包编码为原始字节流并写回网络。
通过 gopacket 库可以很方便地实现数据包的修改。
三、使用
加载:go get -u github.com/google/gopacket
1、枚举所有网络设备
func GetAllDevs() {
//获取所有设备信息
devices, err := pcap.FindAllDevs()
if err != nil {
log.Fatal(err)
}
//打印设备信息
fmt.Println("找到的Devices 信息:")
for _, device := range devices {
fmt.Println("\n名字:", device.Name)
fmt.Println("描述信息:", device.Description)
fmt.Println("Devices 地址信息:", device.Addresses) //网口地址信息列表包括IP 、 掩码、 广播地址 、P2P
for _, address := range device.Addresses {
fmt.Println("- IP 地址为:", address.IP)
fmt.Println("- 掩码为:", address.Netmask)
fmt.Println("- 广播地址为:", address.Broadaddr)
fmt.Println("- P2P地址为:", address.P2P)
fmt.Println()
}
}
}
//获取所有有IP的网络设备名称
func GetAllDevsHaveAddress() (string, error) {
pcapDevices, err := pcap.FindAllDevs()
if err != nil {
return "", errors.New(fmt.Sprintf("list pcapDevices failed: %s", err.Error()))
}
var buf strings.Builder
for _, dev := range pcapDevices {
fmt.Sprint("Dev:", dev.Name, "\tDes:", dev.Description)
buf.WriteString(dev.Name)
if len(dev.Addresses) > 0 {
for _, ips := range dev.Addresses {
fmt.Sprint("\tAddr:", ips.IP.String())
//buf.WriteString(ips.IP.String())
}
}
buf.WriteString("\n")
}
return buf.String(), nil
}
//通过IP获取设备名称
func GetDevByIp(ip net.IP) (devName string, err error) {
devices, err := pcap.FindAllDevs()
if er