Linux策略路由

在linux内核版本2.2的时候,加入了一项很令人兴奋的功能,那就是Advanced Routing,使linux的路由机制超过了很多商用路由器。在使用高级路由功能前,我们先了解一下普通的路由功能。

以192.168.72.72(双网卡)这台机器为例,linux下普通的路由表可以通过route -n查看

Linux策略路由_第1张图片

   路由表的作用是指导主机如何向外发送数据包,如上图所示,如果我们从本机向192.168.9.9发送数据包时,这个数据包的来源端会被标记为192.168.72.72,目的端会被标记为192.168.9.9。接着系统会以数据包内的目的端为依据,和上面的路由表进行匹配,先和第一条规则192.168.6.0/24进行匹配,发现192.168.9.9并不在该网段内,接着和第二条规则192.168.71.0/24进行匹配,发现还是不在该网段内,这时候会一直向下匹配,直到匹配到192.168.9.0/24时,发现192.168.9.9在该网段内,这时系统会将这个数据包从eth1接口发送到192.168.72.254网关上面,然后由网关上的路由条目进行匹配,该数据包下一跳发往哪里。如果在本机路由表上都没匹配到192.168.9.9所在网段的路由,就会从最后一条路由条目(默认路由)指定的接口把该数据包发送出去。

    可以看到传统的路由是以目的地IP为准和主机上的路由表进行匹配的,如果你想让本机的HTTP协议经eth1出去、FTP协议经eth0出去呢?如果你还想根据目的地IP决定数据包从哪个接口出去呢?显然普通的路由功能提供不了这样的服务,这时候我们就要用到高级路由里面的策略路由功能了。

    Linux系统可以同时存在256(0-255)个路由表,而且每个路由表都各自独立,互不相关。数据包在传输时是根据RPDB(路由策略数据库)内的策略决定数据包应该用哪个路由表传输的。

Linux策略路由_第2张图片

   怎样把RPDB中的路由表显示出来呢?这次不用route -n了,得使用ip rule show来显示RPDB中的路由表


在分析上图内容前,先看看ip rule的简单用法:

ip rule  [ list | add | del | flush ] SELECTOR ACTION
  SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ] [ iif STRING ] [ oif STRING ] [ pref NUMBER ]
  ACTION := [ table TABLE_ID ] [ nat ADDRESS ] [ prohibit | reject | unreachable ] [ realms [SRCREALM/]DSTREALM ]
  TABLE_ID := [ local | main | default | NUMBER ]

?

ip rule show显示的内容,大体上可以分为三段:

   第一段:冒号之前的数字,表示该路由表被匹配的优先顺序,数字越小,越早被匹配。这个优先级别范围是0~4亿多。默认0、32766、32767三个优先级别已被占用。如果在添加规则时没有定义优先级别,那么默认的优先级别会从32766开始递减,可以通过prio ID参数在设置路由表时添加优先级。

   第二段:from关键字,这里显示的是匹配规则,当前表示的是从哪里来的数据包,除了from关键字外,还有to、tos、fwmark、dev等等。

   第三段:loacl/main/default 这些都是路由表名称,表示数据包要从那个路由表送出去。local表包含本机路由及广播信息,main表就是我们route -n看到的内容,default表,默认为空。

在添加规则时,需要先定义好优先级、条件及路由表ID,然后才可以添加规则。如下例:

#根据源地址决定路由表
ip rule add from 192.168.10.0/24  table 100
ip rule add from 192.168.20.20    table 110
 
#根据目的地址决定路由表
ip rule add to   192.168.30.0/24  table 120
ip rule add to   192.168.40.0/24  table 130
 
#根据网卡设备决定路由表
ip rule add dev  eth0  table 140
ip rule add dev  eth1  table 150
 
#此外还可以根据其他条件进行设置,例如tos等等

?
   上面的路由表都是用100、110、120、130等数字表示的,时间一久难免自己也会忘记该路由表的作用,不过iproute提供了一个路由表和名称的对应表(/etc/iproute2/rt_tables),可以手动修改该表。

Linux策略路由_第3张图片

  可以看到添加路由表100后,显示确实是100,在修改rt_tables的映射关系后(100映射到wangtong),ip rule show的内容也变化了。

当然也可使用ip命令来删除路由表了。

#根据明细条目删除
ip rule del from 192.168.10.10
 
#根据优先级删除
ip rule del prio 32765
 
#根据表名称来删除
ip rule del table wangtong

?

Linux策略路由_第4张图片  

    ip rule show查看的只是有哪些路由表,要查看路由表里面的具体路由,则可以使用ip route show/list table ID/name,默认的ip route show查看的是main表的路由条目。

Linux策略路由_第5张图片

    如果新加的路由在main表之外的路由表,则只有先添加规则后才能确定新的路由表的ID,有了新的路由表ID后,才能在该路由表中添加路由。

例如用以下命令验证:

ip rule show
ip rule add from 10.1.9.0/24 table 100
ip rule show
ip route show table 100
ip route add 192.168.1.0/24 dev em1 table 100
ip route show table 100
ip route add default via 10.1.6.254 table 100
ip route show table 100

?

  Linux策略路由_第6张图片

http://my.oschina.net/guol/blog/156607


你可能感兴趣的:(linux,命令与系统维护)