我理解 Linux 选择最具体的路线到达目的地时路由选择。但是路由的度量呢?它的优先级是否比路由的具体性更高?
我们也欢迎参考 Linux 使用的路由选择算法的细节。
答案1
路由度量是在具有同等特异性的路由之间设置优先级。这在一般路由中都是如此(例如 Cisco、Windows 等)。因此,该模型的工作原理如下:
- 找出最具体的路线(又名最长前缀匹配*)
- 如果有多条路线具有相同的特性,则选择具有最低管理距离(这区分了直接连接路由、静态路由和各种路由协议)。
- 在该路由协议和特定路由中(如果路由特异性和管理距离相同),选择具有最低指标
请注意,还有其他事情可能发生,例如基于策略的路由它允许您根据源 IP 地址执行路由等操作。但我认为路由特异性、管理距离和度量是最重要的三件事。
*之所以称为最长前缀匹配,是因为二进制子网(例如 /24)看起来像11111111.11111111.11111111.00000000
。因此,路由器只需扫描前缀中的二进制 1,一旦遇到零,就停止,这样就匹配了前缀。
答案2
Linux 提供了许多用于灵活路由选择的工具。
单一路由表
在最简单的情况下,只有一个内核路由表,没有具有 SRC 属性的路由。此表包含许多路由,这些路由ip route add
由 DHCP 守护程序或路由守护程序手动放置在那里 ( )。在这种情况下,内核选择:
- 最具体的路线;
- 如果存在多条同样具体的路由,则选择内核度量最小的路由。
请注意,内核度量(显示为ip route show
)由路由守护进程选择,不一定与任何特定路由协议的度量相关。例如,Quagga 对其在内核中安装的所有路由使用相同的度量,与协议的度量无关。
特定源路由
Linux 还支持具有 SRC 属性的路由,该属性仅匹配具有给定源地址的数据包。SRC 仅适用于 IPv6,并且直到最近(如果我没记错的话是 3.11)才有缺陷;除非您知道自己在做什么,否则我不建议使用它。
多个路由表
如果您需要比上述方法更多的灵活性,则需要使用多个路由表,并编写规则以为每个数据包选择一个特定的路由表。一种常见的技术是按源地址分派,以模拟源特定路由。另一种技术是在每个路由守护进程自己的路由表中运行它们,并模拟 Cisco 的“管理距离”。所有这些都在LARTC 第 4 章。