当前位置: 首页 > Linux

Linux策略路由详解

时间:2023-04-06 19:45:28 Linux

概述在Linux中,我们通常使用route命令来管理路由信息。但是,该命令只能用于管理基本的路由信息??。面对更加强大的基于策略的路由机制,route命令显得捉襟见肘。在传统的路由算法中,只能根据目的地址进行路由。但是,如果路由选择有更复杂的需求,比如对不同源地址、传输层端口、甚至载荷的路由控制更细致,传统的基于目的地址的路由表就不能满足要求,需要更强大的路由表要使用的。路由策略数据库路由数据库:RPDB来处理。命令安装安装非常简单,按照以下命令安装即可。#检查是否安装了iproute#检查iproute版本]#ip-Viputility,iproute2-ss170501#安装yuminstalliproute-yRoutingPolicyDatabase(RPDB)RPDB是一个存储策略的数据库,匹配到策略的数据包会进行相关操作,可以通过iprule进行管理。系统启动时,内核会配置三个默认策略:#可以通过ipruleshow查看当前RPDB中的规则]#ipruleshow0:fromalllookuplocal#优先级为0,匹配任意源地址,查询localroutingtableforforwarding32766:fromalllookupmain#优先级为32766,匹配任意源地址,查询转发的主路由表32767:fromalllookupdefault#优先级为32767,匹配任意源地址,查询默认路由tableforforwarding1.本地路由表是一张特殊的路由表,包含了本地地址和广播地址的高优先级控制路由。比如访问127.0.0.1就是引用规则。2、主路由表是一个通用路由表,一般通过route-n命令操作。3、默认路由表默认为空表,除非有特殊要求,可以留空。每个策略路由规则由一个选择器和一个动作组成。RPDB按照优先级顺序匹配规则,优先级数字越小,优先级越高。选择器匹配到的消息会执行相应的操作。如果操作成功,数据将按照指定的路由进行转发,然后终止RPDB匹配。如果执行失败,将报错并终止RPDB匹配。否则RPDB会继续执行下一条规则。iprule命令说明#执行iprulehelp查看帮助信息。如果需要更详细的帮助信息,可以执行manip-rule]#iprulehelpUsage:iprule{add|del}SELECTORACTIONip规则{flush|保存|restore}iprule[list[SELECTOR]]SELECTOR:=[not][fromPREFIX][toPREFIX][tosTOS][fwmarkFWMARK[/MASK]][iifSTRING][oifSTRING][prefNUMBER][l3mdev复制代码][uidrangeNUMBER-NUMBER]ACTION:=[tableTABLE_ID][natADDRESS][realms[SRCREALM/]DSTREALM][gotoNUMBER]SUPPRESSORSUPPRESSOR:=[suppress_prefixlengthNUMBER][suppress_ifgroupDEVGROUP]TABLElocal_ID||NUMBER]selector(SELECTOR)fromPREFIX:根据源地址前缀匹配toPREFIX:根据目的地址前缀匹配tosTOS:根据ip包头的TOS字段的值匹配fwmarkFWMARK[/MASK]:markwithiptables-tmangle,MatchagainsttagiifSTRING:选择要匹配的数据包的输入接口。oifSTRING:选择要匹配的出接口设备。仅对来自绑定到设备的本地套接字的消息有效prefNUMBER:规则的优先级。这里的pref可以换成priority或者order,效果是一样的。动作(ACTION)表TABLE_ID:规则匹配时,指定要使用的路由表,匹配到的数据包会根据指定的路由表进行路由。这里的table也可以换成lookup,效果是一样的。blackhole:丢弃匹配的数据包。无法访问:丢弃匹配的数据包并生成“网络无法访问”错误。禁止:丢弃具有“通信被管理禁止”错误的匹配数据包。查看策略]#ipruleshow0:fromalllookuplocal32766:fromalllookupmain32767:fromalllookupdefaultAddpolicy#来自192.168.22.3的数据包参考id为10的路由表进行转发ipruleaddfrom192.168.22.3table10#设置rule的优先级为100,发送到192.168.23.0/24的包会参考id为100的路由表进行转发。ipruleaddto192.168.23.0/24table20pref100#协议为tcp,源地址为192.168.24.0/24,目的端口为80包,路由前标记1iptables-tmangle-APREROUTING-ptcp-mmultiport--dports80-s192.168.24.0/24-jMARK--set-mark1#参照id为iptables_table的路由表转发标记为1的包ipruleaddfwmark1tableiptables_table#所有来自192.168.25.0/24的包都会被丢弃ipruleaddfrom192.168.25.0/24blackholeipruleaddfrom192.168.26.0/24unreachableipruleaddfrom192.168.27.0/24prohibit注意添加动作为表TABLE_ID时,默认只能添加数字。如果添加的字符是有如下错误。]#ipruleaddfrom192.168.22.3tableiptables_tableError:argument"iptables_table"iswrong:invalidtableID这带来了一个问题。如果时间久了,我不知道我当时添加的路由表是什么意思。所以数字和字符之间需要有对应关系。此对应关系存储在文件/etc/iproute2/rt_tables中。#编辑/etc/iproute2/rt_tables,将iptables_table表id添加到100]#cat/etc/iproute2/rt_tables##保留值#255local254main253default0unspec#自定义路由表100iptables_table##local##1inr.添加ruhep后,可以正常执行ipruleaddfrom192.168.22.3tableiptables_table。并且在执行ipruleshow的时候,路由表也是按照定义的字符来显示的。删除策略#检查是否安装了iproute#检查iproute版本]#ip-Viputility,iproute2-ss170501#安装yuminstalliproute-y路由表管理目前通过iprule命令可以根据不同选择不同的路由表传输数据的规则。那么如何管理不同的路由表呢?很简单,在正常执行的命令后面加上表TABLE_ID即可。查看路由表路由条目#iprouteshow等同于iprouteshowtablemain,即默认查看主路由表iprouteshow#查看指定目标的路由iprouteshow192.168.22.0/24#查看指定路由表Routeiniptables_tableiprouteshowtableiptables_tableiprouteshowtable100Addroute#添加默认路由到iptables_tableiprouteadddefaultvia192.168.22.1deveth1src192.168.22.3tableiptables_table]#iprouteshowtable100default.1via81eth1src192.168.22.3deleteroute#删除iptables_table路由表中的路由iproutedeldefaultvia192.168.22.1deveth1src192.168.22.3tableiptables_table京东云官网最新活动:https://www.jdcloud.com/中/巴...