接口范围(全局与链接)用于什么?

Hau*_*ing 18 linux networking routing

路由表条目有一个属性scope。我想知道从globallink(或相反)的变化如何影响网络系统。

cuo*_*glm 14

让我们看看route scope定义Linux

The scope of a route in Linux is an indicator of the distance to the
destination network.

Host
    A route has host scope when it leads to a destination address on the local host.
Link
    A route has link scope when it leads to a destination address on the local network.
Universe
    A route has universe scope when it leads to addresses more than one hop away.
Run Code Online (Sandbox Code Playgroud)

因此,如果您更改路由的范围,您的计算机可能无法再通过该路由连接到网络。路由器根本不转发发送到目的地所属本地网络的数据包。

请注意,范围不反映不可路由(私有)和可路由(公共)地址之间的区别。

10.0.0.1(私有 - 不可路由)和 8.8.8.8(公共 - 可路由)都可以被赋予链接或全域(全局)范围。它由系统管理员配置。

  • 这里的小吹毛求疵:在 IPv4 中,所有地址都是 **可路由的**,包括 10.0.0.0/8 和 192.168.0.0/16 -- 但 10.0.0.0/8 不在公共网络中路由。但是您仍然可以路由它们,例如,在您的子网 10.0.0.0/8 内。只有 IPv6 存在不可路由的地址,即 ::1 和 LLA。 (5认同)

Ale*_*lex 8

假设我们有 3 个不同范围的 ip 的 NIC 设置

14: ens160: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 36:ee:4c:d0:90:3a brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.1/24 scope host ens160
    inet 172.21.0.1/24 scope link ens160
    inet 172.20.0.1/24 scope global ens160
   
Run Code Online (Sandbox Code Playgroud)

假设我们在路由表中有一些 ens160 的路由

172.20.0.0/24 dev ens160  proto kernel  scope link  src 172.20.0.1
Run Code Online (Sandbox Code Playgroud)

正如我们所见,我们在 NIC 和路由中设置了范围。

如果一个路由在这种情况下指定了 src,linux 将完全忽略路由和 NIC 设置中的范围设置。它完全忽略它。而linux只用于流出NIC src ip = 172.20.0.1的数据包

假设我们有另一条路线

4.4.4.4  scope link
Run Code Online (Sandbox Code Playgroud)

如果路由中未指定 src ip,则 linux 会查看路由的作用域。在我们的例子中,范围 = 链接。然后linux进入NIC设置并搜索具有相同范围的IP。在我们的例子中,IP 的 scope=link = 172.21.0.1/24。

所以对于 dst ip = 4.4.4.4 linux 将使用 src ip = 172.21.0.1

如果路由中未指定范围,则表示 scope = global

例子

35.35.35.35 dev ens160
Run Code Online (Sandbox Code Playgroud)

下一个。让我们看看默认路由

default via 172.16.102.1 dev ens160 onlink
Run Code Online (Sandbox Code Playgroud)

它没有指定范围,这意味着范围=全局

由于默认路由没有指定 src,这意味着 linux 将使用 scope=global 搜索 ens160 IP 并将其用作 src ip。

下一个。假设路由有一个范围,而 NIC IP 有另一个范围。例子

网卡

14: vasya2: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 36:ee:4c:d0:90:3a brd ff:ff:ff:ff:ff:ff
    inet 172.22.0.1/24 scope host vasya2
Run Code Online (Sandbox Code Playgroud)

一条路线

14.14.14.14  scope link
Run Code Online (Sandbox Code Playgroud)

当我们 ping 14.14.14.14 时会发生什么

该路由具有范围=链接,但 NIC 仅具有范围=主机的 IP。关键是具有 scope=host 的 ip 只能作为具有 scope=host 的路由的后端。在其他情况下 linux 不能使用这样的 ip。所以linux将使用src ip = 0.0.0.0作为dst ip 14.14.14.14

(实际上,这还取决于 nic 是真实物理的还是例如虚拟的,如果在这种情况下 nic 是虚拟的,linux 将使用来自另一个
具有 scope=global 的nic 的其他一些 ip )

一般规则:如果路由没有指定 src 则

  1. 具有 scope=host 的 ip 只能作为具有 scope=host 的路由的后端
  2. 带有 scope=link 的 ip 只能作为带有 scope=host 或 scope=link 的路由的后端
  3. ip with scope=global 只能作为具有任何范围的路由的后端

我对这种令人不舒服的建筑感到非常惊讶

如果你想忘记所有这些“范围的东西” - 只需在路由表中的路由中使用 src 字段。


Rob*_*mer 6

范围影响源地址选择。

\n\n

对于源地址尚未固定的连接/关联(例如,启动 TCP 连接,但在对传入数据包做出反应时不启动),将根据数据包即将命中的路由范围来选择源地址。

\n\n

这就是地址也具有范围属性的原因。

\n\n

不发生源地址选择的示例:传入的 TCP 连接启动或 ping 数据包将以相反的 IP 地址进行应答(源 \xe2\x86\x92 目标,目标 \xe2\x86\x92 源),否则其他主机将不会将数据包识别为答案。

\n\n

发生源地址选择的示例: ping xyztelnet xyz。普通程序不会告诉操作系统使用哪个源地址(这是一个好习惯)。操作系统需要选择一个并准备这样做:它测试它将命中的路由的潜在传出数据包(正常路由仅使用目标地址,如果您使用高级路由,数据包将还没有源地址! )。生成的范围将选择范围减少为传出接口上相应范围中的地址(如果有可用)。

\n