如何获取虚拟网络接口的IP地址?这是一个如下所示的接口:
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.40.1 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
这是我如何检索常规接口的IP地址:
func GetInterfaceIpAddr(interfaceName string) (string, error) {
var (
ief *net.Interface
addrs []net.Addr
ipv4Addr net.IP
)
ief, err := net.InterfaceByName(interfaceName)
if err != nil { // get interface
log.Info("InterfaceByName failed")
return "", err
}
addrs, err = ief.Addrs()
if err != nil {
return "", err
}
for _, addr := range addrs { // get ipv4 address
if ipv4Addr = addr.(*net.IPNet).IP.To4(); ipv4Addr != nil {
break
}
}
if ipv4Addr == nil {
return "", errors.New(fmt.Sprintf("interface %s doesn't have an ipv4 address\n", interfaceName))
}
return ipv4Addr.String(), nil
}
当我将lo:0
传递给上面的函数时,net.InterfaceByName
失败,并显示以下错误:route ip+net: no such network interface
.
2条答案
按热度按时间tcomlyy61#
我想我发现了您的代码中的两个直接问题:
1.接口别名如
lo:0
不是一个"虚拟接口",它只是一个标签应用到一个地址。你会发现地址与主接口相关联(在本例中为lo
)。ifconfig
命令的输出是误导性的,你不应该使用它;使用ip addr
查看接口地址配置。例如,如果我使用
ifconfig
创建一个"别名接口",如下所示:我看到
ifconfig
的以下输出:而
ip addr
告诉我:在这里你可以看到,辅助地址实际上是通过一些额外的元数据与设备
lo
相关联的,如果我们在Go语言中请求lo
的接口地址:我们得到:
所以你问题第一部分的答案是"使用主接口名"。但是还有第二个问题:
1.接口可以有多个ipv4地址,但是(a)你的代码只返回一个地址,(b)你的代码只返回第一个地址。
这里合适的解决方案取决于您尝试做什么:
我认为在大多数情况下这将是最好的选择。
label
。ip addr
并解析输出,就可以通过调用ip -j addr show
获得JSON输出。h7wcgrx32#
在Linux上,您可以使用https://github.com/vishvananda/netlink来获取IP地址和标签。
这可能看起来像这样:
Ubuntu上的测试给出:
这可能还不是你所需要的细节,但它可能是朝着正确方向迈出的第一步。