linux操作系统 策略路由 —— 筑梦之路

在某些情况下,我们不只是需要通过数据包的目的地址决定路由,可能还需要通过其他一些域:源地址、IP协议、传输层端口甚至数据包的负载。这就叫做:策略路由(policy routing)。

linux系统有多张路由表,而路由策略会根据一些条件,将路由请求转向不同的路由表。例如源地址在某些范围走路由表A,另外的数据包走路由表,类似这样的规则是有路由策略rule来控制。

在linux系统中,一条路由策略rule主要包含三个信息,即rule的优先级,条件,路由表。其中rule的优先级数字越小表示优先级越高,然后是满足什么条件下由指定的路由表来进行路由。在linux系统启动时,内核会为路由策略数据库配置三条缺省的规则,即rule 0,rule 32766, rule 32767(数字是rule的优先级),如下:

[root@m01 ~]# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default 
[root@m01 ~]# cat /etc/iproute2/rt_tables |grep -v "^#"
255  local
254  main
253  default
0  unspec

rule 0 :匹配任何条件的数据包,查询路由表local(table id = 255)。rule 0非常特殊,不能被删除或者覆盖。查询路由表local(ID 255) | 路由表local 是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 32766:匹配任何条件的数据包,查询路由表main(ID 254),路由表main(ID 254)是一个普通的表,包含所有的无策略路由。平时使用route add添加的路由都是加到这个表里面的。rule 32767:匹配任何条件的数据包,查询路由表default(ID 253),路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理这个规则也可以删除。

匹配优先级顺序:rule 0 > rule 32766 > rule 32767

[root@m01 ~]# ip rule help
Usage: ip rule { add | del } SELECTOR ACTION
       ip rule { flush | save | restore }
       ip rule [ list [ SELECTOR ]]
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
            [ iif STRING ] [ oif STRING ] [ pref NUMBER ] [ l3mdev ]
            [ uidrange NUMBER-NUMBER ]
ACTION := [ table TABLE_ID ]
          [ nat ADDRESS ]
          [ realms [SRCREALM/]DSTREALM ]
          [ goto NUMBER ]
          SUPPRESSOR
SUPPRESSOR := [ suppress_prefixlength NUMBER ]
              [ suppress_ifgroup DEVGROUP ]
TABLE_ID := [ local | main | default | NUMBER ]

SELECTOR具体参数如下:

From 源地址
To 目的地址(这里是选择规则时使用,查找路由表时也使用)
Tos IP包头的TOS(type of sevice)域
Dev 物理接口
Fwmark 防火墙参数

ACTION动作:

Table     指明所使用的表
Nat     透明网关
Action prohibit   丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
Reject         单纯丢弃该包
Unreachable      丢弃该包, 并发送 NET UNREACHABLE的ICMP信息

实例:

  1. 指定优先级

    第一条命令将向规则链增加一条规则,规则匹配的对象是所有的数据包,动作是选用路由表1的路由,这条规则的优先级是32000.

    第二条命令将向规则链增加一条规则,规则匹配的对象是IP为172.16.8.12, tos等于0x10的包,使用路由表2,这条规则的优先级是32001,动作是丢弃。

[root@m01 ~]# ip rule add from 0/0 table 1 pref 32000
[root@m01 ~]# ip rule add from 172.16.8.12/32 tos 0x10 table 2 pref 32001 prohibit
[root@m01 ~]# ip rule
0: from all lookup local
32000: from all lookup 1 
32001: from 172.16.8.12 tos lowdelay lookup 2 prohibit
32766: from all lookup main
32767: from all lookup default

不指定优先级

[root@m01 ~]# ip rule add from 171.13.12.23 tab 200
[root@m01 ~]# ip rule
0: from all lookup local
31999: from 171.13.12.23 lookup 200 
32000: from all lookup 1 
32001: from 172.16.8.12 tos lowdelay lookup 2 prohibit
32766: from all lookup main
32767: from all lookup default

不指定pref 优先级,那么系统就会默认创建rule的优先级,这个优先级就是出0以外,最小的值减1。

注意:不要混淆路由表(route)和规则(rule):ip rule规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。例如:

ip route add default via 192.168.10.1 dev eth2 table 200
ip rule add from 192.168.10.100 lookup 200

第一行表示,先建立一个路由表,其table名为200,这个表里面的默认路由是192.168.10.1

第二行表示 ,新建一个ip的策略,从192.168.10.100发出来的流量都使用路由表200这张图。由于ip rule数字越低,其优先级最高,而路由main(254)表的ip rule规则是32766,如果没有指定ip rule的优先级,其默认是从32765开始减起来的,所以一般就认为,加IP策略会比route -n看到的优先级更高。

如果要指定优先级,可以加上pref number参数。linux上面的路由表只有255个,没有优先级的;而ip rule的策略表是没有限制的,数字越低,其优先级越高。


版权声明:本文为qq_34777982原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。