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 层(互联网层)执行其路由任务。

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

您可以使用 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 类网络,接口 eth1 上的 192.168.0.0/24,eth2 上的 192.168.25.0/24,在表中都有条目,以及通向世界其他地方的 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 网络管理。您可能还想参考您的发行版的文档以获取更多信息;对于基于 rpm 的发行版(如 Fedora 和 CentOS),一个很好的参考是Red Hat Enterprise Linux 7 部署指南

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

7 条评论

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

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

“该网络仅包含两个可用的 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
当您有一位能够描绘图景的作家时,真是太棒了
更容易理解
太棒了。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.