Linux 网络路由简介

9 位读者喜欢这篇文章。
5 sys admin horror stories

Opensource.com

六月份,当我讨论基本网络配置时,我当时没有谈到的一件事是路由。本文简要介绍了 Linux 计算机的路由,旨在帮助理解简单的环境。

连接到网络的每台计算机都需要某种类型的路由指令,以便在网络 TCP/IP 数据包离开本地主机时使用。这通常非常简单,因为大多数网络环境都非常简单,并且对于离开的数据包只有两个选项。所有数据包要么发送到本地网络上的设备,要么发送到其他远程网络。

让我们务必将“本地”网络定义为本地主机所在的逻辑网络,通常也是物理网络。从逻辑上讲,这意味着本地子网,在该子网中,主机被分配了本地子网 IP 地址范围之一。从物理上讲,这意味着主机连接到一个或多个交换机,这些交换机也连接到本地网络的其余部分。

TCP/IP 网络模型

在我们深入了解路由之前,了解一点数据包如何在网络上找到正确的主机是有帮助的。TCP/IP 网络模型定义了一个五层堆栈,该堆栈描述了将数据包从一台主机移动到另一台主机所需的机制,无论该主机是在本地网络上还是在地球的另一端。以下对此模型的描述中的每一层都进行了编号,并且还包含该层处理的数据单元的名称。

5. 应用层:消息 此层由各种网络应用程序进行通信所需的连接协议组成,例如 HTTP、DHCP、SSH、FTP、SMTP、IMAP 等。当您从远程网站请求网页时,会向 Web 服务器发送连接请求,响应会在此层发送回您的主机,然后您的浏览器会在其窗口中显示该网页。

4. 传输层:TCP 段。传输层提供端到端数据传输和流管理服务,这些服务独立于正在传输的数据和协议类型。它使用端口(例如 HTTP 的 80 端口和 SMTP 的 25 端口)在发送主机和远程主机之间建立连接。

3. 互联网层:数据包。数据包路由在互联网层执行。此层负责跨两个或多个不同网络路由数据包,以便到达其最终目的地。此层使用IP 地址和路由表来确定将数据包发送到哪个设备。如果发送到路由器,则每个路由器都负责仅将数据包发送到系列中的下一个路由器,而不是负责规划从本地主机到目标主机的整个路由。互联网层主要关于路由器与路由器之间的通信,以确定链中的下一个路由器。

2. 数据链路层:帧。链路层管理单个本地逻辑物理网络上的硬件主机之间的直接连接。此层使用嵌入在网络接口卡 (NIC) 中的媒体访问控制 (MAC) 地址来识别连接到本地网络的物理设备。此层无法访问不在本地网络上的主机。

1. 物理层:位。这是硬件层,由 NIC 和物理以太网电缆以及用于传输构成任何两个本地连接的主机或其他网络节点之间的数据帧的各个位的硬件级协议组成。

一个简单的例子

当主机实际使用 TCP/IP 网络模型在网络上发送数据时,会是什么样子?以下是我自己编造的关于数据如何从一个网络移动到另一个网络的描述。在本示例中,我的计算机正在向远程服务器发送网页请求。

  1. 在应用层,浏览器发起一个 HTTP 连接请求消息到远程主机 www.example.com,以发送回包含网页内容的数据。这就是消息,它仅包含远程 Web 服务器的 IP 地址。

  2. 传输层将包含网页请求的消息封装在 TCP 数据报中,并将远程 Web 服务器的 IP 地址作为目标地址。连同原始请求数据包,此数据包现在包含请求的源端口(通常是非常高的随机端口),以便返回数据知道浏览器正在侦听哪个端口;以及远程主机上的目标端口,在本例中为 80 端口。

  3. 互联网层将 TCP 数据报封装在数据包中,该数据包还包含源 IP 地址和目标 IP 地址。

  4. 数据链路层使用地址解析协议 (ARP) 来识别默认路由器的物理 MAC 地址,并将互联网数据包封装在帧中,该帧包含源 MAC 地址和目标 MAC 地址。

  5. 帧通过电缆(通常为 CAT5 或 CAT6)从本地主机上的 NIC 发送到默认路由器上的 NIC。

  6. 默认路由器打开数据报并确定目标 IP 地址。路由器使用其自身的路由表来识别下一个路由器的 IP 地址,该路由器将把帧传送到其旅程的下一步。然后,路由器将帧重新封装在一个新的数据报中,该数据报包含其自身的 MAC 作为源 MAC,以及下一个路由器的 MAC 地址,然后通过相应的接口发送出去。路由器在第 3 层(互联网层)执行其路由任务。

请注意,对于第 2 层及以上的协议,交换机是不可见的,因此它们不会以任何逻辑方式影响数据的传输。交换机的功能仅仅是提供一种简单的方法,通过以太网电缆将多台主机连接到单个物理网络中。

您可以使用 arp [-n] 命令查看您的主机存储在其 arp 表中的所有 MAC 地址。这些始终是本地网络上的主机。

路由表

所有网络设备(无论是主机、路由器还是其他类型的网络节点,例如网络连接的打印机)都需要决定如何路由 TCP/IP 数据包。路由表提供做出这些决策所需的配置信息。图 1 中所示的非常简单的路由表用于定义典型本地主机可用的单个路由,并确定是否将数据包发送到默认网关路由器。route -n 命令列出路由表;-n 选项仅将结果显示为 IP 地址,并且不尝试执行 DNS 查找,否则 DNS 查找会将 IP 地址替换为可用的主机名。netstat -rn 命令会产生非常相似的结果。

[root@host1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.254   0.0.0.0         UG    100    0        0 eno1
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1

图 1:简单的路由表。

当使用 -n 选项时,默认网关始终显示为目标 0.0.0.0。如果未使用 -n,则“Default”一词会出现在输出的“Destination”列中。“Gateway”列中的 IP 地址是出站网关路由器的 IP 地址。默认网关的 0.0.0.0 的网络掩码表示,任何未寻址到本地网络或路由表中其他条目指定的另一个出站路由器的数据包,都将发送到默认网关,而与网络类别无关。

图 1 中的 Iface(接口)列是出站 NIC 的名称,在本例中为 eno1。对于充当路由器的主机,可能会使用至少两个,有时甚至更多的 NIC。用作路由的每个 NIC 都将连接到不同的物理和逻辑网络。“Flag”列中的标志指示路由已启动 (U) 并且是默认网关 (G)。也可能存在其他标志。

对于大多数主机,路由决策都相当简单

  • 如果目标主机在本地网络上,则将数据直接发送到目标主机。
  • 如果目标主机在远程网络上,并且可以通过路由表中列出的本地网关访问,则将其发送到显式定义的网关。
  • 如果目标主机在远程网络上,并且没有其他条目定义到该主机的路由,则将数据发送到默认网关。

这些规则只是意味着,如果所有其他方法都失败,因为没有匹配项,则将数据包发送到默认网关。

图 2 中的路由表稍微复杂一些,因为它属于充当路由器的 Linux 主机,该路由器连接到三个网络,其中一个网络通往互联网。本地 C 类网络 192.168.0.0/24(在接口 eth1 上)、192.168.25.0/24(在 eth2 上)在表中都有条目,以及通往互联网其余部分的默认路由(在 eth0 上)。

[root@host2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.24    0.0.0.0         255.255.255.252 U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.25.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
0.0.0.0         192.168.1.25    0.0.0.0         UG    0      0        0 eth0

图 2:具有多个网络的更复杂的路由表。

请注意,仍然只有一个默认网关,它在接口 eth0 上。但是,除了直接指向路由器 LAN 侧 IP 地址的默认路由条目之外,还有一个用于整个 192.168.1.24/30 网络的条目。该网络仅包含两个可用的 IP 地址,一个用于路由器 LAN 侧的 192.168.1.25/30,另一个用于主机自身的 192.168.1.26/30。

路由配置

那么路由表是如何配置的呢?对于使用 DHCP 连接到网络的主机,DHCP 服务器提供默认路由的配置信息以及 DNS、主机 IP 地址以及可能的其他信息(例如 NTP 服务器的 IP 地址)。对于静态配置,它通常很简单,但有时可能会有点复杂。

在大多数情况下,将默认路由添加到 /etc/sysconfig/network 文件会导致网络在路由表中配置默认路由。该条目看起来像图 3 中的示例。


GATEWAY=192.168.0.1

图 3:网络文件中的网关条目。

只能使用网络文件配置默认网关。

在静态配置环境中配置默认网关的另一种方法是将其添加到 /etc/sysconfig/network-scripts 目录中的相应接口配置文件中。要将网关添加到接口 eth0 的接口配置文件中,您需要将与上面的图 3 中相同的行添加到 ifcfg-eth0 文件中。如果您这样做,则应从网络文件中删除该条目。

在更复杂的环境中,例如当主机计算机使用多个 NIC 连接到多个网络,并且至少有两个或更多需要输入到路由表中的路由时,您应该考虑在 /etc/sysconfig/network-scripts 中使用路由文件。对于 NIC enp7s1,该文件将是 route-enp7s1,它将包含图 4 中所示的条目。


default via 192.168.0.1 dev enp7s1

图 4:enp7s1 的默认路由条目。

route-interface 文件中的默认网关设置将覆盖网络文件中列出的任何设置。

当然,您始终可以使用 route 命令从命令行添加路由。如果您需要在每次系统启动时都执行此操作,则可能需要一些时间,因此您可能需要考虑使用上述方法,或者创建一个在启动时运行的脚本。我的一个系统有一个脚本,其中包含以下两行,如图 5 所示。


route del default
route add default gw 192.168.0.1

图 5:从命令行设置默认路由的命令。

请注意,设备名称在所有这些命令中都是可选的,并且在图 5 中未使用。

结论

路由可能比这些相当常见的简单示例中显示的要复杂得多。此处的信息应该可以帮助您入门。对于更复杂的环境,您可能希望参考《Inside TCP/IP》(第二版)或 Craig Hunt 的《TCP/IP Network Administration》。您可能还需要参考您的发行版的文档以获取更多信息;对于基于 rpm 的发行版(如 Fedora 和 CentOS),一个好的参考是《Red Hat Enterprise Linux 7 部署指南》。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。他自 1996 年以来一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

7 条评论

David,这太棒了。您出色地简化了一个极其复杂的世界,并为我们提供了一些很棒的命令行工具来学习和教学。我作为一名思科学生接触到了 OSI 模型 https://en.wikipedia.org/wiki/OSI_model 和后来的微软网络计算模型,但我从未读过像您刚刚写的这样连贯的文章。

很棒的文章。但我遗漏了什么吗?还是这句话有拼写检查无法捕捉到的错别字?

“该网络仅包含两个可用的 IP 地址,一个用于路由器 LAN 侧的 192.168.1.25/30,另一个用于主机自身的 192.168.0.26/30。”

主机的 IP 地址不应该是 192.168.1.26 吗?

虽然我理解为什么 /30 子网只有 2 个可用地址,但我确信我可以从您写的关于 CIDR 的文章中学到很多东西。

谢谢

您是对的,那是一个错别字,我已经修复了。感谢您指出这一点。

感谢您关于 CIDR 文章的建议。我会将其添加到我的列表中。我已经安排了一些文章,但我会尝试在今年内完成它。

我很高兴您喜欢这篇文章并发现它很有用。

回复 作者 AustinPowered

Both 先生,谢谢您。一篇很棒的文章,清晰、简洁,有助于修订。再次感谢您。

当制造全新的无线路由器或努力解决家庭网络问题时,熟悉这一点至关重要。最终用户需要启动 Web 浏览器并输入 http://192.168.1.1。登录后,客户可以自定义路由器的配置。有用的文章 http://www.192168ll.net/

David,谢谢你
当您有一位能够描绘画面的作家时,真是太棒了
更容易理解
太棒了。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可获得许可。
© . All rights reserved.