我在六月份讨论基本网络配置时,有一件事我当时没有谈到,那就是路由。本文简要介绍了 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 网络模型在网络上发送数据时,会是什么样子?以下是我自己编写的关于数据如何在网络之间移动的描述。在此示例中,我的计算机正在向远程服务器发送网页请求。
-
在应用层,浏览器启动到远程主机 www.example.com 的 HTTP 连接请求消息,以发回包含网页内容的数据。这是消息,它仅包含远程 Web 服务器的 IP 地址。
-
传输层将包含网页请求的消息封装在 TCP 数据报中,并将远程 Web 服务器的 IP 地址作为目标地址。连同原始请求数据包,此数据包现在包含请求将来自的源端口(通常是非常高的随机端口),以便返回数据知道浏览器正在侦听哪个端口;以及远程主机上的目标端口,在本例中为端口 80。
-
互联网层将 TCP 数据报封装在一个数据包中,该数据包还包含源 IP 地址和目标 IP 地址。
-
数据链路层使用地址解析协议 (ARP) 来识别默认路由器的物理 MAC 地址,并将互联网数据包封装在一个帧中,该帧包含源 MAC 地址和目标 MAC 地址。
-
帧通过电缆(通常为 CAT5 或 CAT6)从本地主机上的 NIC 发送到默认路由器上的 NIC。
-
默认路由器打开数据报并确定目标 IP 地址。路由器使用自己的路由表来识别下一个路由器的 IP 地址,该路由器将把帧传递到其旅程的下一步。然后,路由器将帧重新封装在一个新的数据报中,该数据报包含其自身的 MAC 作为源 MAC 地址和下一个路由器的 MAC 地址,然后通过相应的接口发送出去。路由器在第 3 层(互联网层)执行其路由任务。
请注意,交换机对于第 2 层及以上的所有协议都是不可见的,因此它们不会以任何逻辑方式影响数据传输。交换机的功能仅仅是提供一种简单的方法,通过以太网电缆的长度将多个主机连接到单个物理网络中。
您可以使用 arp [-n] 命令查看您的主机存储在其 arp 表中的所有 MAC 地址。这些始终是本地网络上的主机。
路由表
所有网络设备,无论是主机、路由器还是其他类型的网络节点(例如网络连接的打印机),都需要决定如何路由 TCP/IP 数据包。路由表提供了做出这些决策所需的配置信息。类似于图 1 中非常简单的路由表用于定义典型本地主机可用的单个路由,并确定是否将数据包发送到默认网关路由器。 route -n 命令列出路由表; -n 选项仅将结果显示为 IP 地址,并且不尝试执行 DNS 查找,如果主机名可用,则 DNS 查找会将 IP 地址替换为主机名。 netstat -rn 命令产生非常相似的结果。
|
图 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 上)的默认路由。
|
图 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 网络管理。您可能还需要参考您的发行版的文档以获取更多信息;对于像 Fedora 和 CentOS 这样的基于 rpm 的发行版,一个很好的参考是 Red Hat Enterprise Linux 7 部署指南。
7 条评论