校园网&openwrt记(十)iproute2

在添加静态路由的时候,可以有两种方法,老式命令route add和新的ip route add:

route add 192.168.66.0 mask 255.255.255.0 192.168.66.254
# or
ip route add 192.168.66.0/24 via 192.168.66.254

使用iproute2是当下比较常用的网络工具包,它的ip命令不仅语法简单明确,而且功能强大。iproute2是一个linux下管理控制 TCP/IP 网络和流量控制的工具包,用以替代老的arp、ifconfig、route。使用它还能很好的和iptables很好地合作,达到策略路由的目的。
  可以看看这个很好的ip命令手册
  怎样才能进行策略路由呢?根据资料:

从Linux-2.2开始,内核把路由归纳到许多路由表中,这些表都进行了编号,编号数字的范围是1到255。另外,为了方便,还可以在/etc/iproute2/rt_tables中为路由表命名。默认情况下,所有的路由都会被插入到表main(编号254)中。在进行路由查询时,内核只使用路由表main。
  实际上,还有另外一个路由表也一直存在,这个表是不可见的,而且极为重要。这就是表local。这个表保存本地和广播路由。内核会自动维护这个路由表,通常系统管理员没有必要对它进行修改,甚至不必看到。
  在使用策略路由(policy routing)时,我们将使用多个路由。在这种情况下,表识别符有很多参数,因此需要使用{prefix,tos,preference}的形式唯一地识别每个路由。

我们可以通过以下命令来查询路由表:

ip route show  # 默认就是talbe 254
ip route show table 253

可以通过ip route add来添加路由,通过ip route change来修改路由,通过ip route delete 来添加路由。如果我们需要让一些特定的数据包走一个新的路由表,我们可以在一个非main表的路由表中添加路由,比如在路由表66号中添加默认路由:

ip route add default via 192.168.67.254

这样表66中就有了一条路由条目了,如果数据包先查询表66,而不是默认的254的话,就可以流向我们所指定的网关192.168.67.254了。那怎样才能做到先查询表66呢?这就需要用到ip rule了。  

每个路由规则由一个选择符(selector)和一个操作(action)组成。系统按照顺序搜索路由策略数据库,把选择符和{源地址、目的地址、进入接口、tos、fwmark}等关键词进行匹配,如果匹配成功,就执行action定义的操作。操作或者成功返回,或者失败并且中止对路由策略。否则,系统继续查询路由策略数据库(即一直按照rule搜索下去)。
   Linux允许的操作包括:基于目的地址的路由表查询以及按照最长匹配的原则从路由表中选择路由。
   在系统启动时,内核会为路由策略数据库配置三条缺省的规则:
   这里写图片描述

  命令行ip rule show后可以发现:

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

from all就是选择符,lookup xxx就是操作。可以有0至32767条规则。
  我们要想让数据包查找表66(lookup 66),那么就要使用命令”ip rule add xxx table 66”来添加,这里的xxx指的就是对这些数据包的描述。
  例如这些数据包是通往192.168.67.123的,那么可以这样添加规则:

ip rule add to 192.168.67.123 table 66

  这时再查看以下规则,会发现多了一条规则:

0:      from all lookup local
32765:  to 192.168.67.123 lookup 66
32766:  from all lookup main
32767:  from all lookup default

这样,我们就能将通往ip 192.168.67.123的数据包按照规则序号大小来进行操作,由于32765序号在32766之前,这些数据包首先会查询表66,然后由于表66有一条默认路由,所以它们就被导向了表66中所描述的默认网关192.168.67.254。从而达到了策略路由的目的。
  当然,对于之前的静态路由,我们也可以使用这个方法来实现:让访问校园内网站点的数据包查询一个路由表(不是main,不是local,也不是default表),这个路由表将校园网网关作为默认网关。
  之前为什么说它还能很好的和iptables很好地合作,达到策略路由的目的呢?那是因为iptables中有一个很好的mangle操作,对数据包打mark,比如在我们的lan口的所有客户机上的使用TCP端口8393到8400的数据包打上标记101:

# 在fwmark链添加是因为openwrt中进行了iptables -t mangle -A PREROUTING -j fwmark,fwmark是一个自定义的代理链
iptables -t mangle -A fwmark -i br-lan -p tcp --dport 8393:8400 -j MARK --set-mark 101

  而在ip rule中则可以使用fwmark来选择这些包:

ip rule add fwmark 101 table 101

 这样,被打上101标记的数据包将会先查询表101。有了这个fwmark,我们就可以利用iptalbes的精确匹配,通过iproute2达到更精确的策略路由。

本文章由作者:佐须之男 整理编辑,原文地址: 校园网&openwrt记(十)iproute2
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐