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隧道的人也骂他,一款能被各种人骂的产品是什么体验!

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章很值,打赏犒劳作者一下