一種“多才多藝”的網絡工具——訪問控制列表(ACL)
外圍路由器、防火墻和內部路由器
在大中型企業網絡中,通常采用外圍路由器、內部路由器和防火墻的配置來實現各種安全策略。
內部路由器對前往企業網絡中受保護部分的數據流進行過濾,以進一步提高安全, 這是通過使用訪問控制列表實現的。圖12-1說明了這些設備所處的位置。
我將頻繁地使用術語可信網絡( trusted network)和不可信網絡( untrustednetwork ),因此必須知道它們位于典型的安全網絡的什么地方,這很重要。非軍事區(DMZ)可能是全局因特網地址,也可能是私有地址,這取決于如何配置防火墻,非軍事區通常包含HTTP、DNS、電子郵件和其他與因特網相關的企業服務器。
我們知道,在可信網絡內部,可不使用路由器,而結合使用虛擬局域網(VLAN)和交換機。多層交換機內置了安全功能,可替代內部路由器在VLAN架構中提供較高的性能。
下面介紹一些使用訪問控制列表保護互聯網絡的方式。
訪問控制列表簡介
從本質上說,訪問控制列表是一-系列對分組進行分類的條件,它在需要控制網絡數據流時很有用。在這些情況下,可將訪問控制列表用作決策工具。訪問控制列表最常見也是最容易理解的用途之一是, 將有害的分組過濾掉以實現安全策略。例如,可使用訪向控制列表來作出非常具體的數據流控制決策,只允許某些主機訪問因特網上的Web資源。通過正確地組合使用多個訪問控制列表,網絡管理員幾乎能夠實施任何能想到的安全策略。
創建訪問控制列表相當于編寫一系列if-then 語句一如果滿 足給定的條件,就采取給定的措施;如果不滿足,則不采取任何措施,而繼續評估下一條語句。訪問控制列表語句相當于分組過濾器,根據它對分組進行比較、分類,并采取相應的措施。創建訪問控制列表后,就可將其應用于任何接口的人站或出站數據流。訪問控制列表被應用于接口后,路由器將對沿指定方向穿越該接口的每個分組進行分析,并采取相應的措施。
將分組同訪問控制列表進行比較時,需要遵守一些重要規則。
- 總是按順序將分組與訪問控制列表的每一行進行比較,即總是首先與訪問控制列表的第行進行比較,然后是第二行和第三行,以此類推。
- 不斷比較,直到滿足條件為止。在訪問控制列表中,找到分組滿足的條件后,對分組采取相應的措施,且不再進行比較。
- 每個訪問控制列表末尾都有一條隱式的 deny語句,這意味著如果不滿足訪問控制列表中任何行的條件,分組將被丟棄。
使用訪問控制列表過濾IP分組時,上述每條規則都將帶來深遠的影響;要創建出有效的訪問控制列表,必須經過一段時間的練習。
訪問控制列表分兩大類:
- 標準訪問控制列表 它們只將分組的源IP地址用作測試條件,所有的決策都是根據源IP地址作出的。這意味著標準訪問控制列表要么允許要么拒絕整個協議族,它們不區分IP數據流類型(如Web.Telnet、UDP等)。
- 擴展訪問控制列表它們能夠檢查 IP分組第3層和第4層報頭中的眾多其他字段。它們能夠檢查源IP地址、目標IP地址、網絡層報頭的協議( Protocol )字段、傳輸層報頭中的端口號。這讓擴展訪問列表能夠做出更細致的數據流控制決策。
- 命名訪問控制列表 且慢! 前面不是說只有兩類嗎?怎么這里列出了三類呢?從技術上說,確實只有兩類,因為命名訪問控制列表要么是標準的,要么是擴展的,并非一種新類型。這里之所以專門列出它,是因為這種訪問控制列表的創建和引用方式不同于標準和擴展訪問控制列表,但功能是相同的。
創建訪問控制列表后,除非將其應用于接口,否則它不能發揮任何作用。此時訪問控制列表確實包含在路由器配置中,但除非告訴路由器使用它來做什么,否則它處于非活動狀態。
要將訪問控制列表用作分組過濾器,需要將其應用于要進行數據流過濾的路由器接口。還必須指定要使用訪問控制列表來過濾哪個方向的數據流,這種要求有充分的理由:對于從企業網絡前往因特網的數據流和從因特網進人企業網絡的數據流,你可能想采取不同的控制措施。通過指定數據流的方向,可以(也經常需要)在同一個接口上將不同的訪問控制列表用于人站和出站數據流。
- 入站訪問控制列表 將訪問控制列表應用于 入站分組時,將根據訪問控制列表對這些分組進行處理,然后再將其路由到出站接口。遭到拒絕的分組不會被路由,因為在調用路由選擇進程前,它們已被丟棄。
- 出站訪問控制列表 將訪問控制列表應用 于出站分組時,分組將首先被路由到出站接口,然后再將分組排隊前根據訪問控制列表對其進行處理。
在路由器上創建和實現訪問控制列表時,應遵守一些通用的指導原則:
- 在接口的特定方向上,每種協議只能有一個訪問控制列表。這意味著應用IP訪問控制列表時,每個接口上只能有一個人站訪問控制列表和一個出站訪問控制列表。
注意:考慮到每個訪問控制列表末尾的隱式deny語句帶來的影響,不允許在接口的特定方向對特定協議應用多個訪問控制列表是有道理的。鑒于不滿足第一個訪問控制列表中任何條件的分組都將被拒絕,因此不會有任何分組需要與第二個訪問控制列表進行比較。
- 在訪問控制列表中,將具體的測試條件放在前面。
- 新增的語句將放在訪問控制列表的末尾。強烈建議使用文本編輯器來編輯訪問控制列表。
- 不能僅刪除訪問控制列表中的一行,如果試圖這樣做,將刪除整個訪問控制列表。要編輯訪問控制列表,最好先將其復制到文本編輯器中。使用命名訪問控制列表是唯一的例外。
注意:對于命名訪問控制列表,可編輯、添加或刪除特定行,稍后將演示這一點。
- 除非訪問控制列表以permit any命令結尾,否則不滿足任何條件的分組都將被丟棄。訪問控制列表至少應包含注意一條 permit語句,否則它將拒絕所有的數據流。
- 創建訪問控制列表后應將其應用于接口。如果訪問控制列表沒有包含任何測試條件,即使其應用于接口,它也不會過濾數據流。
- 訪問控制列表用于過濾穿越路由器的數據流;它們不會對始發于當前路由器的數據流進行過濾。
- 應將IP標準訪問控制列表放在離目的地盡可能近的地方,這就是我們不想在網絡中使用標準訪問控制列表的原因。不能將標準訪問控制列表放在離源主機或源網絡很近的地方,因為它只能根據源地址進行過濾,這將影響所有的目的地。
- 將IP擴展訪問控制列表放在離信源盡可能近的地方。擴展訪向控制列表可根據非常具體的地址和協議進行過濾,我們不希望數據流穿越整個網絡后,最終卻被拒絕。將這種訪問控制列表放在離信源盡可能近的地方,可在一開始就將數據流過濾掉,以免它占用寶貴的帶寬。
介紹如何配置標準和擴展訪問控制列表前,先來討論如何使用ACL緩解前面討論的安全威脅。
使用ACL緩解安全威脅:
- IP地址欺騙(人站);
- IP地址欺騙(出站);
- 拒絕服務( DoS) TCP SYN攻擊(阻斷外部攻擊);
- DoSTCPSYN攻擊(使用TCP攔截);
- DoS smurf攻擊;
- 拒絕/過濾ICMP消息(人站);
- 拒絕/過濾ICMP消息(出站);
- 拒絕/過濾traceroute。
標準訪問控制列表
標準IP訪問控制列表通過查看分組的源IP地址來過濾網絡數據流。創建標準IP訪問控制列表時,使用訪問控制列表編號1~99或1300~ 1999 (擴展范圍)。通常使用編號來區分訪問控制列表的類型。根據創建訪問控制列表時使用的編號,路由器知道輸入時應使用什么樣的語法。編號1~99或1300~1999,告訴路由器要創建一個標準IP訪問控制列表,而路由器要求只將源IP地址用作測試條件。
下面列出了過濾網絡數據流時,可使用的眾多訪問控制列表編號范圍(可為哪些協議指定訪問控制列表取決于你使用的IOS版本):
下面來看創建標準訪問控制列表的語法:
前面說過,使用訪問控制列表編號1~99或1300~ 1999,就相當于告訴路由器你要創建一個標準IP訪問控制列表。
指定訪問控制列表編號后,需要決定是要創建permit語句還是deny語句。在這個例子中,我們創建一條deny語句:
接下來的一步需要做更詳細的解釋。有3個選項可供選擇。可使用參數any允許或拒絕任何源主機(網絡),可使用一個IP地址來指定單臺主機或特定范圍內的主機,還可使用命令host指定特定的主機。命令any的含義顯而易見,它指的是與語句匹配的任何源地址,因此每個分組都與該語句匹配。命令host比較簡單,下面是一個使用它的示例:
這條語句拒絕任何來自172.16.30.2 的分組。默認參數為host,換句話說,如果輸入access-1ist 10 deny 172.16.30.2, 路由器將認為輸人的是access-1ist 10 deny host 172 .16.30.2,且在運行配置中也這樣顯示。但還有另外一種方法可指定特定主機或特定范圍內的主機一使用通配符掩碼。事實上,要指定任何范圍內的主機,必須在訪問控制列表中使用通配符掩碼。什么是通配符掩碼呢?以后小編會介紹的!
通配符掩碼
在訪問控制列表中,可使用通配符來指定特定主機、特定網絡或網絡的一部分。要理解通配符,就必須理解塊大小,它用于指定地址范圍。塊大小包括64、32、16、8和4等。
在需要指定地址范圍時,可使用能滿足需求的最小塊大小。例如,如果需要指定34個網絡,則需要使用塊大小64;如果需要指定18臺主機,則需要使用塊大小32;如果只需指定2個網絡,則使用塊大小4就可以了。
通過結合使用通配符和主機(網絡)地址來告訴路由器要過濾的地址范圍。要指定一臺主機,可使用類似于下面的組合:
- 172.16.30.5 0.0.0.0
其中的4個0分別表示1B。0表示地址中的相應字節必須與指定的地址相同。要指定某個字節可以為任意值,可使用255。例如,下面的示例演示了如何使用通配符掩碼指定一個/24子網:
- 172.16.30.0 0.0.0.255
這告訴路由器,前3 B必須完全相同,而第4個字節可以為任意值。
這很容易。但如果要指定小范圍的子網,該怎么辦呢?此時塊大小便可派上用場了。指定的范圍必須與某個塊大小相同,換句話說,不能指定20個網絡,而只能指定與塊大小相同的范圍,即要么是16,要么是32,但不能是20。
假定要禁止網絡中的一部分(即172.16.8.0~ 172.16.15.0)訪問你的網絡。該范圍對應的塊大小為8,因此,在訪問控制列表中,應指定網絡號172.16.8.0 和通配符掩碼0.0.7.255。這是什么意思呢?路由器根據7.255確定塊大小。上述網絡號和通配符掩碼組合告訴路由器,從172.16.8.0開始,向上數8個(塊大小)網絡,直到網絡172.16.15.0。
這比看起來簡單。我原本可以使用二進制來解釋,但不需要這樣做。實際上,只需記住,通配符掩碼總是比塊大小小1。就這個示例而言,通配符掩碼為7,因為塊大小為8。如果使用的塊大小為16,則通配符掩碼將為15。很容易,不是嗎?
下面將通過一些示例幫助你掌握這一點。下面的示例告訴路由器,前3B必須完全相同,而第4個字節可以是任意值:
- Corp(config)#access-1ist 10 deny 172.16.0.0 0.0.255.255
下面的示例告訴路由器,前2 B必須完全相同,而后2 B可以是任意值:
- Corp(config)#access-1ist 10 deny 172.16.0.0 0.0.255.255
請嘗試配置下面一行:
- Corp(config)#access-list 10 deny 172.16.16.0 0.0.3.255
該配置告訴路由器,從網絡172.16.16.0 開始,并使用塊大小4。因此范圍為172.16.16.0~ 172.16.19.255(CCNA考題與此類似)。
接著練習。下面的配置是什么意思呢?
- Corp(config)#access-1ist 10 deny 172.16.16.0 0.0.7.255
這條語句指出,從網絡172.16.16.0開始,向上數8個(塊大小)網絡,到172.16.23.255結束。為掌握這項知識,還需做更多練習。下面的語句指定的是什么范圍呢?
- Corp(config)#access-1ist 10 deny 172.16.32.0 0.0.15 .255
這條語句指出,從網絡172.16.32.0開始,向上數16個(塊大小)網絡,到172.16.47.255結束。
下面再做幾個練習,然后配置一些ACL。
- Corp(config)#access-1ist 10 deny 172.16.64.0 0.0.63.255
這條語句指出,從網絡172.16.64.0開始,向上數64個(塊大小)網絡,到172.16.127.255結束。
來看最后一個示例:
- Corp(config)#access-1ist 10 deny 192.168.160.0 0.0.31.255
這條語句指出,從網絡192.168.160.0開始,向上數32個(塊大小)網絡,到192.168.191.255結束。
確定塊大小和通配符掩碼時,還需牢記如下兩點:
- 起始位置必須為0或塊大小的整數倍。例如,塊大小為8時,起始位置不能是12。范圍必須是0~7、8~15、 16~23等。而塊大小為32時,范圍必須是0~31、32~63、64~95等。
- 命令any與0.0.0.0 255.255.255.255等價。
注意:通配符掩碼對創建IP訪問控制列表來說很重要,必須掌握。在標準IP訪問控制列表和擴展IP訪問控制列表中,其用法完全相同。
標準訪問控制列表示例
在圖12-2中,路由器有3條LAN連接和1條到因特網的WAN連接。不應讓銷售部LAN的用戶訪問財務部LAN,但應允許他們訪問因特網和市場營銷部的文件。市場營銷部的用戶需要能夠訪問財務部LAN,以使用其應用程序服務。
在圖中的路由器上,配置如下標準IP訪問控制列表:
命令any與0.0.0.0 255.255.255.255等價,如下所示:
- Lab_ A(config)#access-1ist 10 permit 0.0.0.0 255.255 .255.255
該通配符掩碼指出,不用考慮任何一個字節,因此所有地址都滿足這個測試條件。這與使用關鍵字any等價。
當前,該訪問控制列表禁止任何來自銷售部LAN的分組進人財務部LAN,但允許其他所有分組進入。別忘了,除非將訪問控制列表應用于接口的特定方向,否則它不會發揮任何作用。
應將該訪問控制列表放在什么地方呢?如果將其作為人站訪問控制列表應用于接口fa0/0, 還不如
關閉這個快速以太網接口呢!因為這將導致銷售部LAN中的所有設備都無法訪問與該路由器相連的任何網絡。最佳的選擇是,將其作為出站訪問控制列表應用于接口fa0/1:
- Lab_ A(config)#int fa0/1
- Lab_ A(config-if)#ip access-group 10 out
這就完全禁止了來自172.16.40.0 的數據流從接口fa0/1 傳輸出去。它不會影響銷售部LAN的主機訪向市場營銷部LAN和因特網,因為前往這些目的地的數據流不會經過接口fa0/1。任何試圖從接口fa0/1出去的分組都將首先經過該訪問控制列表。如果在接口fa0/0 上應用了入站訪問控制列表,則任何試圖進人該接口的分組都將首先經過這個訪問控制列表,然后才被路由到出站接口。
下面來看另一個標準訪問控制列表示例。在圖12-3所示的互聯網絡中,有2臺路由器、3個LAN和1條串行WAN連接。
你想通過使用一個標準ACL,禁止財務部的用戶訪問與路由器Lab_B相連的人力資源服務器,但允許其他用戶訪問該LAN。應該創建什么樣的標準訪問控制列表?將它放在哪里呢?
準確的答案是,應該創建一個擴展訪問控制列表,并將其放在離信源最近的地方,但這里要求你使用標準訪問控制列表。根據經驗規則,標準訪問控制列表應放在離目的地最近的地方,這里是路由器Lab_B的接口E0。下面是應在路由器Lab_B上配置的訪問控制列表:
為回答這個問題,必須理解子網劃分、通配符掩碼以及如何配置和實現ACL。我想你還需多做這方面的練習。
因此,介紹如何限制以Telnet方式訪問路由器前,再來看一個標準訪向控制列表示例,這個示例要求你更深人地思考。在圖12-4中,一臺路由器有4條LAN連接,還有1條到因特網的WAN連接。
編寫一個訪問控制列表,禁止圖中所示的4個LAN訪問因特網。對于圖中的每個LAN,都列出了其中一臺主機的IP地址,據此確定在訪問控制列表中指定每個LAN時應使用的子網地址和通配符掩碼。
答案應類似于下面這樣(-次指定了E0~E3連接的子網):
當然,也可以只使用下面一行:
- Router(config)#access-1ist 1 deny 172.16.0.0 0.0.255 .255
但這樣做有什么意思呢?
創建這個訪問控制列表的目的是什么?如果在路由器上應用這個訪問控制列表,就等于完全禁止訪問因特網了,那還要因特網連接做什么?.這里提供這個示例旨在讓你練習在訪問控制列表中使用塊大小,這對你備考CCNA至關重要。
控制 VTY (Telnet/SSH) 訪問
對于大型路由器,要禁止用戶以Telnet 或SSH方式訪問它可能很難,因為每個活動接口都允許VTY訪問。可創建一個擴展IP訪問控制列表,禁止訪問路由器的每個地址。但如果真的這樣做,必須將其應用于每個接口的人站方向,對于有數十甚至數百個接口的大型路由器來說,這種解決方案的可擴展性太低了。另外,如果每臺路由器都對每個分組進行檢查,以防它訪問VTY線路,導致的網絡延遲將很大。
一種好得多的解決方案是,使用標準IP訪問控制列表來控制對VTY線路的訪問。
這種解決方案為何可行呢?因為將訪問控制列表應用于VTY線路時,不需要指定協議一訪問VTY就意味著以Telnet 或SSH方式訪問終端。也不需要指定目標地址,因為你不關心用戶將哪個接口的地址用作Telnet會話的目標。你只需控制用戶來自何方一他們的源 IP地址。要實現這項功能,請執行如下步驟:
- 創建一個標準IP訪問控制列表,它只允許你希望的主機遠程登錄到路由器。
- 使用命令access-class in將該訪問控制列表應用于VTY線路。
下面的示例只允許主機172.16.10.3遠程登錄到路由器:
- Lab_ A(config)#access-1ist 50 permit host 172.16.10.3
- Lab_ A(config)#line vty 0 4
- Lab_ A(config-line)#access-class 50 in
由于訪問控制列表末尾有一條隱式的deny any語句,因此除172.16.10.3外的其他任何主機都不能遠程登錄到該路由器,而不管它將路由器的哪個IP地址用作目標。你可能想將源地址指定為管理員所屬的子網,而不是單臺主機;但下面的示例演示了如何在不增加路由器延遲的情況下確保VTY線路的安全。
真實案例:應保護路由器的VTY線路嗎?
使用命令show users對網絡進行監視時,發現有人遠程登錄到了你的核心路由器。此時,你使用命令disconnect斷開了他到該路由器的連接,但發現幾分鐘后他又連接到了該路由器。因此,你想在該路由器的接口上放置一個訪問控制列表,但又不想給每個接口增加過多的延遲,因為該路由器處理的分組已經很多了。你想將一個訪問控制列表應用于VTY線路本身,但以前沒有這樣做過,不知道這種解決方案能否取得與將訪問控制列表應用于每個接口相同的效果。就這個網絡而言,將訪問控制列表應用于VTY線路是個好主意嗎?
絕對是個好主意,可使用本章前面介紹的命令access-class。為什么呢?因為這可避免使用訪問控制列衣對進出接口的每個分組進行檢查,而這樣做會增加路由分組的開銷。在VTY線路上配置命令access-class in時,只會檢查并比較進入路由器的Telnet分組。這提供了一種完美而又易于配置的安全解決方案。
注意:思科建議使用Secure Shell ( SSH )而不是Telnet 來訪問路由器的VTY線路。