florianl/go-tc

GitHub: florianl/go-tc

纯Go语言实现的Linux流量控制库,通过netlink协议提供对qdisc、filter和class的读写能力。

Stars: 523 | Forks: 53

# tc [![PkgGoDev](https://pkg.go.dev/badge/github.com/florianl/go-tc)](https://pkg.go.dev/github.com/florianl/go-tc) [![Go Report Card](https://goreportcard.com/badge/github.com/florianl/go-tc)](https://goreportcard.com/report/github.com/florianl/go-tc) [![GitHub Actions](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/108b61f453171140.svg)](https://github.com/florianl/go-tc/actions) [![Coverage Status](https://coveralls.io/repos/github/florianl/go-tc/badge.svg)](https://coveralls.io/github/florianl/go-tc) 这是 `tc` 的开发中版本。它提供了一个无需 [C](https://en.wikipedia.org/wiki/C_(programming_language) 绑定的 API,用于访问基于 [netlink](http://man7.org/linux/man-pages/man7/netlink.7.html) 的 [rtnetlink](http://man7.org/linux/man-pages/man7/rtnetlink.7.html) [流量控制系统](http://man7.org/linux/man-pages/man8/tc.8.html)。 ## 示例 ``` package main import ( "fmt" "net" "os" "github.com/mdlayher/netlink" "github.com/florianl/go-tc" ) func main() { // open a rtnetlink socket rtnl, err := tc.Open(&tc.Config{}) if err != nil { fmt.Fprintf(os.Stderr, "could not open rtnetlink socket: %v\n", err) return } defer func() { if err := rtnl.Close(); err != nil { fmt.Fprintf(os.Stderr, "could not close rtnetlink socket: %v\n", err) } }() // For enhanced error messages from the kernel, it is recommended to set // option `NETLINK_EXT_ACK`, which is supported since 4.12 kernel. // // If not supported, `unix.ENOPROTOOPT` is returned. err = rtnl.SetOption(netlink.ExtendedAcknowledge, true) if err != nil { fmt.Fprintf(os.Stderr, "could not set option ExtendedAcknowledge: %v\n", err) return } // get all the qdiscs from all interfaces qdiscs, err := rtnl.Qdisc().Get() if err != nil { fmt.Fprintf(os.Stderr, "could not get qdiscs: %v\n", err) return } for _, qdisc := range qdiscs { iface, err := net.InterfaceByIndex(int(qdisc.Ifindex)) if err != nil { fmt.Fprintf(os.Stderr, "could not get interface from id %d: %v", qdisc.Ifindex, err) return } fmt.Printf("%20s\t%s\n", iface.Name, qdisc.Kind) } } ``` 查看[包文档](https://pkg.go.dev/github.com/florianl/go-tc#pkg-examples)以获取更多高级示例。 ## 要求 * 支持上游 [Go](https://golang.org/doc/devel/release.html#policy) 版本 ## 权限 此包直接从内核处理信息,因此需要特殊权限。您可以通过调整 `CAP_NET_ADMIN` 权限来获取此权限。 ``` setcap 'cap_net_admin=+ep' /your/executable ```
标签:EVTX分析, Go库, Go语言, Linux内核, MacOS取证, netlink, qdisc, QoS, rtnetlink, tc命令, traffic control, 带宽控制, 数据包调度, 日志审计, 流量控制, 程序破解, 系统编程, 网络工具, 网络编程, 队列管理