上一期文章介紹了撥接導向路由技術,不僅講解一些基本的運作原理,也說明了設定撥接導向路由的第一步驟:設定靜態路由。而這一期的內容將介紹第二個步驟:如何定義有興趣的封包。
所謂有興趣的封包,係指可以啟動撥接導向路由連線的網路封包。因此,一旦收到所定義的網路封包,撥接導向路由連線就會自動建立,透過這個連線,就會開始傳送任何的網路封包資料。而這些有興趣的網路封包,是透過存取控制清單來定義。設定好存取控制清單之後,再套用到撥接導向路由的設定,步驟上有點複雜。至於存取控制清單的種類和設定指令也並不簡單,底下就為各位一一做介紹。
撥接導向路由簡介
撥接導向路由(DDR)允許在一般的撥接設備環境中,讓兩個以上的Cisco路由器動態地做連線。一般而言,撥接導向路由(DDR)技術應用在ISDN網路或PSTN網路時,用於傳輸量少或是會定期做網路傳輸動作的網路連線。簡單地說,撥接導向路由只有在需要傳送資料的時候,才會去建立連線。
撥接導向路由運作過程
接著來瞭解一個撥接導向路由連線是如何產生的,就Cisco路由器而言,要產生一個連線讓雙方傳遞資料之前,一定要知道雙方的傳遞網路路徑。
第一步驟:決定網路路徑與傳輸介面
當Cisco路由器設備收到封包時,會先查看本地端的路由表格,以便瞭解目前路由表中是否擁有已知路徑前往要到達的目的地,若擁有已知的網路路徑,當然也就知道要從哪個介面把這個網路封包傳送出去,這也是第一個步驟主要的工作內容。
第二步驟:決定是否為感興趣的封包
決定要傳出的介面之後,會先觀察如果傳出的介面被設定為使用撥接導向路由(DDR),則從網路管理人員事先已經定義的感興趣(Interesting)封包的條件,來決定這個封包是否為感興趣的封包。所謂的感興趣的封包,係指任何可以用來啟動(trigger)一個撥號連線(call)的封包。
第三步驟:決定下一個設備與撥號動作
接下來,路由器設備會決定下一個設備的位置在哪裡,然後決定所要進行的撥號動作為何。
第四步驟:建立連線與傳遞封包
再來就是從撥號清單中查看目前這個介面是否連接著遠端的目的地,如果目前這個介面正連接著所要的遠端目的地,就會送出封包。
倘若這個封包是感興趣的封包,則會重置(reset)閒置計時器(idle timer)。當這個連線建立之後,基本上所有的網路封包都可以通行,不過,一旦收到感興趣的網路封包,就會重置閒置計時器。
如果目前這個介面沒有連接到遠端的目的地,採用BRI的路由器就會使用D channel來發送建立連線(call setup)的資訊。什麼是BRI?什麼又是D channel?後面會再詳細地介紹給各位。等到連線建立完成之後,所有的網路封包,包含感興趣的與不感興趣的,就都會被傳遞,那些所謂不感興趣的(Uninteresting)網路封包,可能就是包含資料與路由更新等等。
第五步驟:中斷連線
剛才提到過,一旦收到感興趣的網路封包,就會重置閒置計時器。因此,如果沒有收到感興趣的封包,閒置計時器就會開始計時的動作,而當閒置計時器持續計時到一定的時間,連線就會中斷。因此,讀者可以發現,連線的中斷動作是由閒置計時器所控制的。
撥接導向路由的設定方式
基本上,我們可以做一套簡單的撥接導向路由(DDR)的設定,裡面擁有單一一套撥號參數設定,然後套用於一個介面之上,這樣的基本撥接導向路由(DDR)設定,稱之為「legacy DDR」。如果需要在同一個介面上套用多個不同的撥接導向路由(DDR)設定值,則可以透過使用profile來達到這個目的。
瞭解這些差異之後,就來看看如何設定撥接導向路由(DDR)。基本上,設定撥接導向路由(DDR)分成三個主要的步驟:
第一步驟
建立靜態路由以便決定如何前往目的地。這裡建議使用靜態路由,不然,若使用動態路由的話,可能交換路由表的時候就會觸發撥號的行為,這就不是我們所想要的情況。
第二步驟
定義何謂有興趣的網路封包,也就是怎樣的網路封包可以用來啟動這個連線。
第三步驟
設定撥號相關的資訊,就好像是電話系統的電話號碼。
不過,交換機和路由器的一些基本設定值,都必須在這些步驟進行之前就先完成設定。所以,大致上來看,撥接導向路由(DDR)的連線架構圖會像是下面這樣的網路圖:
一開始,由左邊的伺服器K發送有興趣的封包給路由器A,路由器A收到之後,發現是有興趣的封包,就會啟動撥號路由連線,接著經由DCE設備前往ISDN或是其他類型的網路到達目的地端的DCE設備,最後透過目的地端的路由器設備B,再傳給目的地端。
第一步驟:設定靜態路由
這個步驟於上一期的文章之中已詳細介紹過,因此就不多做介紹,只是簡單提示一下。
首先,讀者要瞭解為什麼這裡要使用靜態路由?由於動態路由之所以可以一直得到正確的訊息,是因為各個路由器設備之間不斷地互相分享Routing table的成果,因此使用動態路由的做法,在網路有任何改變的時候,不需要更動Routing table。
不過,由於現在要介紹的撥接導向路由,只有在需要的時候才傳遞資料,所以不適合使用動態路由,否則就會因為動態路由需要隨時得到最正確的Routing table而一直有傳遞資料、觸發撥接導向路由的可能性。而設定靜態路由的指令如下所示:
Router(config)#ip route prefix mask {address | interface } [distance] [permanent] |
至於要檢視靜態路由的設定值,可以執行下面這個指令:
相關的詳細內容請參閱上一期網管人雜誌第100頁「撥接導向路由的介紹與設定(一)」。
第二步驟:定義有興趣的封包
設定好靜態路由之後,接下來定義有興趣的封包是什麼。定義好有興趣的封包是什麼,往後只要收到所定義的有興趣的封包,就會建立撥接導向的路由連線。其設定的指令格式如下所示:
Router(config)#dialer-list dialer-group protocol proto-name {permit|deny} list access-list-number |
在上面的指令格式中,粗體為關鍵字,不可變更,而斜體的部分是要替換成真正執行的資料。各位可以看到,這個指令為dialer-list,而後面可以指定網路協定,接著就是指定要允許(permit)還是拒絕(deny)。最後則是接上存取清單的編號。所以各位可以清楚發現,詳細的封包定義是在存取控制清單中所設定的。
也因為如此,在執行上面這個指令之前,必須先把存取控制清單設定好,但是該如何設定存取控制清單呢?下面為各位介紹一下存取控制清單以及設定方式。
存取控制清單簡介
存取控制清單,也就是「Access Control List」,簡稱ACL。顧名思義,存取控制清單就是一個清單,內容包含一些「規則」,也可以視為條件,用來指導Cisco路由器設備如何辨識哪些網路封包,以及要對這些網路封包做哪些動作,例如網路管理人員可能會想要阻絕某些網路封包,而希望只允許某些特定的網路封包。一旦網路管理人員在Cisco路由器設備上設定好存取控制清單之後,當網路封包通過Cisco路由器設備時,就會依據存取控制清單的內容來決定是否要讓這個網路封包經過。這有點類似一般基本的防火牆過濾網路封包的功能,這樣來想,讀者可能就比較容易理解了。
存取控制清單的種類與差異
在Cisco IOS上,若不設定存取控制清單也可以使用Cisco網路設備,只是若能適當地使用,會更好。基本上,存取控制清單分為兩個類型:
1. 標準型存取控制清單
2. 延伸型存取控制清單
而這兩種存取控制清單的差異包含:
1. 檢查網路封包的條件不同
2. 所能處理的網路協定不同
3. 識別碼範圍不同
針對第一個差異,標準型存取控制清單與延伸型存取控制清單最大的不同就在於,標準型只檢查網路封包的來源IP位址,而延伸型存取控制清單不但會檢查網路封包的來源IP位址,也會檢查目的地IP位址。
至於所能處理的網路協定部分,標準型存取控制清單只能針對所有的網路協定來做處理,無法對特定的網路協定指定允許或拒絕的動作處理,而延伸型存取控制清單可以針對特定的網路協定進行處置。由此看來,延伸型的存取控制清單的能力比較強大,能設定的東西比較多。
延伸型存取控制清單中的規則,除了可以指定網路協定之外,還可以在協定後面加上埠的編號,以便指明要套用在那一個埠的網路封包。一般而言,網路管理人員都會指明比較常見的埠編號(Well Known Ports),底下列出一些常見的埠編號以及所對應的網路服務:
最後是識別碼的不同部分,在存取控制清單中,每一條規則都有其特定的識別碼(ID),以便於辨識每一條專屬的存取控制規則,不過,標準型存取控制清單和延伸型存取控制清單所使用的識別碼範圍是不同的。
標準型存取控制清單的識別碼範圍是從1到99以及1300到1999之間,而延伸型存取控制清單的識別碼範圍則是從100到199以及2000到2699之間。
由這裡可以看出,標準型存取控制清單所能設定的規則數目一共有799個,而延伸型存取控制清單所能設定的規則數目一樣也是799個,但是所使用的識別碼範圍不同,這點要稍微注意一下。以下就是針對這兩種存取控制清單識別碼的整理:
Inbound與Outbound存取控制清單
前面提過,標準型存取控制清單的存取控制規則只能針對來源位址進行過濾,以便決定是否要允許還是拒絕所對應的網路封包,所以這些網路封包指的都是所有的TCP/IP網路協定,對於網路協定這一點,標準型存取控制清單是不能設定的。
另外,由於延伸型存取控制清單的規則可以針對來源端位址和目的端位址來過濾網路封包,因此,Cisco路由器設備上的某個埠在什麼的情況下稱為「Inbound」?而那種的情況又被稱為「Outbond」呢?先來看下面這個圖:
假設中間是Cisco路由器設備,左右各接上一個介面連到不同的網段,只要是從目前這台路由器設備流出去的網路封包都稱為「Outbound」,如同上圖中的箭頭所示。
相反地,如果是流向路由器設備方向的網路封包,則為「Inbound」,如下圖所示:
Inbound與Outbound 存取控制清單的套用時機
假設一個Cisco路由器設備,如果沒有設定存取控制清單,當拿到一個網路封包時,會做怎樣的處理,其流程如下圖所示:
沒有使用存取控制清單的流程,看起來其實並不複雜。接下來,先來看看所謂的Outbound存取控制清單的運作流程,如右上圖所示:
以上就是Outbound存取控制清單的運作流程,看起來可能有點複雜,其實並不會,Outbound存取控制清單最主要的重點是「存取控制清單的規則是,當網路封包在準備要由Outbound介面出去的時候才執行」。
相反地,Inbound存取控制清單則是在Inbound介面取得網路封包時,先套用存取控制清單以便決定是否要做進一步的動作,其中最大的差異就是動作的順序性,接著來看看Inbound存取控制清單的運作流程,如下頁圖示。
由流程圖可以看出,Inbound存取控制清單的運作方式和Outbound存取控制清單的運作方式,只是「套用存取控制清單」和「查詢路由表格」的順序上的差異而已。不過,若要嚴格的比較的話,Inbound存取控制清單可能擁有比較好的效能,因為若先套用存取控制清單,再決定是否要查詢路由表格的話,就可以大幅減少路由表格查詢的時間。
除此之外,符合規則的方式其實也和防火牆類似,一般存取控制清單當然都會有很多規則,而每一個網路流量也可能符合存取控制清單中一條以上的規則,但是,在決定使用哪一條規則時,是由第一條規則開始嘗試,一旦找到第一條符合的規則,就直接套用其符合的規則,也就是「First Match」的精神。
換句話說,假設存取控制清單中第一條規則是「允許TCP協定23埠的網路封包」,但是後面的規則中可能是「拒絕TCP協定23埠的網路封包」,則會因為在套用規則時先找到一條規則,所以最終結果是「允許TCP協定23埠的網路封包」。如果存取控制清單中都找不到符合的規則,預設就會拒絕這個網路封包。
字元遮罩的使用方式
在存取控制清單中,位址的部分可以使用字元遮罩來指定一個以上的位址,不過不同的是,在存取控制清單中,位元值為0代表符合(Match)目前這個位元值所對應的位址值,而位元值為1則代表忽略(Ignore)。這點和子網路遮罩剛好相反,在子網路遮罩中,位元值為0代表忽略(Ignore),而位元值為1則代表符合(Match)。讀者要注意一下。
舉例來說,如果存取控制清單中規則的位址部分是192.168.10.55 0.0.0.0,代表一定要完整符合192.168.10.55這樣的位址才能套用這個規則,因為這裡的字元遮罩是0.0.0.0,表示要檢查並且符合位址中每一個位元值。所以,若想要將存取控制清單的某個規則套用到192.168.0.1~192.168.0.255,就代表位址中最後一個位元組可以完全忽略,因此存取控制清單規則中的位址可以是192.168.0.0 0.0.0.255。
設定標準型存取控制清單
先從比較簡單的標準型存取控制清單介紹起,以下說明如何透過指令來設定標準型存取控制清單,這裡要介紹的指令分為以下幾個部分:
1. 增加一筆存取控制規則的指令
2. 刪除特定一筆存取控制規則的指令
3. 將特定存取控制規則套用到某介面上的指令
4. 刪除已經套用在介面上的規則的指令
基本的設定語法格式如下所示:
Router(config)#access-list number [permit | deny] source mask |
和剛剛步驟一提到的格式類似,而由於這裡要設定的是標準型存取控制清單,所以存取控制規則的識別碼範圍為1到99之間,而mask指的是字元遮罩,這個字元遮罩可輸入也可忽略,若沒有輸入字元遮罩,預設值是0.0.0.0。字元遮罩是用來指定一個以上的位址。
不過不同的是,在存取控制清單中,位元值為0代表符合(Match)目前這個位元值所對應的位址值,而位元值為1則代表忽略(Ignore)。這點與子網路遮罩剛好是相反的。在子網路遮罩中,位元值為0代表忽略(Ignore),位元值為1則代表要符合(Match)。剛剛提過這裡字元遮罩的預設值是0.0.0.0,所以代表要符合前面輸入的IP位址的每一個位元才能套用這個存取控制規則。
有關字元遮罩的部分,上一篇文章已經詳細介紹過,若想瞭解更多有關字元遮罩的部分,可參考上一期的網管人雜誌。
假設我們要在某台Cisco路由器設備上,增加一筆存取控制規則「允許10.1.152.43這台機器所發送過來的網路封包」,則設定指令如下所示:
Router(config)#access-list 46 permit 10.1.152.43 |
從這裡可以看出,我們將這條規則的識別碼設定為46。
如果要刪除某一筆存取控制規則,指令格式如下所示:
Router(config)#no access-list number |
可以看出這是標準的反向操作指令,在Cisco IOS上,很多指令的反向操作通常都只是在原本指令的前面加上no關鍵字。所以,假設要刪除剛剛上面所增加的存取控制規則,只要執行以下指令即可:
Router(config)#no access-list 46 |
準備好存取控制規則之後,接著就是把所設定好的存取控制規則套用到介面上,指令格式如下:
Router(config-if)#ip access-group access-list-number [in | out] |
為了要設定到某個介面上,當然第一步是要先進入特定介面的interface mode底下,所以上面的指令的模式必須在(config-if)底下才能執行。「ip access-group」是關鍵字,後面只要接上存取控制規則的識別碼,然後再指定要套用在Inbound或Outbound。方向的選擇也可以不指定,若不指定的話,預設只會套用在Outbound方向上。
這裡的做法其實也很類似,只要執行反向指令即可。原本要把規則套用在某個介面上的指令是「ip access-group」,因此,若要將這條規則從介面上移除,只要在原本的指令前面加上no關鍵字即可,如下所示:
Router(config-if)#no ip access-group access-list-number |
設定延伸型存取控制清單
現在應該已經學會如何使用標準型存取控制清單,不過,如同前面所看到的,標準型存取控制清單中的規則功能很有限,並不能設定出複雜的存取控制規則。所以,這裡再介紹幾種不同的指令:
1. 增加一筆延伸型存取控制規則的指令
2. 套用延伸型存取控制規則到某介面的指令
增加一筆延伸型存取控制規則的指令與標準型存取控制規則類似,但能夠設定的選項比較多,其指令格式如下所示:
Router(config)#access-list number [permit | deny] protocol source source-widcard [operator port] destination destination-wildcard [operator-port] [established] [log] |
這個指令的關鍵字一樣也是access-list,後面接上存取控制規則的識別碼,可選擇的動作也有permit和deny。接下來,比較不同的是延伸型存取控制規則可以選擇網路協定,這裡可以選擇的網路協定有TCP、IP、ICMP、UDP、GRE(General Routing Encapsulation)以及IGRP(Interior Gateway Routing Protocol)等協定。
接下來指定來源端IP位址和位址字元遮罩,然後可以指定埠。這裡可以指定從來源端哪個埠出去的網路封包才需要套用這個存取控制規則,設定的方式是一個比較關鍵字加上埠號碼,例如要指定來源端的21號埠時,可以寫成「eq 21」。
這裡的比較關鍵字就是「eq」,其他比較關鍵字還有「lt」、「gt」和「neq」。lt是「less than」,代表「小於」,gt是「greater than」,代表「大於」,而neq是「not equal」,代表「不等於」,原本範例中的eq則代表「equal」,就是等於的意思。而埠的相關設定可以不輸入,是可有可無的設定項目。
來源埠設定完之後,後面繼續加上目的端的IP位址和相對應的位址字元遮罩,同樣也可以指定埠號碼。最後,可以額外指定是否要established這個關鍵字,若設定這個關鍵字,代表要允許TCP協定的網路封包,但是前提是這些網路封包是使用已經建立好的網路連線(established connection),而且這關鍵字只能套用在inbound的網路封包上。至於最後的log關鍵字,代表是否要在路由器設定螢幕上顯示出即時的網路封包紀錄(log)。
由於延伸型存取控制清單的設定相當複雜,這裡只介紹比較常見的指令,尤其是用在TCP協定。至於其他較為複雜的指令,如果以後有機會再為各位介紹。
準備好存取控制規則之後,接下來把所設定好的存取控制規則套用到介面上。指令格式和標準型控制清單一樣,其指令格式如下:
Router(config-if)#ip access-group access-list-number [in | out] |
為了要設定到某個介面上,當然第一步就是要先進入特定介面的interface mode底下,所以讀者可以看到上面的指令的模式必須在(config-if)底下才能執行。「ip access-group」是關鍵字,後面只要接上存取控制規則的識別碼,然後指定要套用在Inbound或Outbound。方向的選擇可以不指定,若不指定,預設只會套用在Outbound方向上。
套用存取控制清單於撥接導向路由設定
讀者們已經知道如何設定存取控制清單,回頭來看撥接導向路由,就會明白這裡的存取控制清單所要定義的就是「有興趣的網路封包」。一旦定義好所要使用的有興趣的封包為何之後,最後要做的就是把這些存取控制清單結合到撥接導向路由的設定上,而這裡所要執行的指令如下:
Router(config)#dialer-list dialer-group protocol proto-name {permit|deny} list access-list-number |
底下讓筆者用比較真實的設定範例來為各位介紹,請看底下的指令執行範例:
Router(config)#access-list 101 deny tcp any any eq ftp
Router(config)#access-list 101 deny tcp any any eq telnet
Router(config)#access-list 101 permit ip any any
Router(config)#dialer-list 1 protocol ip list 101
|
在上面的範例中,筆者使用了編號為101的延伸型存取控制清單來定義有興趣的封包,接著再把這個存取控制清單套用於撥接導向路由設定之中。讀者可以看到筆者讓FTP和Telnet的網路封包做拒絕的動作,而其餘的網路封包是允許的。這麼做的用意相當於只要是FTP和Telnet以外的網路封包,都可以啟動撥接導向路由,但也不是代表FTP和Telnet的網路封包不能透過撥接導向路由來傳送,只是FTP和Telnet的網路封包無法啟動撥接導向路由的連線。一旦這樣的連線建立之後,FTP和Telnet的網路封包還是可以被傳送,這一點必須注意。
結語
覺得很複雜嗎?撥接導向路由的設定比以前筆者所介紹的任何主題都稍微複雜一點,因為撥接導向路由技術牽扯的概念層面比較廣泛,到目前為止,筆者所介紹的內容包含廣域網路、ISDN網路、存取控制清單以及靜態路由。因為筆者考量到本專欄的讀者群包含各種程度,因此,每一篇文章在內容製作上,都可以獨立閱讀並參考,至少不會讓讀者閱讀起來有不連續的感覺,或是技術上有困難之處。在下一期本專欄的文章中,將會介紹撥接導向路由設定的最後一個步驟。