florianl/go-tc
GitHub: florianl/go-tc
纯Go语言实现的Linux流量控制库,通过netlink协议提供对qdisc、filter和class的读写能力。
Stars: 523 | Forks: 53
# tc [](https://pkg.go.dev/github.com/florianl/go-tc) [](https://goreportcard.com/report/github.com/florianl/go-tc) [](https://github.com/florianl/go-tc/actions) [](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, 带宽控制, 数据包调度, 日志审计, 流量控制, 程序破解, 系统编程, 网络工具, 网络编程, 队列管理