RouterOS v7 Routing Filter
RouterOS v7在路由方面除了路由表(routing/table)改动最大外,就是动态路由,其实RIP、OSPF和BGP在配置时设置参数和模板选项变动下还好,大多参数通过选项的方式可以设置,但Routing Filter的改动几乎是逆天,从v7.1beta4开始,routing filter rule配置修改为类脚本语法 。rule规则采用 “if .. then” 配置方式,或根据“if”语句中的条件应用操作。
这样的修改实在无法理解MikroTik的思路,又一次增加了RouterOS的操作难度,还需要去查找相关的字段,写成代码来过滤,不能好好的把属性参数写成选项来填写吗?对于动态路由这部分,已经上升到了运营商和相对较大的企业网络应用,不仅要懂网络,还要有一定的编程语言的基础,因此把这部分的门坎抬高是为了培训收费?
操作路径:routing/filter/rule
Routing Filter语法
Filter规则支持多条件匹配,语法构成如下:
if ( [matchers] ) { [actions] } else { [actions] }
属性的两种类型:
- only readable –这类属性参数仅只读且不能修改,这类属性只能被匹配使用
- readable/writable –这类属性参数只读和可修改,既能执行过滤配置,也可匹配使用
只读属性可以与其他只读属性参数匹配(仅适用于数值型)或使用布尔运算符的常量值。
[matchers]:[prop readable] [bool operator] [prop readable] [actions]:[action] [prop writeable] [value]
仅只有一个条件匹配的操作,则不需使用布尔运算符,如下面没有布尔运算符的实例:
if ( protocol connected ) { accept }
下面是使用了布尔运算符:
if ( bgp-med < 30 ) { accept }
如果匹配的属性是只读,matcher无需使用运算符
if ( ospf-dn ) { reject }
注意,路由过滤器链的默认动作是“拒绝”。
rule实例
在rule中,允许多个条件被叠加在一个规则中,并像防火墙一样按顺序执行, 下面的实例,匹配静态且是默认路由,并执行接受,可以写入在一条规则中(在routing filter链表中,默认action为“drop“):
/routing/filter/ruleadd chain=ospf_in rule="if (dst==0.0.0.0/0 && protocol static) { accept }"
例如,在v6的规则 “/routing filter add chain=ospf_in prefix=172.16.0.0/16 prefix-length=24 protocol=static action=accept”,转换为v7的配置如下:
/routing/filter/ruleadd chain=ospf_in rule="if (dst in 172.16.0.0/16 && dst-len==24 && protocol static) { accept }"
另一个实例,前缀的匹配,从172.16.0.0/16中匹配子网长度为24的范围,并设置BGP的mde和prepend参数:
/routing/filter/ruleadd chain=BGP_OUT rule="if (dst-len==24 && dst in 172.16.0.0/16) {set bgp-med 20; set bgp-path-prepend 2; accept }"
可以通过以下配置匹配前缀长度范围
/routing/filter/ruleadd chain=BGP_OUT rule="if (dst-len>13 && dst-len<31 && dst in 172.16.0.0/16) { accept }"
Filter规则可以匹配或设置communities参数, 如能使用large communities和extended communities
/routing/filter/ruleadd chain=bgp_in rule=" bgp-communities-large append 200001:200001:10 "
如果有多个community,需要在多个规则中应用,可以在large-community-set下定义community集合,并使用它们来匹配或设置:
/routing/filter/large-community-setadd set=myLargeComSet communities=200001:200001:10 /routing/filter/ruleadd chain=bgp_in rule=" bgp-communities-large-set append myLargeComSet "
由于route-target编码在extended community属性中以更改或匹配RT,因此需要对extended community属性进行操作:
/routing/filter/ruleadd chain=bgp_in rule=" bgp-communities-ext append rt:327824:20 "
下面的实例是匹配子网192.168.1.0/24,并且子网长度大于24,就执行distance距离增加1,如果没有匹配,就减去distance值1
/routing filter rule add chain=myChain rule="if (dst==192.168.1.0/24 && dst-len>24) {set distance +1; accept} else {set distance -1; accept}"
也可以配置“||”或的方式匹配,如下:
/routing filter ruleadd chain=osfp_out disabled=no rule="if(dst==192.168.81.0/24 || dst==192.168.80. 0/24 ){set distance +1; accept}"
RouterOS这款软件涉及太多了!用无线的人骂他,做路由交换的人骂他,搞VPN隧道的人也骂他,一款能被各种人骂的产品是什么体验!