路由表条目有一个属性scope
。我想知道从global
到 的更改link
(或相反)如何影响网络系统。
答案1
假设我们的 NIC 设置有 3 个不同范围的 IP
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
假设我们在路由表中有一些 ens160 的路由
172.20.0.0/24 dev ens160 proto kernel scope link src 172.20.0.1
正如我们所看到的,我们在 NIC 和路由中进行了范围设置。
如果路由指定了 src,在这种情况下,linux 会完全忽略路由和 NIC 设置中的范围设置。它完全忽略它。而linux只是在从NIC流出的数据包中使用src ip = 172.20.0.1
假设我们有另一条路线
4.4.4.4 scope link
如果路由中没有指定 src ip,那么 linux 会查看该路由的范围。在我们的例子中,范围=链接。然后linux进入NIC设置并搜索具有相同范围的IP。在我们的例子中,IP 范围 = 链接 = 172.21.0.1/24。
所以对于 dst ip = 4.4.4.4 linux 将使用 src ip = 172.21.0.1
如果路由中未指定范围,则表示范围 = 全局
例子
35.35.35.35 dev ens160
下一个。让我们看看默认路由
default via 172.16.102.1 dev ens160 onlink
它没有指定范围,这意味着范围=全局
由于默认路由没有指定 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
一条路线
14.14.14.14 scope link
当我们 ping 14.14.14.14 时会发生什么
路由具有范围 = link,但 NIC 仅具有范围 = host 的 IP。关键是范围 = host 的 IP 只能作为范围 = host 的路由的后端。在其他情况下,Linux 不能使用这样的 IP。因此,Linux 将使用 src ip = 0.0.0.0 作为 dst ip 14.14.14.14
(实际上,这还取决于网卡是真实物理的还是虚拟的,如果网卡是虚拟的,在这种情况下,linux将使用来自另一个
具有scope=global的网卡的其他IP)
一般规则:如果路由没有指定 src,则
- 具有scope=host的ip只能作为具有scope=host的路由的后端
- 带有scope=link的ip只能作为带有scope=host或scope=link的路由的后端
- 具有 scope=global 的 ip 只能作为具有任何范围的路由的后端
我对这种不舒服的建筑感到非常惊讶
如果您想忘记所有这些“范围内容” - 只需在路由表中的路由中使用 src 字段即可。
答案2
让我们看一下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.
因此,如果您更改路由的范围,您的计算机可能无法再连接到该路由中的网络。路由器根本不转发发送到目的地属于本地网络的数据包。
请注意,范围并不反映不可路由(私有)和可路由(公共)地址之间的区别。
10.0.0.1(专用 - 不可路由)和 8.8.8.8(公共 - 可路由)都可以指定链接或 Universe(全局)范围。由系统管理员配置。
答案3
范围影响源地址选择。
对于源地址尚未固定的连接/关联(例如,启动 TCP 连接,但在对传入数据包做出反应时不启动),将根据数据包即将命中的路由范围来选择源地址。
这就是地址也具有范围属性的原因。
不发生源地址选择的示例:传入的 TCP 连接发起或 ping 数据包将以相反的 IP 地址进行应答(源 → 目的地、目的地 → 源),否则其他主机将无法将该数据包识别为应答。
发生源地址选择的示例: ping xyz
或者telnet xyz
。普通程序不会告诉操作系统使用哪个源地址(这是一个好习惯)。操作系统需要选择一个并准备这样做:它测试它将命中的路由的潜在传出数据包(正常路由仅使用目标地址,如果您使用高级路由,数据包将还没有源地址! )。生成的范围将选择范围减少为传出接口上相应范围中的地址(如果有可用)。