Linux 网络协议栈开发番外篇(八)—— 策略路由

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zqixiao_09/article/details/79166047

一、linux系统中路由表table

      linux最多可以支持255张路由表,每张路由表有一个table idtable name。其中有4张表是linux系统内置的:

1)table id = 0

     系统保留。

2)table id = 255

     本地路由表,表名为local。像本地接口地址,广播地址,以及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。

3)table id = 254

     主路由表,表名为main。如果没有指明路由所属的表,所有的路由都默认都放在这个表里。一般来说,旧的路由工具(如route)所添加的路由都会加到这个表。

     main表中路由记录都是普通的路由记录。而且,使用ip route配置路由时,如果不明确制定要操作的路由表,默认情况下也是主路由表(表254)进行操作

     备注:我们使用ip route list 或 route -n 或 netstat -rn查看的路由记录,也都是main表中记录

4)table id = 253

     默认路由表,表名为default。一般来说默认的路由都放在这张表。

备注:

A)系统管理员可以根据需要自己添加路由表,并向路由表中添加路由记录。

B)可以通过/etc/iproute2/rt_tables文件查看table id和table name的映射关系。

C)如果管理员新增了一张路由表,需要在/etc/iproute2/rt_tables文件中为新路由表添加table id和table name的映射


二、路由表的配置

       可以有很多方式来配置静态路由,包括缺省路由。


三、路由策略rule

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

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

1)rule 0

     匹配任何条件的数据包,查询路由表local(table id = 255)rule 0非常特殊,不能被删除或者覆盖。 

2)rule 32766

     匹配任何条件的数据包,查询路由表main(table id = 254)。系统管理员可以删除或者使用另外的策略覆盖这条策略。

3)rule 32767

     匹配任何条件的数据包,查询路由表default(table id = 253)。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。

备注:

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

在linux系统中可以使用ip rule命令来配置路由策略。ip rule命令使用格式为:

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 列表)  

SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]  

ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]  
[ flowid CLASSID ]  

TABLE_ID := [ local | main | default | new | NUMBER ]  

举例来说:

#增加一条规则,规则匹配的对象是所有的数据包,动作是选用路由表1的路由,这条规则的优先级是32800 
ip rule add [from 0/0] table 1 pref 32800  
 
#增加一条规则,规则匹配的对象是IP为192.168.3.112, tos等于0x10的包,使用路由表2,这条规则的优先级是1500,动作是丢弃。
ip rule add from 192.168.3.112/32 [tos 0x10] table 2 pref 1500 prohibit    

可以通过命令ip ruleip rule list来查看系统中所有的路由策略rule。另外使用ip rule命令配置的路由策略rule只在内存中有效,机器重启后,就会失效。可以将路由策略配置到文件/etc/sysconfig/network-scripts/rule-ethX中,这样机器重启后仍然有效。


四、关于路由表和路由策略的联系和区别

       路由策略rule指定满足一定条件的数据包有指定的路由表来路由,多个策略rule可以指向同一张路由表。某些路由表可以没有策略指向它。值得注意的是,如果系统管理员删除了指向某个路由表的所有策略rule,那么这个路由表是没有用的,但它在系统中仍然存在,直到路由表中的所有路由记录被删除,它才会消失。


五、其他闲杂知识点

1)查看指定路由表的内容

ip route list table table_id 
 
ip route list table table_name  

2)查看系统中所有的路由策略rule

ip rule 
 
ip rule list  

3)使用ip rule,ip route,route等命令进行网络配置,只在内存中有效,重启机器或网络服务就会失效。因此,我们需要通常需要将网络相关的配置写入到配置文件中,这样重启机器或网络服务时,会从配置文件中加载网络相关的配置信息。

4)关于路由配置及路由策略配置的一点问题

    我们知道路由表和路由策略可以写入配置文件/etc/sysconfig/network-scripts/route-ethX和/etc/sysconfig/network-scripts/rule-ethX中,这类配置文件是针对每个网卡单独配置的静态路由或路由策略。route-ethX中如果不明确指定哪张路由表,缺省是添加到main路由表的,因此route-ethX中配置规则,不仅仅只有对应的网卡可以看到,其他的网卡也会看到哦。rule-ethX中配置的路由策略rule是全局的,我们通过ip rule list可以查看所有rule-ethX中的路由策略,因此rule-ethX中的策略不仅仅只有相应的网卡才能看到,其他的网卡也会看到哦。


六、实例

1、首先添加路由表,路由表添加完毕后,即可在策略路由表内添加路由。

# 在1表中添加默认路由为192.168.1.1
ip route add default via 192.168.1.1 table 1   

# 添加一条到192.168.0.0网段的路由为192.168.1.2
ip route add 192.168.0.0/24 via 192.168.1.2                     

ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4
#注:发往子网192.168.1.0/24的数据包通过分类4转发配合tc使用,后文有介绍讲解...
ip route add default via 192.168.1.1 table int1
ip route add 192.168.1.0/24 via 192.168.1.1 table int2
ip route add 172.16.0.2/16 via 172.16.0.1 table int3

注:各路由表中应当指明默认路由,尽量不回查路由表.路由添加完毕,即可在路由规则中应用。


2、ip rule sh 显示路由规则 

      0:          from all lookup local 
      32766:  from all lookup main 
      32767:  from all lookup default 

    进行路由时,正是根据路由规则来进行匹配,按优先级(pref后数值)从高到低匹配,直到找到合适的规则.所以在应用中配置默认路由是必要的。

策略路由一般手工添加路由表,路由表的添加只需编辑rt_tables文件,规定表序号,表名即可。


3、ip rule规则添加示例: 

ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit 
ip rule add to 192.168.1.2 pref 1000 table test1 
ip rule add from 192.168.1.0/24 pref 1001 table test1 
ip rule add [from 0/0] table test1 pref 1003 
ip rule add fwmark 1 pref 1002 table test2  

此句型配合iptables -t mangle应用。如先对数据包作标记:

 iptables -t mangle -A PREROUTING -p tcp -m multiport --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1  
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页