静态路由和策略路由的配置实践
前言
一般在多网卡的网络访问关系中我们通常根据目标 IP 地址段来添加静态路由 (static-routes),在主机系统配置层面这个需求一般都比较简单也不需要使用非常复杂的命令,说实话如果不是因为开发测试中心同事的乱入启发,我也不会发现还有策略路由这样一种灵活通用的配置方法来实现 Linux 多网卡多路由的设定,灰常感谢。
策略路由的出现在某些业务场景下可能更优于静态路由
更新记录
2019 年 03 月 12 日 - 更新 CentOS 7 静态路由添加规则
2016 年 03 月 18 日 - 更新静态路由配置和建议
2015 年 12 月 23 日 - 增加 Linux 添加静态路由最佳实践
2015 年 12 月 18 日 - 修正动态路由为策略路由描述,完善内容,感谢 @extreme
2015 年 12 月 17 日 - 初稿
阅读原文 - https://liaojiaxin158.github.io/post/static-routes/
扩展阅读
Static Routes and the Default Gateway - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/ch-configuring_static_routes_and_the_default_gateway
Routing Tables - http://linux-ip.net/html/routing-tables.html
linux 配置静态路由 - http://www.361way.com/linux-define-static-route/4053.html
Linux 策略性路由应用及分析 (iproute2) - http://tilt.lib.tsinghua.edu.cn/node/408
Linux Advanced Routing & Traffic Control - http://lartc.org/
静态路由表和策略路由的区别
通常我们维护静态路由表会手工填写所有 IP 地址段的路由规则,使用命令或者写入配置文件永久生效,先以 Windows/Linux/AIX 常用方法为例
1 | #Windows 静态路由 |
这种办法针对少量的规则还可以轻松应对,但规则一旦增加麻烦也就接踵而至,网段地址不断变化就必须及时更新路由表,否则其他用户就无法访问。如果可以根据用户访问进来的路径设定策略路由就会方便很多,而 rt_tables 就是为此而生。
Linux 添加静态路由最佳实践
按照 RedHat 官方介绍有三种方式添加永久静态路由,这里只列举最佳方式
临时路由
以下两种方法可以立即生效,但重启后会消失,切记使用场景
1 |
|
永久路由
该方法需要重启网络会造成短暂的网络服务中断,但重启后优先级大于 rc.local 方式不会影响 nfs
1 | # 可以通过临时命令立即生效 |
rt_tables
rt_tables 简单来说就是通过给表的命名使得管理简单化
大部分人习惯直接将路由表优先级号码直接作为表的名称来使用,这样做的好处是非常直观和简明的表达了表所在优先级的位置,但是当表的优先级结构出现变动时,我们对巨大的路由表的修改就显得很烦琐和费事了。
在 / etc/iproute2 / 目录下, 有这么一个文件 rt_tables, 只要对它进行改动,我们将很容易的完成路由表优先级结构的变动。(数值越小优先级别越高)
当路由表的优先级发生变化的时候,我们只需要编辑 / etc/iproute2/rt_tables 这个文件就可以直接改变路由表的优先级次序。
1 | cat /etc/iproute2/rt_tables |
Linux 最多可以支持 255 张路由表,其中有 3 张表是内置的:
表 255 本地路由表(Local table) 本地接口地址,广播地址,已及 NAT 地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。
表 254 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如 route)所添加的路由都会加到这个表。一般是普通的路由。
表 253 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。
表 0 保留
策略性路由应用及分析 (iproute2)
策略性路由
策略性是指对于 IP 包的路由是以网络管理员根据需要定下的一些策略为主要依据进行路由的。例如我们可以有这样的策略:“所有来直自网 A 的包,选择 X 路径;其他选择 Y 路径”,或者是 “所有 TOS 为 A 的包选择路径 F;其他选者路径 K”。
Cisco 的网络操作系统 (Cisco IOS) 从 11.0 开始就采用新的策略性路由机制。而 Linux 是在内核 2.1 开始采用策略性路由机制的。策略性路由机制与传统的路由算法相比主要是引入了多路由表以及规则的概念。
多路由表(multiple Routing Tables)
传统的路由算法是仅使用一张路由表的。但是在有些情形底下,我们是需要使用多路由表的。例如一个子网通过一个路由器与外界相连,路由器与外界有两条线路相连,其中一条的速度比较快,一条的速度比较慢。对于子网内的大多数用户来说对速度并没有特殊的要求,所以可以让他们用比较慢的路由;但是子网内有一些特殊的用户却是对速度的要求比较苛刻,所以他们需要使用速度比较快的路由。如果使用一张路由表上述要求是无法实现的,而如果根据源地址或其它参数,对不同的用户使用不同的路由表,这样就可以大大提高路由器的性能。
规则(rule)
规则是策略性的关键性的新的概念。我们可以用自然语言这样描述规则,例如我门可以指定这样的规则:
规则一:“所有来自 192.16.152.24 的 IP 包,使用路由表 10, 本规则的优先级别是 1500”
规则二:“所有的包,使用路由表 253,本规则的优先级别是 32767”
我们可以看到,规则包含 3 个要素:
什么样的包,将应用本规则(所谓的 SELECTOR,可能是 filter 更能反映其作用);
符合本规则的包将对其采取什么动作(ACTION),例如用那个表;
本规则的优先级别。优先级别越高的规则越先匹配(数值越小优先级别越高)。
环境配置
服务器 A 和 B 为双网卡,操作系统为 rhel_7.1_64
网卡显示名称 | IP 地址 | 子网掩码 | 网关 | 备注 |
---|---|---|---|---|
ens4f0 | 172.31.192.201 | 255.255.255.0 | 172.31.192.254 | 服务器 A |
ens9f0 | 172.31.196.1 | 255.255.255.0 | 172.31.196.254 | 服务器 A |
ens4f0 | 172.31.192.202 | 255.255.255.0 | 172.31.192.254 | 服务器 B |
ens9f0 | 172.31.196.2 | 255.255.255.0 | 172.31.196.254 | 服务器 B |
/ | 172.25.168.44 | 255.255.255.0 | 172.25.168.254 | 接入测试 |
网络配置,以服务器 A 为例,注意注释默认网关
1 | cat /etc/sysconfig/network-scripts/ifcfg-ens4f0 |
策略路由配置
注意配置名称一定要吻合
1 | # 编辑 rt_tables |