Linux的策略路由

传统的路由是一个指向目标子网的“指路牌”,任何人来“问路”,路由都会明确指向目标。传统路由这种“不问来人情况”的处理策略越来越不适合现代计算机网络,举例来说“行人与汽车”走的“路”应该是不同的。这样策略路由就兴起了,策略路由是近些年来兴起的一个比较新的路由概念。策略路由可以根据多种不同的策略,决定数据包通过的路径。本节将介绍Linux系统中的路由及策略路由的使用。

策略路由的概念

并不是所有环境都适合策略路由,首先策略路由与传统路由相比最大的不同是,策略路由通常由不止一条到达目的网络的路径,例如在一个网络中有两个出口联通和电信等。因此策略路由在企业的实施环境手要条件网络有多个出口,例如一电信一联通,又如一出口速度较快,另一出口速度相对更慢一些等。

策略路由按实现的方式大体分为三类,第一种是按目的地址进行路由,即根据目的地不同选择不同的出口。由于这种按目的地址进行路由的方法特别适合做双线服务器,因此在国内使用的较多。第二种是按源地址进行路由,即根据发出数据包的计算机地址决定选择哪个出口,这种方法适用于多环境,例如多线路机房,客户定制的更快速的网络等。第三种是智能均衡策略路由,这是一种出现时间较晚的方式,在这种方式下,会自动识别网络带宽及负载,根据带宽和负载动态地决定数据包从哪个出口发出。

无论使用何种策略路由,都必须注意保护连接的持续性,特别是在出口上使用了NAT的网络中。即需要保证内部网络主机与外部通信时,数据包的往返都使用的是同一出口,否则可能会造成资源浪费甚至无法连接的情况出现。

路由表管理

在Linux系统中,策略路由可以通过路由表来实现,但Linux系统中的路由表并不像普通路由器那样简单,本小节将介绍Linux系统中的路由表。

默认情况下Linux并非只有一个路由表,因为如果系统中只有一个路由表,策略路由的许多功能将无法实现。数据包转发时,并不需要将所有路由表都搜索计算一次,数据包应该使用哪个路由表路由,取决于系统设定的规则。查看系统默认的规则使用命令“ip rule list”或“ip rule show”,如【示例1-1】所示。

【示例1-1】

[root@node1 ~]# ip rule list
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

【示例1-1】展示的是没有经过修改的Linux系统规则列表,这其中输出了3个路由表local、main及default。每条规则前面的数字表示规则的优先级,数值越小表明优先级越高,而“from all”表明所有的数据包都需要经过路由表的匹配。

由此可以看出【示例1-1】所示的处理过程应该是,内核转发的数据包优先使用表local转发,如果没有匹配的路由条目再依次使用表main和default。为了搞清Linux系统数据包的转发流程,有必要搞清这三张路由表的内容,如【示例1-2】所示。

【示例1-2】

[root@node1 ~]# ip route list table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
broadcast 192.168.139.0 dev ens33 proto kernel scope link src 192.168.139.152 
local 192.168.139.152 dev ens33 proto kernel scope host src 192.168.139.152 
broadcast 192.168.139.255 dev ens33 proto kernel scope link src 192.168.139.152 

[root@node1 ~]# ip route list table main
default via 192.168.139.2 dev ens33 proto dhcp metric 100 
192.168.139.0/24 dev ens33 proto kernel scope link src 192.168.139.152 metric 100 

[root@node1 ~]# ip route list table default
[root@node1 ~]# 

分别输出了3张路由表中的路由条目,其中表default中的路由条目为空,此处不作讨论。由于计算机的IP地址为192.168.139.152,因此表local中的路由条目来自广播和目的地为本地接口IP的数据包路由。而表main中的路由条目,很明显是指向本地子网(即子网192.168.139.0/24)和指向默认网关的默认路由。

由于环境并不复杂,系统默认的规则中并没有决定哪些数据包应该使用具体的某个路由表。但了解Linux系统的路由表机制后,接下来我们就可以利用这些机制建立自己需要的路由表和规则。建立一个路由表和相应的规则如【示例1-3】所示。

#建立一个名为test1的路由表
[root@node1 ~]# echo 100 test1 >> /etc/iproute2/rt_tables 
#建立一个规则,规定所有来自192.168.19.0/24的数据包都使用路由表test1的条目路由
[root@node1 ~]# ip rule add from 192.168.19.0/24 table test1
#列出规则
[root@node1 ~]# ip rule list
0:  from all lookup local 
32765:  from 192.168.19.0/24 lookup test1 
32766:  from all lookup main 
32767:  from all lookup default 

在【示例1-3】中,先使用编辑rt_tables的方式添加一个名为test1的路由表,然后添加了一条规则,规定所有源地址为192.168.19.0/24的包通过test1路由表路由。由于我们并没有向路由表test1中添加任何路由条目,因此此时路由表test1还为空,如何添加将在下个小节中介绍。

添加test1路由表时,使用了数字100作为保留值(保留值为table ID,test1相当于table ID的别名,此值与优先级无关,优先级将自动分配),通常建议这个值小于253且不重复,具体可以查看rt_tables文件中的说明。除了以上这种编辑的方法外,还可使用指定table ID的方法添加路由表,如【示例1-4】所示。

【示例1-4】

[root@node1 ~]# ip rule add from 192.168.18.0/24 table 2 pref 1500 prohibit

以上示例将添加一个table ID为2的路由表,并指定其优先级为1500。

删除路由表与以上过程相反,首先需要删除相关的规则,然后再编辑文件rt_tables,删除其中的相关配置,如【示例1-5】所示。

【示例1-5】

#删除规则和rt_tables中的相关内容
[root@node1 ~]# ip rule del table test1
[root@node1 ~]# cat /etc/iproute2/rt_tables 
#
# reserved values
......
#
#1  inr.ruhep
#验证结果
[root@node1 ~]# ip rule list
0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

提示:系统重启后,规则将失效,如需继续生效可以将设置规则的相关语句写入/et/rc.local中。

规则与路由管理

从前面几个小节的介绍中不难看出,Linux策略路由管理的两个核心分别是规则与路由表中的路由管理。虽然之前已经介绍过路由管理的相关概念,但与之前的路由管理相比,此处将要麻烦一些,因为再策略路由中还需要细化一些参数。

1.规则

在策略路由中,规则如同一个筛选器,将数据包按预先的设置“送给”路由表,完成路由过程。添加一条规则使用命令ip,格式如下:

ip rule [add|del] SELECTOR ACTION

在以上格式上,“[add|del]”表示添加或删除一条规则,“SELECTOR”表示数据包选择部分,“ACTION”表示执行操作。其中“SELECTOR”可以选择数据包的多种选项,常见选项如下所示:

  • from:源地址。
  • to:目的地址。
  • tos:数据包的TOS(Type of Service)域,用于标明数据包的用途。
  • fwmark:防火墙参数。
  • dev:参与设备,具体包括两个选项iifoif,分别表示接收和发送设置匹配。
  • pref:指定优先级。

在以上选项中,无疑from和to是最常用的选项。除以上选项外,还有一些其他选项,读者可阅读相关文档了解或参考ip-rule的手册页。

与“SELECTOR”一样,“ACTION”执行的动作也有多种:

  • table:指明使用的table ID或表名。
  • nat:透明网关,同NAT相似。
  • prohibit:丢弃包并返回“Communication is administratively prohibited”的错误消息。
  • unreachable:丢弃包并返回“Networ is unreachable”的错误消息。
  • realms:指定数据包分类,此选项主要用于配合tc作流量整形。

“ACTION”执行的动作中,table和nat是最常用的,prohibit和unreachable主要用来禁止通信,因此使用较少。

在【示例1-6】中列举了一些常见的示例。

【示例1-6】

#以源地址作为路由依据
ip rule add from 192.168.19.0/24 table test1
ip rule add from 192.168.17.100/32 table test1
#以源地址和tos作为路由依据
ip rule add from 192.168.0.0/16 tos 0x10 table test1
#以目标地址作为路由依据
ip route add to 192.168.100.100/32 table test1
ip route add to 192.168.101.0/24 table test1
#以防火墙标记路由依据,需要防火墙使用选项set-mark标记
ip rule add fwmark 1 table 1

2.路由管理

与之前介绍的使用route命令添加路由相比,策略路由的路由管理稍稍复杂一些,其格式如下所示:

ip route add ipaddress via ipaddress1 table table_name

其中ipaddress参数表示网络号,via选项指定的参数ipaddress1表示网关ip地址,即下一跳地址,table_name表示路由表名。

一些比较常见的路由条目如【示例1-7】所示。

【示例1-7】

#添加到test1的默认路由
ip route add default via 192.168.11.1 table test1
#发往192.168.15.0/24网络的包下一跳地址是192.168.11.1
ip route add 192.168.15.0/24 via 192.168.11.1 table test1

策略路由应用实例

在前面几个小节中,介绍了Linux系统的策略路由的运作机制,本小节将通过几个实例介绍策略路由的应用。

在本小节的例子中,Linux主机连接了两个子网:192.168.1.0/24192.168.2.0/24,拥有两个出口:第一个是172.168.33.2,对端网关为172.16.33.1;另一个为172.16.34.2;对端网关为172.16.34.1,如图1.1所示。

需要说明的是出口及对端网关地址应为网络供应商提供的公网IP地址,此处处于安全考虑以私网地址代替,其配置过程仅需将IP地址等信息替换即可,其他并无不同之处。

图1.1 策略路由拓扑

1.选择出口

如图4.8所示网络结构,现有两个出口,其中互联网出口1为所有内部子网的默认出口,出口2比出口1速度更快,但仅供内部网络中的VIP用户使用。现假定有VIP用户的IP地址为:**192.168.1.52****192.168.2.54**,现在需要配置这两个地址的流量,使用出口2以获得更快的速度。

(1)配置默认路由

根据以上信息先配置接口eno16777736,将IP地址,默认网关等信息一并设置,而出口2仅正确设置IP地址及子网掩码即可,无须设置默认网关。关于这些设置读者可自行参考第3章中的相关内容,此处不在赘述。

(2)配置策略路由

从上一步配置中已将所有子网的数据包的转发出口设置为出口1,现在需要配置VIP用户的数据包从出口2进行转发,其配置方法如【示例1-8】所示。

【示例1-8】

#建立路由表T1
[root@localhost ~]# echo 200 T1 >> /etc/iproute2/rt_tables
#设置VIP用户的数据包使用路由表T1路由
[root@localhost ~]# ip rule add from 192.168.1.52/32 table T1
[root@localhost ~]# ip rule add from 192.168.2.54/32 table T1
[root@localhost ~]# ip rule ls
0:  from all lookup local 
32764:  from 192.168.2.54 lookup T1
32765:  from 192.168.1.52 lookup T1
32766:  from all lookup main 
32767:  from all lookup default 
#为路由表T1添加出口2的默认路由
[root@localhost ~]# ip route add default via 172.16.34.1 table T1
[root@localhost ~]# ip route list table T1
default via 172.16.34.1 dev eno33554984

以上是整个配置过程,但以上配置在系统重启后会消失,因此需要添加规则,将添加路由表T1默认路由的语句写入/etc/rc.local中。

2.负载均衡

负载均衡的配置方法与选择出口的配置方法略有不同,因为负载均衡时需要考虑一个新的问题,需要保证连接的持续性。即从互联网出口1进来的数据包返回时也从出口1返回;出口2亦相同。负载均衡的配置方法如【示例1-9】所示。

【示例1-9】

#添加两个路由表table1和table2
[root@localhost ~]# echo 100 table1 >> /etc/iproute2/rt_tables
[root@localhost ~]# echo 200 table2 >> /etc/iproute2/rt_tables
#分别添加返回路由
[root@localhost ~]# ip route add default via 172.168.16.33.1 dev eno16777736 src 172.16.33.2 table1
[root@localhost ~]# ip route add from 172.16.33.2 table table1
[root@localhost ~]# ip route add default via 172.168.16.34.1 dev eno33554984 src 172.16.34.2 table2
[root@localhost ~]# ip route add from 172.16.34.2 table table2
#设置负载均衡策略
[root@localhost ~]# ip route add default scope global nexthop via 172.16.33.2 dev eno16777736 weight 1 nexthop via 172.16.34.2 dev eno33554984 weight 1

在上面的示例中,weight用于指定出口的权重,此处都设置为1表示平等对待,如果需要区别对待可以修带此值。与之前的设置方法相同,如果需要设置在重启后仍然生效,可以将规则和路由添加到文件/etc/rc.local中。

小结

路由是Linux系统中相当重要的内容,本章从实际应用出发主要介绍了Linux系统的路由相关内容,通过实例介绍了传统路由的设置,数据包转发等内容。对于Linux上的策略路由问题,剖析了Linux策略路由的运作机制,并通过实例介绍了策略路由的应用。

最后修改:2020 年 10 月 19 日 08 : 14 PM
如果觉得我的文章对你有用,请随意赞赏