ip a 输出的 inet/inet6 行

ip a 输出的 inet/inet6 行

我试图理解ip a命令的输出。

例如,我们可以从中得到以下输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
         valid_lft forever preferred_lft forever 
     inet6 ::1/128 scope host 
         valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 
     link/ether 00:15:5d:4c:26:18 brd ff:ff:ff:ff:ff:ff 
     inet 172.21.254.173/20 brd 172.21.255.255 scope global eth0 
         valid_lft forever preferred_lft forever 
     inet6 fe80::215:5dff:fe4c:2618/64 scope link 
        valid_lft forever preferred_lft forever

我想了解的是关于inet和inet6的信息。

我研究过它们是IPv4和IPv6的信息,然后它说IP地址(和广播地址)和范围。

但我找不到范围信息后内容的文档。例如,lo之后inet 127.0.0.1/8 scope host

我已经看到它可能有附加信息,例如dynamic.

有人知道有关他们的文件吗?

(另外,我不知道为什么inet行的末尾显示了接口名称,而inet6行则没有)

谢谢你!

答案1

man ip将为您提供有关该命令的标题文档ip。最后,它提供了交叉引用(“另请参阅”),以便ip-address了解有关该ip address命令的更多信息。

如果您查看该文档,man ip-address您会发现对该范围的引用,例如:

IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label LABEL ] [ scope SCOPE-ID ]

SCOPE-ID := [ host | link | global | NUMBER ]

进一步搜索同一手册页将定义SCOPE如下

scope SCOPE_VALUE该地址有效的区域范围。文件中列出了可用范围/etc/iproute2/rt_scopes。预定义范围值为:

  • global- 该地址全球有效。
  • site-(仅限 IPv6,已弃用)该地址是站点本地地址,即该地址在该站点内有效。
  • link- 该地址是本地链接地址,即仅在此设备上有效。
  • host- 该地址仅在该主机内部有效。

您问题的第二部分由类型地址的定义来回答link

答案2

IPv6 链路本地地址的特殊之处在于,作为正常操作的一部分,在每个 IPv6 链路上使用相同的地址范围。它所说的部分scope link强调了链接本地地址fe80::215:5dff:fe4c:2618/64仅在 上有效eth0,它对于其他网络接口上的主机来说不是有效的地址。 (事实上​​,相同的地址可能被其他链路上的其他主机使用,尽管考虑到通常根据 MA​​C 地址分配地址的方式,这种情况很少见。)

这与全局地址不同,全局地址在所有链路和接口上都有效。

请参见例如“地址范围”和“范围文字 IPv6 地址(带区域索引)”部分维基百科页面“IPv6 地址”

答案3

我将尝试回答您提到的部分问题:

“我不知道为什么 inet 行的末尾显示接口名称,而 inet6 行则不然”

inet(或 ipv4)似乎出于历史原因列出了接口名称。这似乎与“别名”接口有关,当您希望在一个接口上有多个地址时,通常会使用“别名”接口。 Linux 现在可以在单个接口上支持多个 IP 地址而无需别名,但过去情况并非如此。为了向后兼容,接口别名仍然存在。

inet6(或 ipv6)不使用该(别名)信息。或者更准确地说,Linux 内核 netlink 接口在查询接口 inet6 地址信息时不会报告接口名称 (IFA_LABEL)。

请注意,我使用与您的问题关联的标签来假设您使用的是 Ubuntu 发行版中的 Linux。该命令ip address show(或ip a如您所说)来自ip路由2包裹。该命令通过 netlink 功能从 Linux 内核获取网络接口和网络地址信息。

使用命令man 7 rtnetlink(或参考https://man7.org/linux/man-pages/man7/rtnetlink.7.html)将提供一些有关 netlink 接口以及 IFA_LABEL 所在位置的信息。

《Understanding Linux Network Internals》一书对 ifa_label 做了如下描述:“一个字符串,主要用于向后兼容 2.0.x 内核,允许使用名称如 eth0:1 的别名接口”。

以下链接(https://www.kernel.org/doc/html/latest/networking/alias.html)还将 Linux ip 别名功能描述为历史悠久的,但为了向后兼容仍然存在。

如果您想更深入地了解细节(这可能更适合 StackOverflow 而不是 UnixLinux),您可以在文件 ip/ipaddress.c 中查找包含“if (rta_tb[IFA_LABEL])”的行“ip地址显示”(iproute2)的源代码。您将看到,如果该命令从内核接收到 IFA_LABEL 信息,那么它会将其打印为命令的输出。

正如其他人所指出的,ip 和 ip-address 的手册页可以为您可以在 inet 和 inet6 之后的输出中看到的其他一些值提供附加信息。

这是我对其工作原理的理解,其他人可能有更多/更好的信息。

相关内容