vishvananda/netlink

GitHub: vishvananda/netlink

该库为 Go 语言封装了 Linux netlink 接口,提供简洁的高层 API 来实现网络接口、地址、路由及 ipsec 的编程式管理。

Stars: 3283 | Forks: 834

# netlink - 用于 go 的 netlink 库 ![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/f3/f3f4e221a5dc62216fb4c41bd95ba593ff81926a920a0e548312c3f7bdb124b6.svg) [![GoDoc](https://godoc.org/github.com/vishvananda/netlink?status.svg)](https://godoc.org/github.com/vishvananda/netlink) netlink 包为 go 提供了一个简单的 netlink 库。Netlink 是 linux 中的用户空间程序用来与内核进行通信的接口。 它可以用于添加和删除接口、设置 IP 地址 和路由,以及配置 ipsec。Netlink 通信需要提升的 权限,因此在大多数情况下,此代码需要以 root 身份运行。由于 底层的 netlink 消息极其难以理解,该库试图 提供一个松散地基于 iproute2 提供的 CLI 的 api。 像 `ip link add` 这样的操作将通过类似命名的 函数(如 AddLink())来完成。该库最初作为 [docker/libcontainer](https://github.com/docker/libcontainer) 中 netlink 功能的分支, 但经过了大量的重写,以提高可测试性、性能, 并添加了新功能,如 ipsec xfrm 处理。 ## 本地构建和测试 你可以使用 go get 命令: ``` go get github.com/vishvananda/netlink ``` 测试依赖项: ``` go get github.com/vishvananda/netns ``` 测试(需要 root): ``` sudo -E go test github.com/vishvananda/netlink ``` ## 示例 添加一个新的 bridge 并将 eth1 添加到其中: ``` package main import ( "fmt" "github.com/vishvananda/netlink" ) func main() { la := netlink.NewLinkAttrs() la.Name = "foo" mybridge := &netlink.Bridge{LinkAttrs: la} err := netlink.LinkAdd(mybridge) if err != nil { fmt.Printf("could not add %s: %v\n", la.Name, err) } eth1, _ := netlink.LinkByName("eth1") netlink.LinkSetMaster(eth1, mybridge) } ``` 注意 `NewLinkAttrs` 构造函数,它会在结构体中设置默认值。目前 它只将 `TxQLen` 设置为 `-1`,因此内核会自动设置默认值。如果你 使用简单的初始化(`LinkAttrs{Name: "foo"}`),除非你像 `LinkAttrs{Name: "foo", TxQLen: 1000}` 这样指定它,否则 `TxQLen` 将被设置为 `0`。 向 loopback 添加一个新的 IP 地址: ``` package main import ( "github.com/vishvananda/netlink" ) func main() { lo, _ := netlink.LinkByName("lo") addr, _ := netlink.ParseAddr("169.254.169.254/32") netlink.AddrAdd(lo, addr) } ``` ## 未来工作 许多部分的 netlink 在高级接口中尚未得到完全支持。 几乎所有高级对象的各个方面都还不存在。 许多底层原语已经有了,所以只需将 正确的字段放入高级对象中,并确保它们在 Add 和 List 方法中 被正确地序列化和反序列化。 还有一些底层的 netlink 功能仍然 需要实现。路由规则尚未到位,还有一些 更高级的 link 类型。希望现有的良好结构和测试 能让这些内容的添加变得相当简单。
标签:EVTX分析, 日志审计