smallnest/goscapy

GitHub: smallnest/goscapy

Stars: 9 | Forks: 1

# goscapy [![Go参考](https://pkg.go.dev/badge/github.com/smallnest/goscapy.svg)](https://pkg.go.dev/github.com/smallnest/goscapy) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e15ab1659f103247.svg)](https://github.com/smallnest/goscapy/actions/workflows/ci.yml) [![Go版本](https://img.shields.io/badge/Go-%3E%3D1.26-blue)](https://go.dev/) [![许可证](https://img.shields.io/badge/license-MIT-green)](LICENSE) 一个用于构建、解析、发送、接收和嗅探网络数据包的纯Go库。goscapy 提供了符合Go语言习惯的API,包含类型安全的构建器和单行快捷函数。 ## 功能 - **Builder API** — 通过流畅的方法链进行类型安全、显式的数据包构建 - **快捷函数** — 为常见协议栈提供单行函数,配备合理的默认值 - **数据包解析** — 将原始字节解析为结构化数据包,并支持协议自动检测 - **发送与接收** — 通过原始套接字(L2 和 L3)发送和接收数据包 - **数据包嗅探** — 使用基于回调或通道的API捕获实时流量,并支持 BPF 过滤器 - **自动校验和** — 在序列化过程中自动计算 IP、TCP、UDP 和 ICMP 校验和 - **层绑定** — 相邻层之间的自动字段推断(例如,IP over Ethernet → EtherType=0x0800) - **跨平台** — 支持 Darwin (macOS) 和 Linux,包含平台特定的原始套接字实现 ## 支持的协议 | 层 | 协议 | |-------|-----------| | 链路层 | Ethernet, ARP | | 网络层 | IPv4 | | 传输层 | TCP, UDP, ICMP | | 负载 | Raw | ## 安装 ``` go get github.com/smallnest/goscapy ``` ## 快速开始 ### 构建数据包(Builder API) ``` // Ethernet + IP + ICMP Echo Request pkt, err := goscapy.NewEthernet(). SrcMAC("aa:bb:cc:dd:ee:ff"). DstMAC("ff:ff:ff:ff:ff:ff"). Over(goscapy.NewIP().SrcIP("192.168.1.1").DstIP("8.8.8.8")). Over(goscapy.NewICMP().Type(8).Code(0)). Build() ``` ### 构建数据包(快捷方式) ``` // Same as above, in one line pkt, err := goscapy.EtherIPICMP("ff:ff:ff:ff:ff:ff", "8.8.8.8", 8, 0) ``` ### 解析数据包 ``` raw := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ...} // raw bytes pkt, err := packet.Dissect(raw, packet.DissectEthernet) fmt.Println(pkt.String()) // "Ethernet / IP / ICMP" ``` ### 发送数据包 ``` pkt, _ := goscapy.EtherIPICMP("ff:ff:ff:ff:ff:ff", "8.8.8.8", 8, 0) sendrecv.Send(pkt, "eth0") // send at L3 (IP level) sendrecv.Sendp(pkt, "eth0") // send at L2 (Ethernet) ``` ### 嗅探数据包 ``` // Callback-based sniff.Sniff(sniff.SniffConfig{ Iface: "eth0", Filter: "icmp", Timeout: 10 * time.Second, }, func(pkt *packet.Packet) bool { fmt.Println(pkt) return true // continue sniffing }) // Channel-based ch, stop := sniff.SniffChan(sniff.SniffConfig{Iface: "eth0", Count: 5}) defer stop() for pkt := range ch { fmt.Println(pkt) } ``` ## 文档 完整文档请访问 [pkg.go.dev/github.com/smallnest/goscapy](https://pkg.go.dev/github.com/smallnest/goscapy)。 ### 包 | 包 | 描述 | |---------|-------------| | `pkg/goscapy` | Builder API 和快捷函数 | | `pkg/packet` | 核心数据包/层类型,构建,解析,字段绑定 | | `pkg/layers` | 协议层定义 (Ethernet, ARP, IP, TCP, UDP, ICMP, Raw) | | `pkg/sendrecv` | 原始套接字发送/接收 (Send, Sendp, Recv, SendRecv) | | `pkg/sniff` | 支持 BPF 过滤器的数据包嗅探 | | `pkg/fields` | 字段类型系统 (序列化, 反序列化) | ### 快捷函数 | 函数 | 协议栈 | |----------|---------------| | `EtherIP` | Ethernet + IPv4 + Payload | | `EtherIPICMP` | Ethernet + IPv4 + ICMP | | `EtherIPTCP` | Ethernet + IPv4 + TCP | | `EtherIPUDP` | Ethernet + IPv4 + UDP | | `EtherARP` | Ethernet + ARP | | `IPICMP` | IPv4 + ICMP (无 Ethernet) | | `IPTCP` | IPv4 + TCP (无 Ethernet) | | `IPUDP` | IPv4 + UDP (无 Ethernet) | ### 构建器 | 构建器 | 关键方法 | |---------|-------------| | `EthernetBuilder` | `SrcMAC`, `DstMAC`, `Type` | | `IPBuilder` | `SrcIP`, `DstIP`, `TTL`, `Proto`, `ID` | | `ICMPBuilder` | `Type`, `Code`, `ID`, `Seq` | | `TCPBuilder` | `SrcPort`, `DstPort`, `Flags`, `Seq`, `Ack`, `Window` | | `UDPBuilder` | `SrcPort`, `DstPort` | | `ARPBuilder` | `Op`, `SrcMAC`, `SrcIP`, `DstMAC`, `DstIP` | ## 平台支持 | 平台 | L2 收发 | L3 收发 | BPF 过滤器 | 环回接口 | |----------|:------------:|:------------:|:----------:|:--------:| | macOS (Darwin) | BPF | AF_INET | 内核 BPF | lo0 | | Linux | AF_PACKET | AF_INET | SO_ATTACH_FILTER | lo | ## 要求 - Go 1.26+ - macOS 或 Linux - 执行原始套接字操作需要 Root/管理员权限 - `tcpdump`(可选,用于通过 `sniff.CompileFilter` 编译 BPF 过滤器字符串) ## Makefile 文件 ``` make build # Build all packages make test # Run all tests make test-race # Run tests with race detector make test-cover # Run tests with coverage profile make bench # Run benchmarks make lint # Run golangci-lint make fmt # Format code make vet # Run go vet make check # Run fmt + vet + lint + test ``` ## 许可证 MIT 许可证。详情请参阅 [LICENSE](LICENSE)。
标签:ARP, BPF 过滤器, EVTX分析, Golang, Go 语言, ICMP, IPv4, Scapy 移植, TCP, UDP, 以太网, 内核驱动, 原始套接字, 安全编程, 数据包处理, 数据包构造, 数据包解析, 网络协议, 网络嗅探, 网络安全, 网络工具, 网络库, 网络编程, 自动校验和, 防御绕过, 隐私保护