ip rule命令

简介

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

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址等属性来选择转发路径。简单地来说,linux系统有多张路由表,而路由策略会根据一些条件,将路由请求转向不同的路由表。例如源地址在某些范围走路由表A,另外的数据包走路由表,类似这样的规则是有路由策略rule来控制。

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

[root@instance-3 ~]# ip rule
0:    from all lookup local 
32766:    from all lookup main 
32767:    from all lookup default

[root@instance-3 ~]# 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)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理这个规则也可以删除。

备注:在linux系统中是按照rule的优先级顺序依次匹配。假设系统中只有优先级为0,32766及32767这三条规则。那么系统首先会根据规则0在本地路由表里寻找路由,如果目的地址是本网络,或是广播地址的话,在这里就可以找到匹配的路由;如果没有找到路由,就会匹配下一个不空的规则,在这里只有32766规则,那么将会在主路由表里寻找路由;如果没有找到匹配的路由,就会依据32767规则,即寻找默认路由表;如果失败,路由将失败。

用法

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的路由,这条规则的优先级是32800.

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

2、不指定优先级

而添加策略时,是可以不指定pref 优先级的,那么系统就会默认创建rule的ID,在main的前面往前移一位。

3、iptables 的 set-mark功能

还可以借助iptables来实现其他不一样的功能。

使用Netfilter的managle机制针对特定的数据包设置MARK值,在此将3389端口的数据包的MARK值设置为1,然后将fwmark 1的规则应用到ip rule上即可。这样就可以实现特定程序的流量走不同的路线。

4、实例

公司内网要求192.168.0.100以内的使用 10.0.0.1 网关上网(电信),其他IP使用 20.0.0.1 (网通)上网。假定10.0.0.1以及20.0.0.1都是在同一张网卡上面。

因为mangle的处理是优先于 nat 和fiter表的,所以相应数据包到达之后先打上标记,上例的标记为0x2,之后再通过ip rule规则。对应的数据包使用相应的路由表进行路由,查到有符合相应的ip rule规则,最后读取路由表id为2的信息,将数据包送出网关。

总结

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

经典用法:

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

  • 第二行表示 ,新建一个ip的策略,从192.168.1.195发出来的流量都使用路由表200这张图。

  • 由于ip rule数字越低,其优先级最高,而路由main(254)表的ip rule规则是32766,如果没有指定ip rule的优先级,其默认是从32765开始加起来的,所以一般就认为,加IP策略会比route -n看到的优先级再高。如果要指定优先级,可以加上pref number参数。

  • linux上面的路由表只有255个,没有优先级的;而ip rule的策略表是没有限制的,数字越低,其优先级最高。

https://blog.csdn.net/wangjianno2/article/details/72853735

https://blog.csdn.net/u012758088/article/details/76255543

http://www.cnblogs.com/sammyliu/p/4713562.html

Last updated

Was this helpful?