在 Linux 中,命令
ip address add [...]
有一个scope
参数。手册页说范围是“此地址有效的区域的范围”。以下是合法范围的列表:
- 全球的
- 地点
- 关联
- 主持人
这个“有效范围”具体指什么呢?
答案1
从http://linux-ip.net/html/tools-ip-address.html:
范围 | 描述
全球 | 在任何地方有效
站点 | 仅在本站点内有效 (IPv6)
链接 | 仅在此设备上有效
主机 | 仅在此主机(机器)内有效
范围通常由 ip 实用程序确定,无需在命令行上明确使用。(...)
以下引文来自本书理解 Linux 网络内部作者:Christian Benvenuti,O'Reilly:
“Linux 中路由的范围是到目标网络距离的指标。IP 地址的范围是该地址与本地主机距离的指标,在某种程度上,它还告诉您该地址的所有者与本地主机的距离 (...)。
主机:当地址仅用于主机内部通信时,它具有主机范围。主机外部不了解此地址,因此无法使用。例如,环回地址 127.0.0.1
链接:当地址有意义且只能在 LAN 内使用时,该地址具有链接范围。例如子网的广播地址。
全局:当地址可以在任何地方使用时,它就具有全局范围。这是大多数地址的默认范围。(...)”
使用作用域的主要原因似乎是具有多个接口和地址的主机必须决定何时使用哪个地址。对于与自身通信,可以使用环回地址(作用域主机)。对于与其他地方的通信,必须选择不同的地址。
答案2
要开始理解范围的定义,您应该首先了解什么是链路本地地址和站点本地地址。一旦弄清楚了这些,其他的就都明白了。引用 IPv6 文档中的一些片段。
关联
链路本地地址用于寻址单个链路上的节点。来自或发往链路本地地址的数据包将不会被路由器转发。
例如 169.254/16 范围。当设备无法从 DHCP 获取有效地址时,您可能之前就见过该范围。
地点
站点本地地址应该在站点内使用。路由器不会将任何带有站点本地源地址或目标地址的数据包转发到站点外。
这仅适用于 IPv6。IPv4 中没有站点本地地址的概念。
主持人
主机地址仅存在于主机本身内。例如,127.0.0.1 是通常分配给环回接口的主机地址。环回接口没有外部连接,因此其范围仅限于主机范围内。
全球的
全局地址就是您目前认为的“普通”地址。即单播地址,它在外部网络上可见且可路由。
答案3
在以下位置找到这些评论fib_语义.c
704 * Every prefix is assigned a "scope" value: "host" is local address,
705 * "link" is direct route,
706 * [ ... "site" ... "interior" ... ]
707 * and "universe" is true gateway route with global meaning.
708 *
709 * Every prefix refers to a set of "nexthop"s (gw, oif),
710 * where gw must have narrower scope. This recursion stops
711 * when gw has LOCAL scope or if "nexthop" is declared ONLINK,
712 * which means that gw is forced to be on link.
....
719 * Normally it looks as following.
720 *
721 * {universe prefix} -> (gw, oif) [scope link]
722 * |
723 * |-> {link prefix} -> (gw, oif) [scope local]
724 * |
725 * |-> {local prefix} (terminal node)
726 */
答案4
好的。我将给出真正的实际例子而不仅仅是理论。
我在我的笔记本上作用域链接在
/etc/network/interfaces
auto ens160
iface ens160 inet static
address 172.16.102.33
netmask 255.255.255.0
network 172.16.102.0
broadcast 172.16.102.255
**scope link**
gateway 172.16.102.1
当我尝试的时候
# ping 8.8.8.8
我的网关 cisco asa 阻止了我的数据包并在日志中写入
Deny IP spoof from (0.0.0.0) to 8.8.8.8 on interface sandbox
所以我无法获得 8.8.8.8
如果你使用 tcpdump,你会看到 linux 确实会发送带有 scr ip = 0.0.0.0 的 LAN 数据包
tcpdump -n -vv icmp -i ens160
当我用以下方法更改 /etc/network/interfaces 时作用域 全局
auto ens160
iface ens160 inet static
address 172.16.102.33
netmask 255.255.255.0
network 172.16.102.0
broadcast 172.16.102.255
**scope global**
gateway 172.16.102.1
我可以成功获得 8.8.8.8
这就是网络设置的范围如何对 IP 数据包产生真正的影响
另外,如果您想要了解有关范围的更详细解释,请查看此处 -https://unix.stackexchange.com/a/611945/214557