vishvananda/netlink
GitHub: vishvananda/netlink
该库为 Go 语言封装了 Linux netlink 接口,提供简洁的高层 API 来实现网络接口、地址、路由及 ipsec 的编程式管理。
Stars: 3283 | Forks: 834
# netlink - 用于 go 的 netlink 库
 [](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分析, 日志审计