在学习BGP的高级特性应用中,需要用到AS_Path Filter(AS路径过滤器),Community Filter(团体属性过滤器)等工具进行路由匹配,需要用到正则表达式,因此学习正则表达式的对应字符应用。
常用正则表达式列表
| 限定符类型 | 应用 |
| a? | a出现0次或1次 |
| a* | a出现0次或多次 |
| a+ | a出现1次或多次 |
| a{6} | a出现6次 |
| a{2,6} | a出现2-6次 |
| a{2,} | a出现2次及以上 |
| 或运算符类型 | 应用 |
| (a|b) | 匹配a或b |
| (ab)|(cd) | 匹配ab或cd |
| 字符类 | 应用 |
| [abc] | 匹配a或b或c |
| [a-c] | 匹配a或b或c |
| [a-zA-Z0-9] | 匹配所有小写和大写英文字符及数字字符 |
| [^0-9] | 匹配非数字字符 |
| 元字符 | 意义 |
| \d | 匹配数字字符 |
| \D | 匹配非数字字符 |
| \w | 匹配单词字符(包括英文、数字、下划线) |
| \W | 匹配非单词字符 |
| \s | 匹配空白符(包括空格、换行符、Tab) |
| \S | 匹配非空白字符 |
| . | 匹配任意字符(不包括换行符) |
| \b \bword | 标志字符边界 |
| ^ | 匹配行首 |
| $ | 匹配行尾 |
| _ | 下划线,匹配任意的一个分隔符 匹配逗号”,“、左花括号”{“、右花括号”}“ 匹配左圆括号"("、右圆括号")" 匹配输入字符串的开始位置(同^) 匹配输入字符串的结束位置(同$) 匹配一个空格 | _10 匹配(10、{10、空格10等 10_ 匹配10)、10}、10空格等 |
正则表达式具有以下功能:
检查字符串中符合某个规则的子字符串,并可以获取该子字符串。
根据匹配规则对字符串进行替换操作。
使用正则表达式对IP地址与子网掩码匹配
可在网站https://regex101.com/在线进行正则表达式匹配,列出以下数字
192.168.1.1
192.168.1.256 #(非正确IP)
256.244.1.1 #(非正确IP)
1.1.1.1
166.166.166 #(非正确IP)
0.0.0.0
66.66.66.66
38.38.38.38
138.138.138.138
138.1.1.1
首先IP地址的格式为xxx.xxx.xxx.xxx,先以前三个数字入手,匹配“xxx.”
匹配 250~255
首先匹配为250,251,252,253,254,255,因此需要输入正则表达式25[0-5]。
匹配 200~249
其次匹配为20x,21x,22x,23x,24x,x可以为0-9任意数字,因此需要输入正则表达式2[0-4]\d,\d为匹配任意数字,与[0-9]相当。
匹配 0~199
IP首位可匹配为0或1或2,最后匹配IP地址首位不为2,首位为0xx和1xx,此时x可以为0-9任意数字,因此需要输入正则表达式[01]\d\d匹配首位为0或1数字,\d为匹配任意数字,与[0-9]相当。
但IP地址前三个数字可有x,xx,xxx三种情况,如1.x.x.x,11.x.x.x,111.x.x.x。不完全为三位数字,因此需要在上一步骤中的[01]\d\d基础上,加上?进行匹配0次或1次,加上两个?匹配一位数字和两位数字的情况。因此需要改写正则表达式[01]?\d\d?,即为匹配不完全为三位数字的IP地址情况。
将以上三个正则表达式综合起来合并,使用(x|x)或运算符进行隔开,因此正则表达式写为
(25[0-5]|2[0-4]\d|[01]?\d\d?)
还需要匹配"xxx."中的".",使用转义字符\匹配".",因此正则表达式写为
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.)
IP地址中前三个匹配相同,因此直接在正则表达式上加上限定符{}进行次数匹配,因此正则表达式写为
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}
此时匹配为"0~255.0~255.0~255.",但不能将限定符{}次数匹配改为"4"。{3}只能匹配三次,如果次数改为"4",则匹配的为"0~255.0~255.0~255.0~255.",末尾多了字符".",是错误的表达。
因此将前段的正则表达式去掉匹配".",复制粘贴,得到正确正则表达式为
((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
最后加上标志字符边界,得到最终的正则表达式为
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b
在正则表达式上加上子网掩码匹配
如上同理思路应用,若添加上带子网掩码的IP正则表达式,可以写为
#斜杠分隔格式xxx.xxx.xxx.xxx/xx
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
\/ #转义"/"
([0-9]|[1-2][0-9]|3[0-2])\b #子网掩码0-32
#完整为
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\/([0-9]|[1-2][0-9]|3[0-2])\b
#空格分隔格式xxx.xxx.xxx.xxx xx
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
\s+ #匹配一个或多个空格,可改为精确一个空格"\s"
([0-9]|[1-2][0-9]|3[0-2])\b #子网掩码0-32
#完整为
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\s+([0-9]|[1-2][0-9]|3[0-2])\b

网站上测试如图
在AS_Path中使用正则表达式匹配示例
| ^$ | 匹配不包含任何AS号的AS_Path,也就是本AS内的路由 |
| .* | 匹配所有,任何路由 |
| ^10[0138]$ | 匹配100、101、103、108 |
| ^10[^3-8]$ | 匹配除103~108以外的AS_Path |
| ^10. | 匹配100~109,以及10 |
| ^12(_34)?_56$ | 匹配12 56,及12 34 56 |
如使用AS_Path Filter匹配拒绝AS138的路由,允许其他AS路由通过传递
[R1] ip as-path-filter name1 deny _138$
[R1] ip as-path-filter name1 permit .*
#直接调用方式
[R1] bgp 666
[R1-bgp] peer 138.138.138.138 as-number 520
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] peer 138.138.138.138 as-path-filter name1 export
#路由策略方式
[R1] route-policy AS_Path permit node 10
[R1-route-policy] if-match as-path-filter name1
[R1-route-policy] quit
[R1] bgp 666
[R1-bgp] peer 138.138.138.138 as-number 520
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] peer 138.138.138.138 route-policy AS_Path export
高级Community Filter可以使用正则表达式进行匹配。
基本Community Filter编号范围:1~99。高级Community Filter编号范围:100~199。
如使用高级Community Filter匹配携带以38开头的Community值的路由
[R1} ip community-filter 100 permit ^38
在学习BGP的高级特性中,涉及正则表达式的使用,特此学习理解并使用正则表达式进行路由匹配,作为学习日志记录。
Comments NOTHING