目录
一、揭开策略路由的神秘面纱
在深入探索 Linux IPv4 策略路由之前,我们先来聊聊传统路由的工作方式。传统路由就像是一个按部就班的 “快递分拣员”,它在决定数据包的转发路径时,主要依据的是数据包的目的地址。它会查看自己的路由表,找到与目的地址匹配的条目,然后按照这个条目指示的方向,将数据包转发到下一跳 。例如,当你从家里的电脑访问百度的服务器时,数据包的目的地址是百度服务器的 IP 地址,传统路由就会根据这个 IP 地址,在路由表中找到通往百度服务器的路径,然后将数据包发送出去。
这种基于目的地址的路由方式在简单的网络环境中表现得相当出色,就像在一个只有几条街道和几个目的地的小镇里,快递员很容易就能找到正确的送货路线。但是,当网络环境变得复杂起来,就如同小镇发展成了一个大城市,有了众多的街道、不同类型的快递(不同类型的网络流量)以及各种各样的送货需求(不同的网络应用场景),传统路由的局限性就开始显现出来了。
比如,企业网络中可能有多个出口链路,分别连接着不同的互联网服务提供商(ISP),有的链路带宽大但费用高,有的链路带宽小但费用低。同时,企业内部又有多种业务,像实时视频会议、日常办公邮件收发、大数据文件传输等。如果仅仅依靠传统路由,就无法根据业务的重要性、带宽需求以及费用成本等因素,灵活地为不同的业务流量选择最合适的出口链路。这时候,策略路由就登场了,它就像是一个更加智能的 “快递调度员”。
策略路由(Policy - Based Routing,PBR)打破了传统路由仅依据目的地址进行决策的局限,它允许网络管理员根据多种丰富的因素来决定数据包的转发路径。这些因素可以包括源 IP 地址、目的 IP 地址、协议类型(如 TCP、UDP、ICMP 等)、源端口、目的端口、报文长度,甚至是网络接口类型和用户身份等。通过这些灵活的策略配置,策略路由能够实现对网络流量的精细化控制和优化。
想象一下,在企业网络中,策略路由可以让实时视频会议的流量优先使用带宽大、延迟低的链路,以确保视频的流畅播放和良好的会议体验;而对于大数据文件传输的流量,虽然它对实时性要求不高,但需要较大的带宽,策略路由就可以将其引导到费用相对较低的链路上去,这样既能满足业务需求,又能节省网络成本。在网络安全方面,策略路由还可以根据源 IP 地址,将来自特定安全风险区域的流量引导到专门的安全检测设备进行深度检查,增强网络的安全性 。所以说,策略路由对于优化网络流量、提升网络性能起着至关重要的作用,它就像是给网络赋予了智慧和灵活性,让网络能够更好地适应复杂多变的业务需求和网络环境。
二、深入 Linux IPv4 策略路由核心
(一)关键概念与原理剖析
在 Linux 系统中,多路由表特性是策略路由的重要基础 。与传统路由系统中单一的路由表不同,Linux 最多可以支持 255 张路由表,这就像是一个拥有众多抽屉的文件柜,每个抽屉(路由表)都可以存放不同的路由规则 。其中,有四张路由表比较特殊,分别是:
-
0 号表:系统保留表,如同图书馆中被特殊标记预留的书架,一般不对外使用。
-
255 号表 - local 表:本地路由表,存放着本地接口地址、广播地址以及 NAT 地址等信息,就像图书馆中存放本地文献资料的特定书架,由系统自动维护,管理员不能直接修改。比如当你在本地执行ssh 127.0.0.1时,就会参考这份路由表的内容。
-
254 号表 - main 表:主路由表,若没有指明路由所属的表,所有的路由都默认存放在这里,它类似于图书馆的主书架,是最常用的路由表。平时我们使用route -n或ip route list查看的路由记录,基本都来自于这个表,旧的路由工具(如route)所添加的路由也都会加到这个表 。
-
253 号表 - default 表:默认路由表,一般存放默认路由,如同图书馆中存放备用资料的书架,在默认情况下内容为空,除非有特别的要求,否则保持其内容为空即可 。
而路由策略(rule)则像是一把把钥匙,决定了数据包该打开哪个抽屉(路由表)来寻找合适的转发路径。这些规则可以根据数据包的多个属性来定义,包括但不限于源 IP 地址、目的 IP 地址、服务类型(TOS)、进入的网络接口等 。例如,一条路由策略可以规定:“凡是源 IP 地址属于 192.168.1.0/24 网段的数据包,都使用编号为 100 的路由表进行路由查找” 。
在 Linux 系统启动时,内核会为路由策略数据库配置三条缺省的规则,就像是图书馆的初始借阅规则:
-
rule 0:匹配任何条件的数据包,查询路由表 local(table id = 255) 。这条规则非常特殊,不能被删除或者覆盖,它拥有最高的优先级,就像图书馆中最优先执行的核心规则。它主要用于处理本地相关的流量,比如本地接口地址、广播地址以及 NAT 地址的流量 。
-
rule 32766:匹配任何条件的数据包,查询路由表 main(table id = 254) 。它的优先级次之,是系统中处理常规无策略路由的主要规则,就像图书馆中日常借阅遵循的主要规则 。系统管理员可以删除或者使用另外的策略覆盖这条策略 。
-
rule 32767:匹配任何条件的数据包,查询路由表 default(table id = 253) 。对于前面的缺省策略没有匹配到的数据包,系统就会使用这个策略进行处理,它的优先级最低,类似于图书馆中最后的兜底规则,这个规则也可以删除 。
当一个数据包进入系统时,它会按照规则的优先级顺序,依次与这些路由策略进行匹配 。就好比你带着一本书来到图书馆还书,图书管理员会按照优先级从高到低的规则来判断你应该把书放在哪个书架(使用哪个路由表进行路由) 。如果数据包匹配到了某条规则,就会按照该规则指定的路由表进行路由查找;如果没有匹配到任何规则,就会根据默认的路由表进行处理 。如果在所有指定的路由表中都找不到合适的路由,那么这个数据包的路由就会失败 。通过这种方式,Linux 系统实现了基于策略的灵活路由控制,能够更好地满足复杂网络环境下的各种需求 。
(二)核心数据结构深度解读
在 Linux IPv4 策略路由的实现中,有一些关键的数据结构起着至关重要的作用,深入了解它们有助于我们从底层理解策略路由的工作机制 。其中,fib_rule是一个非常重要的数据结构,它用于存储路由策略规则的相关信息 。
fib_rule结构体包含了众多成员,每个成员都有其特定的用途 。例如,pref成员表示规则的优先级,数值越小优先级越高,就像一场比赛中,选手的号码越小,越优先出场 。当系统对数据包进行路由决策时,会首先检查优先级高的规则,以确定如何处理数据包 。table成员则指定了规则匹配后要查找的路由表 ID,它就像是一个指向特定抽屉(路由表)的指针,告诉系统当数据包符合这条规则时,应该到哪个路由表中去寻找路由信息 。
action成员定义了规则匹配后要执行的操作,常见的操作类型有FR_ACT_TO_TBL(表示查询指定路由表,这是策略路由中最常用的操作,就像你按照规则找到了对应的书架后,开始在书架上查找书籍)、FR_ACT_BLACKHOLE(悄悄地丢弃数据包,如同把不需要的物品直接扔进垃圾桶)、FR_ACT_UNREACHABLE(生成 “网络不可达” 错误,就像你去一个不存在的地方,会被告知无法到达)和FR_ACT_PROHIBIT(生成 “管理禁止通信” 错误,类似于某些场所禁止特定人员进入)等 。
&