https://github.com/vishvananda/netlink,netlink 是 Linux 系统里用户态程序、内核模块之间的一种 IPC 方式,特别是用户态程序和内核模块之间的 IPC 通信。比如在 Linux 终端里常用的 ip 命令,就是使用 netlink 去跟内核进行通信的。例如想在golang代码中实现ip link add xx的效果,一种办法是使用exec包执行对应的ip命令,另一种是采用netlink的方式,但是自己操作netlink还是有点繁琐。

netlink 包为 go 提供了一个简单的 netlink 库。Netlink 是 linux用户态程序用来与内核通信的接口。它可用于添加和删除接口、设置 ip 地址和路由以及配置 ipsec。Netlink 通信需要提升权限,因此在大多数情况下,此代码需要以 root 身份运行。由于底层 netlink 消息晦涩不好理解和使用,因此该库尝试提供一个简易api,该 API 模仿了 iproute2 提供的 CLI。诸如 ip link add 之类的操作将通过类似命名的函数(如 AddLink())来完成。这个库最初是 docker/libcontainer 中 netlink 功能的一个分支。

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)
}
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: %vn", la.Name, err)
  }
  eth1, _ := netlink.LinkByName("eth1")
  netlink.LinkSetMaster(eth1, mybridge)
}