正則表達式本身只是一個文本的匹配工具,大量使用在軟件編程中,可以簡化代碼。而在BGP中的as-path中也會使用到正則表達式。首先需要明確的是,正則表達式就只是一個文本匹配工具,它的處理對象就是文本,也就是說它要去匹配的對象於它而言就是純文本,而不管你是在BGP還是在軟件編程中應用它。as-path過濾的過程是,系統截取BGP路由中的as-path的內容(包括兩個AS號之間的空格)作爲輸入文本,以相應正則表達式進行過濾。這個過程的理解在我們製作as-path列表的時候很有指導作用。正則表達式的運算順序是從左往右的。
既然正則表達式是一個文本匹配工具,那千萬別忘了平常在很多場合中是可以方便使用的,如在UltraEdit中進行文本查找,在設備上操作時使用管道符匹配輸出時。
在設備上過濾顯示的路由時還有專門的通過as-path過濾的命令:
show route protocol bgp aspath-regex "4134.*|()" *******JUNOS中;
show ip bgp regexp "4134.*|()" *******IOS、JUNOSe中;
一、正則表達式常用符號
符號 |
說明 |
示例 |
As-path列舉 |
^ |
匹配一個字符串的開始。 |
^12 |
12;
12 1;12 34 45;12 ……; |
$ |
匹配一個字符串的結束。 |
12$ |
12;
1 12;34 45 12;…… 12; |
{m} |
匹配前面的表達式,出現m次。 |
12{3} |
12 12 12; |
{m,} |
匹配前面的表達式,至少出現m次。 |
12{3,} |
12 12 12;
12 12 12 12;12 12 12 12 ……; |
{m,n} |
匹配前面的表達式,至少出現m次,至多出現n次。 |
12{1,2} |
12;
12 12; |
* |
匹配前面的表達式,出現任意次。等效於{0,} |
12* |
Null;
12;
12 12;12 12 12;12 12 ……; |
+ |
匹配前面的表達式,至少出現1次。等效於{1,} |
12+ |
12;
12 12;12 12 12;12 12 ……; |
? |
匹配前面的表達式,出現0次或者1次。 等效於{0,1} |
12? |
Null;
12; |
. |
代表除換行符以外的任意單個非空字符。 |
.12 |
34 12;
56 12;78 12;……12; |
( ) |
標記一個子表達式的開始和結束位置 |
. (56|78) |
34 56;
34 78;……; |
! |
邏輯非 |
|
|
| |
邏輯或 |
12|34 |
12;
34; |
[ ] |
匹配的一個範圍中任意一個AS,通常和“-”一起使用。IOS和VRP裏面,[]裏面只能填寫數字0到9,不能填寫多位數。JUNOS中支持填寫多位數。 |
[123-125]* |
Null;
123;123 124;124 124 124;……; |
- |
連接符,指定一個範圍中一個值 |
123-125 |
123;
124;125; |
_ |
匹配一個符號。如逗號,括號,空格符號等。
JUNOS不支持。 |
|
|
注:在JUNOS中,9929{3}=9929 9929 9929,不是=992999
二、常用的as-path
1、Null as-path----匹配本AS內的路由
set policy-options as-path NullASPath ^&
或者:set policy-options as-path NullASPath “()” ******注意,此種用法在IOS上不支持;JUNSO上雙引號不可省略。
用法舉例:電信城域網中,BR只把本城域網內的明細路由(及缺省路由)通告給下掛的BRAS設備;既能減少BRAS上的路由條目,同時也利於城域網業務靈活部署。
2、任意as-path(包括空):
set policy-options as-path AnyPath .*
用法舉例:通常用在as-path列表的最後一條,在前面deny的基礎上,允許其他的所有通過。
3、經過某個AS傳遞過來的路由(經某個AS穿越的路由):
set policy-options as-path ThroughCertainAS “.* AS_number .+”
用法舉例:在城域網與163、CN2的對接中,明確規定CN2、163間的互訪流量不能通過城域網進行穿越。因此在向163(CN2)通告路由的時候,可以使用上述as-path禁止從CN2(163)收到的路由再向163(CN2)通告。
4、從某個鄰居AS傳遞過來的路由:
set policy-options as-path ThroughCertainAS “AS_number .*”
5、從某個AS始發的路由:
set policy-options as-path ThroughCertainAS “.* AS_number”