13
2025
04
01:13:46

Linux 网络速成课 3 :基于策略的路由 (Policy Based Routing),RPDB (Routing Policy DataBase)

本系列文章翻译、修改自 A Crash Course in Linux Networking, 作者 David Guyton
相比原文有较大的精简及内容补充,不再单独标注。若感到困惑请参阅原文

"路由" 是一个通往目的地的路径。

"路由表" 是个路由的集合,它就像是个地图,写明了通往不同目的地的路径,Linux 内核根据路由表来为数据包找到下一跳。

传统的路由表就只是一个二维的表,该表包含了当前主机所知道的、能抵达的每个网络的规则和路由。要向哪个地址发数据,直接查询路由表就能找到对应的路由信息 —— 这样的路由方式简单粗暴,就是直接根据目的地址确定该往哪发。对于终端用户而言,这样的机制已能满足多数需求,但对网络设备或者服务器来说就不太够了。

比如,一个路由器同时接了三个网线,这三个网线都能连通互联网,且每个网线的速率和费用并不相同。若我们希望通过这三个网线为不同类型的用户提供不同的服务(例如为服务器提供最高速率,为本地内部用户提供中等速率,为访客提供最低速率),就需要能够在这个路由器上对接入用户(即流量的源地址)进行识别,并根据识别结果为流量选取不同的路由。这个"对流量进行识别匹配"要用到的东西就是 "规则" (rule)。为不同的流量选择不同的链路,就需要用到不同的路由表。这种根据规则对流量进行匹配筛选、并选择不同路由表的机制,就叫做 "基于策略的路由"。

Linux 使用 "路由策略数据库" - RPDB (Routing Policy DataBase) 来实现基于策略的路由系统(policy based routing system)。RPDB 支持多个路由表,运行时可以根据用户定义的规则来动态选择要用的路由表。规则可用的匹配对象可以是源地址、目的地址、数据包头里的其他属性以及包的内容。

RPDB 的另一优点是支持 "热修改",在网络设备运行时就可以随心所欲地修改 RPDB,而不会影响各类功能。

RPDB 的规则缓存(rule cache)会在系统启动阶段加载。运行时的路由决策都根据该缓存进行。RPDB 由下面三类东西组成:

  • 地址(Address):源地址和目的地地址

  • 规则(Rules):定义了什么样的数据包应该发往哪里

  • 路由(Routes):定义了实际该往哪里发数据包

Linux 中,RPDB 由两个表组成:规则表(a table of rules)和路由表(a table of routes),每个数据包实际使用的路由都由这两个表共同决定。在较高层次来看,规则和路由表是这样协同工作的:

输入 -> 规则过滤 -> 规则匹配[最高优先级] -> 查路由表[最长匹配前缀] -> 输出

Linux 是这样为数据包选择路由的:系统会按照优先级顺序对规则进行逐个检查。规则由 selector 和 action 组成——如果当前的数据包和某条规则的 selector 相符,则执行 action。如果要执行的 action 是个对特定路由表的引用(一个 "look up"),则指向 RPDB 路由表的索引值或名称。

总流程如下:

IP Rule 分析流程:

  1. 每次检查一个网络数据包

  2. 对入向和出向数据包都使用相同的规则

  3. 按照规则的优先级顺序(从 0 开始),使用各个规则逐个对数据包进行匹配检查

  4. 执行第一个与数据包匹配的规则

  5. 如果该规则的 action 是表查找(tabel lookup),而且该查找失败,则匹配下一条规则

  6. 如果没有与数据包匹配的规则,则报错 undeliberable

IP Route 分析流程:

  1. 选择前缀最长匹配(longest matching prefix)的路由(这里的规则指的是目的地 IP 地址,包括掩码)

  2. 如果匹配到了多个相同长度前缀的路由,则使用偏好值(preference value)最高的路由

  3. 若还是有多个匹配的路由,且制定了 ToS,则不采用 ToS 不匹配的路由

  4. 若还是有多个匹配的路由,则使用列表中的第一条路由

  5. 如果没有匹配到路由,内核返回到规则表(rule table)去尝试下一个规则

规则、路由和表,是 RPDB 系统的三大核心概念。每个服务器都会有内部防火墙和一系列的路由配置,以控制系统如何发送数据包。iptables 负责管理包过滤器(packet filters),ip route 管理路由路径(routing paths),ip rules 控制路由策略(routing policies)。

地址(Addresses)

这个地址就是 IP 地址。数据包的源地址、目的地地址是决定路由方式的最重要因素。

规则(Rules)

路由规则能够决定如何将数据包路由到目的地。规则是一组高效的过滤算法,每个规则都包含一个 selector (匹配过滤器, match filter)和一个 action。它们共同决定内核处理数据包的方式。selector 可以检查的东西有下面这几种:

  1. 源地址

  2. 目的地地址

  3. ToS (Type of Service,服务类型)

  4. 进入接口(也就是数据包是从哪个网卡进的主机)

  5. fwmark(firewall mark,防火墙标记)

IP 规则不支持根据协议类型、端口等信息进行过滤(这种过滤需要使用 iptables ,后面会讲到)。

每个规则的 action 有下面这几种:

  • 跳转到指定的路由表

  • Drop 或者 reject 数据包

  • 返回个错误

  • 修改数据包源地址

每个规则都有一个代表着优先级的整数编号,范围是 0 - 32767。对于每个数据包,系统都会按优先级使用各个规则来对数据包进行匹配。

路由规则可以使用 ip rule 命令管理。

路由和路由表

"路由" 是一个通往目的地的路径。

"路由表" 是个路由的集合,它就像是个地图,写明了通往不同目的地的路径,内核可以根据路由表来为数据包找到它的下一跳。与规则类似,一个数据包可能也会有多个路由可以选择,在这种情形下,内核会选择前缀匹配最长的路由。




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://zblog.hqyman.cn/post/10502.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: