0%

静态路由和策略路由的配置实践

前言

一般在多网卡的网络访问关系中我们通常根据目标 IP 地址段来添加静态路由 (static-routes),在主机系统配置层面这个需求一般都比较简单也不需要使用非常复杂的命令,说实话如果不是因为开发测试中心同事的乱入启发,我也不会发现还有策略路由这样一种灵活通用的配置方法来实现 Linux 多网卡多路由的设定,灰常感谢。

策略路由的出现在某些业务场景下可能更优于静态路由


扩展阅读

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#Windows 静态路由 
-- 键入 route -p add [目标] [mask < 网络掩码 & gt;] [网关] [metric < 度量值 & gt;] [if < 接口 & gt;]
route print
route delete
route -p add 172.16.19.0 mask 255.255.255.0 198.15.0.1

#RHEL 静态路由
vi /etc/sysconfig/network
default via 192.168.3.1 dev eth0
10.211.6.0/24 via 192.168.3.1 dev eth0
10.0.0.0/8 via 10.212.52.1 dev eth1

#CentOS 静态路由
ip route add 172.16.5.0/24 via 10.0.0.101 dev eth0
vim /etc/sysconfig/network-scripts/route-eth0
172.16.5.0/24 via 10.0.0.101

#SuSE 静态路由
vim /etc/sysconfig/network/routes
default 192.168.3.1 - -
10.211.6.0 192.168.3.1 255.255.255.0 eth0
10.0.0.0 10.212.52.1 255.0.0.0 eth1

#AIX 静态路由
smitty mkroute
172.20.14.0/24 gw 172.23.14.254

这种办法针对少量的规则还可以轻松应对,但规则一旦增加麻烦也就接踵而至,网段地址不断变化就必须及时更新路由表,否则其他用户就无法访问。如果可以根据用户访问进来的路径设定策略路由就会方便很多,而 rt_tables 就是为此而生。

Linux 添加静态路由最佳实践

按照 RedHat 官方介绍有三种方式添加永久静态路由,这里只列举最佳方式

临时路由

以下两种方法可以立即生效,但重启后会消失,切记使用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#route 命令参数,使用 route 命令,查看本机路由直接输入 route -n 回车即可 
add 增加路由
del 删除路由
-net 设置到某个网段的路由
-host 设置到某台主机的路由
gw 出口网关 IP 地址
dev 出口网关 物理设备名

# 添加路由
route add -net 192.168.0.0/24 gw 192.168.0.1
route add -host 192.168.1.1 dev 192.168.0.1
# 删除路由
route del -net 192.168.0.0/24 gw 192.168.0.1
# 添加默认路由
route add default gw 192.168.0.1

# 使用 ip route 命令和 route 命令类似
add 增加路由
del 删除路由
via 网关出口 IP 地址
dev 网关出口 物理设备名

# 添加路由
ip route add 192.168.0.0/24 via 192.168.0.1
ip route add 192.168.1.1 dev 192.168.0.1
# 删除路由
ip route del 192.168.0.0/24 via 192.168.0.1
# 增加默认路由
ip route add default via 192.168.0.1 dev eth0

永久路由

该方法需要重启网络会造成短暂的网络服务中断,但重启后优先级大于 rc.local 方式不会影响 nfs

1
2
3
4
5
6
7
8
9
# 可以通过临时命令立即生效 
route add -net 192.168.3.0/24 gw 192.168.3.254

# 在 / etc/sysconfig/static-routes 文件里添加如下内容 (没有 static-routes 的话就手动建立一个这样的文件)
any net 192.168.3.0/24 gw 192.168.3.254
any net 10.250.228.128 netmask 255.255.255.192 gw 10.250.228.129

# 如果是生产系统可以考虑暂时不重启服务避免网络中断
service network restart

rt_tables

rt_tables 简单来说就是通过给表的命名使得管理简单化

大部分人习惯直接将路由表优先级号码直接作为表的名称来使用,这样做的好处是非常直观和简明的表达了表所在优先级的位置,但是当表的优先级结构出现变动时,我们对巨大的路由表的修改就显得很烦琐和费事了。

在 / etc/iproute2 / 目录下, 有这么一个文件 rt_tables, 只要对它进行改动,我们将很容易的完成路由表优先级结构的变动。(数值越小优先级别越高)

当路由表的优先级发生变化的时候,我们只需要编辑 / etc/iproute2/rt_tables 这个文件就可以直接改变路由表的优先级次序。

1
2
3
4
5
6
7
8
9
10
11
12
13
cat /etc/iproute2/rt_tables

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat /etc/sysconfig/network-scripts/ifcfg-ens4f0

DEVICE=ens4f0
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=172.31.192.201
NETMASK=255.255.255.0
#GATEWAY=172.31.192.254

cat /etc/sysconfig/network-scripts/ifcfg-ens9f0

DEVICE=ens9f0
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=172.31.196.1
NETMASK=255.255.255.0
#GATEWAY=172.31.196.254

策略路由配置

注意配置名称一定要吻合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 编辑 rt_tables
echo "192 net_192" >> /etc/iproute2/rt_tables
echo "196 net_196" >> /etc/iproute2/rt_tables

# 清空 net_192 路由表
ip route flush table net_192
# 添加一个路由规则到 net_192 表,这条规则是 net_192 这个路由表中数据包默认使用源 IP 172.31.192.201 通过 ens4f0 走网关 172.31.192.254
ip route add default via 172.31.192.254 dev ens4f0 src 172.31.192.201 table net_192
# 来自 172.31.192.201 的数据包,使用 net_192 路由表的路由规则
ip rule add from 172.31.192.201 table net_192

# 清空 net_196 路由表
ip route flush table net_196
# 添加一个路由规则到 net_196 表,这条规则是 net_196 这个路由表中数据包默认使用源 IP 172.31.196.1 通过 ens9f0 走网关 172.31.196.254
ip route add default via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196
# 来自 172.31.196.1 的数据包,使用 net_196 路由表的路由规则
ip rule add from 172.31.196.1 table net_196

# 添加默认网关
route add default gw 172.31.192.254

# 如果需要自启动生效可以写进配置文件也可以加入 rc.local
vi /etc/rc.local

ip route flush table net_192
ip route add default via 172.31.192.254 dev ens4f0 src 172.31.192.201 table net_192
ip rule add from 172.31.192.201 table net_192
ip route flush table net_196
ip route add default via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196
ip rule add from 172.31.196.1 table net_196
route add default gw 172.31.192.254

# 查看路由表
route -n

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0 0.0.0.0 255.255.0.0 U 1006 0 0 ens9f0
169.254.0.0 0.0.0.0 255.255.0.0 U 1008 0 0 ens4f0
169.254.0.0 0.0.0.0 255.255.0.0 U 1014 0 0 br-ex
169.254.0.0 0.0.0.0 255.255.0.0 U 1015 0 0 br-int
172.31.192.0 0.0.0.0 255.255.255.0 U 0 0 0 ens4f0
172.31.196.0 0.0.0.0 255.255.255.0 U 0 0 0 ens9f0

# 在接入测试服务器上验证连通性
ping 172.31.192.201
ping 172.31.196.1