专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Linux » linux策略路由:Linux环境下基于策略的路由 »正文

linux策略路由:Linux环境下基于策略的路由

来源: 发布时间:星期四, 2009年2月12日 浏览:59次 评论:0



  原文作者:Matthew G. Marsh
  摘要
  本文以大量例子为基础介绍了基于Linux2.2强大功能它提供功能是很多路由器产品都是难以匹敌如果考虑到它免费性性能价格比更是没有任何产品可以相比
   >
  目前在计算机网络中使用传统路由算法都是根据IP包目地址进行路由选择.然而在现实应用中经常有这样需求:进行路由选择时不仅仅根据数据报地址而且根据数据报其他些特性如:源地址、IP、传输层端口甚至是数据包负载部分内容这种类型路由选择被称作基于策略路由
  
  在Linux中从2.1版本内核开始就实现了对基于策略路由支持它是通过使用路由策略数据库(RPDBrouting policy database)替代传统、基于目地址路由表来实现RPDB通过包含些规则来选定合适IP路由这些规则可能会包含很多各种区别类型健值(key)因此这些规则没有默认特定次序规则查找次序或规则优先级都是由网络或系统管理员设定
  
  LinuxRPDB是个由数字优先级值进行排序线性规则列表RPDB能匹配数据报源地址、目地址、TOS、进入接和fwmark值等每个路由策略规则由个选择器和个动作指示组成RPDB按照优先级递增顺序被扫描RPDB包含每条规则选择器被应用于数据报源地址、目地址、进入接口、TOS和fwmark值若数据报匹配该规则对应于该规则动作被执行若动作成功返回则规则输出将是个有效路由或是路由查找失败指示;否则查找RPDB条规则
  
  当选择器和个数据报匹配成功会执行哪些动作呢?路由软件Software标准动作般是选择下跳地址和输出接口,可以称这种动作为“匹配&设置”类型动作然而Linux采取了更加灵活思路方法在Linux中有多种动作可供选择默认动作是查询特定基于目地址路由表因此“匹配&设置”动作就成为Linux路由选择最简单情况Linux支持多个路由表每个路由表都包含多条路由信息也就是Linux每个路由表都相当于其他操作系统系统路由表Linux支持多达255个路由表(Linux 2.2.12 支持255个路由表255个汇聚域和232个策略规则优先级 (4294967296 decimal)
  
  对于Linux2.1/2.2启动时内核将包含个由 3条策略规则组成默认RPDB察看这些默认规则个思路方法是使用命令来列出系统所有规则:
  
   root@netmonster ip rule list
   0:   from all lookup local
   32766: from all lookup
   32767: from all lookup default
  
  下面默认规则在对于理解启动复杂路由系统是非常重要
  
  首先是最高级别优先级规则规则策略0:
  
  规则0: 优先级 0   选择器 = 匹配任何数据报
  
  动作=察看本地路由表(routing table local)ID为255
  
  local表是保留路由表包含了到本地和广播地址路由规则0是特殊规则不可被删除或修改
  
  规则 32766: 优先级 32766   选择器 = 匹配所有数据报
  
  动作 = 察看主路由表(routing table ) ID为254
  
  路由表是默认标准路由表其包含所有非策略路由表是存放旧路由命令(route命令)创建路由而且任何由ip route命令创建没有明确指定路由表路由都被加入到该路由表中该规则不能被删除和被其他规则覆盖
  
  规则 32767: 优先级 32767 选择器 = 匹配所有数据报
  
  动作 = 察看默认路由表(routing table default)ID为253
  
  default路由表是空为最后处理(post-processing)所预留若前面默认规则没有选择该数据报时保留用作最后处理该规则可以被删除
  
  不要将路由表和规则混淆规则是指向路由表也许会出现多个规则指向同个路由表而有些路由表可能并不被任何规则指向如果删除了指向某个路由表所有规则则该表将不发生作用但是表将仍然存在个路由表只有在其中包含所有路由信息被删除才会消失
  
  前面提到Linux策略规对应动作除了指向个路由表以外还能是若干种区别动作当创建个策略规则有如下类型动作可以选择:
  
  unicast -- 在该规则指向路由表中进行标准路由查找个路由表被指定这是默认动作
  
  blackhole -- 规则动作将仅仅直接丢弃该数据报
  
  unreachable -- 规则动作产生条网络不可达信息个类型为3代码为0ICMP消息被返回给发送者
  
  prohibit -- 规则动作产生个通信被禁止消息个类型为3代码为13ICMP消息被返回给发送者
  
  其他类型动作也可以被使用但是都和策略路由没有关系它们被用来在内核中实现其他高级流控制和数据报操作只有个工具命令:ip所有这些类型都是可运用于该命令但我们仅仅使用和上面有关部分可以是返回条路由或其他若干个动作
  
  在解释举例以前首先看看ip工具命令语法ip命令可以用在很多地方这里仅仅讨论和策略路由相关部分都是由root在命令行直接运行
  
  首先看ip addr命令语法:
  
   root@netmonster# ip addr help
   Usage: ip addr {add|del} IFADDR dev STRING
     ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ]
               [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]
   IFADDR := PREFIX | ADDR peer PREFIX
      [ broadcast ADDR ] [ anycast ADDR ]
      [ label STRING ] [ scope SCOPE-ID ]
   SCOPE-ID := [ host | link | global | NUMBER ]
   FLAG-LIST := [ FLAG-LIST ] FLAG
   FLAG := [ permanent | dynamic | secondary | primary |
       tentative | deprecated ]
  
   Example - ip addr add 192.168.1.1/24 dev eth0
  
  该命令将添加IP地址192.168.2.2/24到eth0网卡上.
  
  下面看看ip route命令:
  
   root@netmonster# ip route help
   Usage: ip route { list | flush } SELECTOR
   
   ip route get ADDRESS [ from ADDRESS i STRING ]
   
   [ o STRING ] [ tos TOS ]
   
   ip route { add | del | replace | change | append | replace | 
   
   monitor} ROUTE
   
   SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
   
   [ table TABLE_ID ] [ proto RTPROTO ]
   
   [ type TYPE ] [ scope SCOPE ]
   
   ROUTE := NODE_SPEC [ INFO_SPEC ]
   
   NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
   
   [ table TABLE_ID ] [ proto RTPROTO ]
   
   [ scope SCOPE ] [ metric METRIC ]
   
   INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
   
   NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
   
   OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
   
   [ rtt NUMBER ] [ rttvar NUMBER ]
   
   [ window NUMBER] [ cwnd NUMBER ] [ ssthresh REALM ]
   
   [ realms REALM ]
   
   TYPE := [ unicast | local | broadcast | multicast | throw |
   
   unreachable | prohibit | blackhole | nat ]
   
   TABLE_ID := [ local | | default | all | NUMBER ]
   
   SCOPE := [ host | link | global | NUMBER ]
   
   FLAGS := [ equalize ]
   
   NHFLAGS := [ _disibledevent=>   
   Example - ip route add 192.168.2.0/24 via 192.168.1.254
  
  该举例将添加条通过192.168.1.254到网络192.168.2.0/24路由
  
  最后看看ip rule命令:
  
   root@netmonster# ip rule help
   Usage: ip rule [ list | add | del ] SELECTOR ACTION
   SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK ]
       [ dev STRING ] [ pref NUMBER ]
   ACTION := [ table TABLE_ID ] [ nat ADDRESS ]
      [ prohibit | reject | unreachable ]
      [ realms [SRCREALM/]DSTREALM ]
   TABLE_ID := [ local | | default | NUMBER ]
   
   Example - ip rule add from 192.168.2.0/24 prio 32777 reject
  
  该命令将丢弃源地址属于192.168.2.0/24网络所有数据报
  
  在讨论了命令语法以后下面是些上面命令举例
  
  例 1:拒绝访问Internet
  
  假设有个连接本地局域网和Internet你希望禁止局域网个子网访问Internet当然这可以通过Linux数据报过滤来实现但是下面我们将介绍另外种实现思路方法首先我们来假设有如下
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: