欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-10 20:37:50
...

一、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