Hau*_*ing 18 linux networking routing
路由表条目有一个属性scope。我想知道从global到link(或相反)的变化如何影响网络系统。
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(公共 - 可路由)都可以被赋予链接或全域(全局)范围。它由系统管理员配置。
假设我们有 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 则
- 具有 scope=host 的 ip 只能作为具有 scope=host 的路由的后端
- 带有 scope=link 的 ip 只能作为带有 scope=host 或 scope=link 的路由的后端
- ip with scope=global 只能作为具有任何范围的路由的后端
我对这种令人不舒服的建筑感到非常惊讶
如果你想忘记所有这些“范围的东西” - 只需在路由表中的路由中使用 src 字段。
范围影响源地址选择。
\n\n对于源地址尚未固定的连接/关联(例如,启动 TCP 连接,但在对传入数据包做出反应时不启动),将根据数据包即将命中的路由范围来选择源地址。
\n\n这就是地址也具有范围属性的原因。
\n\n不发生源地址选择的示例:传入的 TCP 连接启动或 ping 数据包将以相反的 IP 地址进行应答(源 \xe2\x86\x92 目标,目标 \xe2\x86\x92 源),否则其他主机将不会将数据包识别为答案。
\n\n发生源地址选择的示例: ping xyz或telnet xyz。普通程序不会告诉操作系统使用哪个源地址(这是一个好习惯)。操作系统需要选择一个并准备这样做:它测试它将命中的路由的潜在传出数据包(正常路由仅使用目标地址,如果您使用高级路由,数据包将还没有源地址! )。生成的范围将选择范围减少为传出接口上相应范围中的地址(如果有可用)。
| 归档时间: |
|
| 查看次数: |
27768 次 |
| 最近记录: |