指路明灯 – IP 路由技术

TCP/IP 的目标是实现网络与网络之间的互连,即将各种(异构)的网络“整合”成一个统一的网络。针对“整合”后的复合系统,必须要解决的两个关键问题:

  • 怎么“划网” – 系统中各个要素标识(命名)体系的问题

    首先,必须要对复合系统中的各个要素进行区分,这就要求各个互连的网络本身、各个网络中的通讯节点(计算机)在复合系统中都需要有自己的标识,而且标识应唯一;

  • 怎么“找路” – 网际互连后,节点间通讯路径建立的问题

    进行网际互连之前,各个网络都有自己内部的节点间通讯方式;网际互连之后,更大的复合网络中两个节点之间如何通讯,而通讯的首要问题就是:复合网络中各个节点有了自己的标识后,两个通讯节点之间如何“找到”通讯路径问题;

两个问题,都是通过 IP 技术来解决。

针对问题一,采用将 IP 划分为“网络号 + 主机号”的方案解决。由此,也衍生出相关的 IP 网络号及主机号划分方法。

针对问题二,采用 IP 路由转发技术来解决。

IP 路由转发原理

互连网络上两个节点间的通讯,本质上是两个节点之间 IP 数据包的发送与接收。IP 数据包由起始节点到达目的节点,可能要经历多个中间节点,而且可能的路径不只一条,必须有一种机制,指导 IP 数据包由起点到终点的这条路该怎么走。IP 技术采用路由表机制来解决这一问题。

IP 数据包在起始节点到目的节点的过程中,需要整个路径中的所有节点“接力传输”。每个节点的任务职责很明确 — 只负责完成整个传输路径中的“一步”。为此,IP 技术在互连网络中的每个 主机节点 和每个网络之间的 连接枢纽节点(路由器) 中都为 IP 数据包设置了一张路径选择的指南表 — 路由表。由路由表作为指导,来完成接力传输的指导工作,告诉 IP 数据包下一步该怎么传。当 IP 数据包由通讯起始节点发出时,IP 数据包要参照起始节点的路由表,选择传输中的下一个节点;到了下一个节点后,继续查看本节点的路由表,进而选择再下一个节点;重复上述过程,直至 IP 数据包到达最终的目的节点。

20191104-1

由此可见,路由表的本质就是 IP 数据包“下一跳”的路径信息表,根据不同的目的地,给出不同的下一跳路径。

  • 当目的地和 IP 转发节点在同一个网络时,直接交付数据包到目的地,无需中间接力节点;
  • 当目的地和 IP 转发节点不在同一个网路时,需要将数据包发给“下一个”接力节点;

路由表的主要内容

每个节点都有属于自己的路由表,路由表在操作系统的内核中维系。系统产生的或转发的每份 IP 数据包都要搜索路由表。可以说,系统的路由表定义了“途经”本系统的所有 IP 数据包的行进轨迹

Linux 系统中,可通过 routenetstat -r 查看内核路由表。

20191104-2

内核路由表将目标地址相关信息、下一跳相关信息等内容全面呈现出来。

最终要去哪里? — 目标地址相关信息

  • Destination
    • 目标网络 或 目标主机
    • 当 Destination 为 default(0.0.0.0)时,表示这是默认路由项。当 IP 数据包与路由表中所有其他的目的地址都不匹配时,则选择默认路由这一项进行转发。可以说,默认路由项是数据包转发最后的底牌
      • 一般而言,系统路由表只有一条默认路由。某些情况下,有多条默认路由时,也只会有一条默认路由起到作用。
        20191104
        如上图,内核路由表中有两条默认路由。其中第一条默认路由 0.0.0.0 + 192.168.35.254,是真正起作用的默认路由。
  • Genmask
    • Destination 字段的网络掩码
    • Destination + Genmask,构成了完整明确的目标(网络或主机)
    • 当 Destination 是主机时,设置为 255.255.255.255;当 Destination 是默认路由时,为 0.0.0.0

当前下一步怎么走? — 下一跳相关信息

  • Gateway

    Gateway 表项指明了 IP 数据包下一跳的位置。总体上,可分为两类信息,

    • 下一跳直达目的地
      当 Gateway 为 0.0.0.0 时,表明本项路由记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关,该路由直接由本机传送

    • 下一跳不能直达目的地,需要先到“接力节点”
      当 Gateway 为一个具体 IP 时,表明本项路由需要经过网关(路由器)的协助才能发送出去。这个具体的 IP 地址,就是下一跳网关的地址。而且,这个网关的地址必须是本机可以直达的地址

  • Iface

    • 即 Interface,一个节点可能有多个(以及多种类型)网络接口,该路由表项指明本条路由对应的数据包从哪个接口输出

由此可见,每个路由表项的含义就是 IP 数据包从节点主机的哪个 Iface 发出来,到达哪个 Gateway,进而继续后面的步骤。

综合信息

  • Flags
    • 标志位,展示本条路由的状态信息
    标志值 说明
    U 即 up。表明路由项(本条路径)的整体状态。该路由(路径)是活跃的,可以使用
    H 即 Host。对路由表中 Destination 项的说明。表明路由表中 Destination 项的内容是一个主机。 没有该标志,表明 Destination 项的内容是一个网络,Destination中的值应为 一个网络号
    G 即 Gateway。对路由表中 Gateway 项的说明。表明路由表中 Gateway 项的内容是一个网关(路由器)。 没有该标志,说明目的地址是与本机直接相连的,IP 数据包可以不通过路由器直接 交付,这种情况下,Gateway 一般设为 0.0.0.0


    标志 G 至为重要,它区分了直接送达(直接路由)和路由转发(间接路由)。G 一旦置位,就表明路由表中 Gateway 中是一个路由器地址。

    在配置网络信息时,都会添加默认网关,实际上就是在本机路由表中添加了默认路由项。

路由表的构建方式

路由表是 IP 数据包转发的真正“指挥官”,决定着 IP 数据包转发的正确性与效率。如何高效构建路由表则成为基于 IP 数据包转发网络高效运行的关键要素。

路由表构建主要有两种方式,静态构建动态构建
* 与传统的静态和动态技术一样,静态构建指路由表中的路由项由静态(人工)设置生成,设置完成后,路由规则是固定的,在没有人为干预的情况下,不会变化;
* 动态路由表则相反,它会主动感知网络的变化(如利用 ICMP 数据包),自动的创建或修改路由表中的路由项,进而实现“自治”。

静态路由对于结构简单的网络优势明显,针对这种网络的路由表一般比较简单,一经确定,可以保持状态高效运行;而对于大型复杂网络,尤其是不断变化的网络,如 Internet,静态方式显然不能满足其要求,需要采用动态路由方式,为此,也产生很多动态路由生成方法,如 RIP、OSPF、BGP 等。

路由表工具链

1) route

route 工具为静态展示和修改系统的路由表提供了便利。

  • 显示路由表

    route -n

  • 添加路由

    route add [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

    添加到主机的路由
    
    route add -host 192.168.1.2 dev eth0 
    注: 不添加网关gw内容,默认为直接交付,网关为 0.0.0.0
    route add -host 10.20.30.148 gw 10.20.30.40  
    
    添加到网络的路由
    
    route add -net 10.20.30.40 netmask 255.255.255.248 dev eth0   
    route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 
    route add -net 192.168.1.0/24 dev eth1
    
    添加默认路由
    route add default gw 192.168.1.1
    
  • 删除路由

    route del [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]

    route del -net 169.254.0.0 netmask 255.255.0.0 dev eth0
    注: 删除路由主要为了删除 Destination 项的目标,因此删除路由项时需要将相关信息写全
    

2) 随系统启动设置路由表

Linux 通过 /etc/network/interface 文件来配置网络接口。通过这个文件,可以对各种网络接口进行初始化,同时,也可以通过置入 route 指令来达到启动即修改路由表的目的。

由于现代 Linux 多采用系统配置碎片化管理的方式,在某些操作系统中,如 Ubuntu,则需要通过修改碎片化配置文件的方式,来达到同样的目的,如将路由表修改脚本写到 /etc/network/if-*.d/ 文件夹下的碎片化配置文件中。

示例 — 多网络接口路由表修改

一台主机,有两个网络接口分别连入两个不同的网络,一个 RJ45,一个 Wifi。默认启动时,两个网络接口都会自动对路由表进行修改,生成两个默认路由。
20191104-3
两条默认路由中只有第一条默认路由 0.0.0.0 + 192.168.35.254 会起到作用。如此,导致需通过 192.168.28.254 网关访问的网络无法联通。可以通过手动修改路由表的方式解决这个问题。

20191104-4

如此,达到主机可以通过 RJ45 和 Wifi 两个不同的网络接口,访问不同的网络。

Reference:

  1. 《计算机网络》,第五版
  2. 《TCP/IP Illustrated》, Volume 1
  3. 《Internetworking with TCP/IP》, Volume 1
  4. 《鸟哥的私房菜(服务器篇)》
  5. https://blog.csdn.net/kikajack/article/details/80457841
  6. https://www.cnblogs.com/baiduboy/p/7278715.htm
  7. How to set permanent route in Ubuntu 10.10?
  8. Changing the default gateway, multiple NICs

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注