戰(zhàn)指南:從原理到排錯)
1. 從一次“意外”的網(wǎng)絡(luò)中斷說起為什么需要ACL那天下午辦公室的網(wǎng)絡(luò)突然變得異常緩慢部分同事甚至無法訪問內(nèi)部的文件服務(wù)器。作為網(wǎng)絡(luò)管理員我第一時間登錄核心路由器查看日志發(fā)現(xiàn)CPU利用率間歇性飆升大量來自外部網(wǎng)絡(luò)的ICMP和UDP小包正在沖擊我們的邊界接口。這顯然不是正常的業(yè)務(wù)流量。在沒有部署專業(yè)防火墻的早期網(wǎng)絡(luò)架構(gòu)里邊界路由器就是第一道防線。我立刻想到了那個最基礎(chǔ)也最強(qiáng)大的工具——訪問控制列表。在思科路由器上一條精準(zhǔn)的access-list命令配合正確的接口應(yīng)用方向幾分鐘內(nèi)就阻斷了這些異常流量網(wǎng)絡(luò)隨即恢復(fù)正常。這次經(jīng)歷讓我再次深刻體會到無論網(wǎng)絡(luò)技術(shù)如何演進(jìn)ACL作為網(wǎng)絡(luò)訪問控制的基石其重要性從未減弱。它不僅是安全策略的體現(xiàn)更是網(wǎng)絡(luò)管理員手中一把鋒利的手術(shù)刀用于精確地管理流量保障網(wǎng)絡(luò)健康。簡單來說ACL就是一套寫在網(wǎng)絡(luò)設(shè)備路由器、交換機(jī)上的規(guī)則列表用于告訴設(shè)備什么樣的數(shù)據(jù)包可以通過什么樣的數(shù)據(jù)包應(yīng)該被丟棄。你可以把它想象成大樓的保安手中的訪客名單名單上明確了誰可以進(jìn)入誰不能進(jìn)入以及可以從哪個門接口進(jìn)入或離開。對于任何學(xué)習(xí)思科網(wǎng)絡(luò)技術(shù)、準(zhǔn)備CCNA認(rèn)證或是需要管理企業(yè)網(wǎng)絡(luò)的朋友來說深入理解并熟練配置ACL是一項(xiàng)必備的核心技能。本文將拋開枯燥的理論手冊結(jié)合我多年在真實(shí)網(wǎng)絡(luò)環(huán)境中排錯和設(shè)計(jì)的經(jīng)驗(yàn)帶你徹底搞懂思科路由器上access-list命令的每一個細(xì)節(jié)、使用場景和那些容易踩坑的地方。2. ACL的核心類型與編號規(guī)則標(biāo)準(zhǔn)與擴(kuò)展的抉擇在思科IOS中ACL主要分為兩大類標(biāo)準(zhǔn)ACL和擴(kuò)展ACL。這個分類直接決定了你能控制流量的精細(xì)程度選錯了類型要么無法實(shí)現(xiàn)需求要么會帶來不必要的安全風(fēng)險。2.1 標(biāo)準(zhǔn)ACL簡單的源地址過濾器標(biāo)準(zhǔn)ACL的編號范圍是1-99和1300-1999。它只根據(jù)數(shù)據(jù)包的源IP地址來進(jìn)行允許或拒絕的判斷。它的命令格式非常簡潔access-list 編號 {permit | deny} 源地址 [通配符掩碼]這里的“通配符掩碼”是理解ACL的關(guān)鍵也是新手最容易混淆的概念。它和子網(wǎng)掩碼類似但邏輯相反0表示“必須匹配”1表示“忽略”。例如0.0.0.255意味著前24位三個0必須精確匹配最后8位255可以是任意值。這通常用來匹配一個網(wǎng)段。一個經(jīng)典場景假設(shè)你的網(wǎng)絡(luò)是192.168.1.0/24你想禁止其中一個主機(jī)192.168.1.100訪問互聯(lián)網(wǎng)但允許其他所有主機(jī)訪問。標(biāo)準(zhǔn)ACL可以這樣寫access-list 10 deny host 192.168.1.100 access-list 10 permit 192.168.1.0 0.0.0.255注意ACL的匹配順序是自上而下的設(shè)備會從第一條開始逐條比對一旦匹配就執(zhí)行動作并停止后續(xù)規(guī)則的檢查。因此必須把更具體的規(guī)則如拒絕單個主機(jī)放在前面把更通用的規(guī)則如允許整個網(wǎng)段放在后面。這是ACL配置的鐵律。注意標(biāo)準(zhǔn)ACL因?yàn)橹粰z查源地址控制粒度太粗通常建議盡量靠近目的端應(yīng)用。如果放在離源地址近的位置可能會無意中阻斷該源地址訪問其他合法目標(biāo)。例如上述ACL如果應(yīng)用在離192.168.1.100近的接口出方向會阻止它訪問任何地方而不僅僅是互聯(lián)網(wǎng)。2.2 擴(kuò)展ACL全方位的流量交警當(dāng)你的需求超越“誰發(fā)來的”而深入到“誰發(fā)給誰、用什么服務(wù)”時就需要擴(kuò)展ACL了。它的編號范圍是100-199和2000-2699。擴(kuò)展ACL可以檢查以下五元組信息源IP地址目的IP地址協(xié)議類型如IP、TCP、UDP、ICMP源端口號僅TCP/UDP目的端口號僅TCP/UDP其基本命令格式如下access-list 編號 {permit | deny} 協(xié)議 源地址 源通配符 [源端口] 目的地址 目的通配符 [目的端口]端口操作符是另一個關(guān)鍵點(diǎn)eq等于、gt大于、lt小于、range范圍。例如eq 80匹配80端口range 20 21匹配20和21端口。實(shí)戰(zhàn)案例假設(shè)你需要允許內(nèi)網(wǎng)網(wǎng)段10.1.1.0/24訪問外部Web服務(wù)器TCP 80/443但禁止他們使用FTPTCP 21和TelnetTCP 23協(xié)議。同時允許網(wǎng)絡(luò)管理員主機(jī)10.1.1.250可以使用任何服務(wù)進(jìn)行管理。access-list 110 permit tcp 10.1.1.0 0.0.0.255 any eq 80 access-list 110 permit tcp 10.1.1.0 0.0.0.255 any eq 443 access-list 110 permit ip host 10.1.1.250 any ! 管理員主機(jī)放行所有IP流量 access-list 110 deny tcp 10.1.1.0 0.0.0.255 any eq 21 access-list 110 deny tcp 10.1.1.0 0.0.0.255 any eq 23 access-list 110 permit ip any any ! 隱含拒絕語句前的“放行其他”這里有一個至關(guān)重要的細(xì)節(jié)每一條ACL末尾都有一條看不見的“隱含拒絕所有”deny ip any any。如果你不在最后明確寫一條permit any那么所有未被前面規(guī)則明確允許的流量都會被靜默丟棄。很多網(wǎng)絡(luò)不通的故障根源就在于忘記了這條隱含規(guī)則。因此養(yǎng)成在測試階段最后加一條permit ip any any的習(xí)慣排查后再根據(jù)安全需求決定是否刪除或收緊是一個非常好的實(shí)踐。擴(kuò)展ACL的控制粒度精細(xì)因此建議盡量靠近源端應(yīng)用這樣可以盡早丟棄非法流量避免無效流量占用寶貴的廣域網(wǎng)帶寬和設(shè)備處理資源。3. 命名ACL與時間ACL進(jìn)階管理技巧除了編號ACL思科還支持命名ACL這大大提升了管理的便利性。3.1 命名ACL的配置與管理命名ACL使用一個描述性的名字代替數(shù)字編號并且允許你插入或刪除特定的某一行而編號ACL只能整體刪除重建。這對于維護(hù)大型ACL來說是天壤之別。 配置命名擴(kuò)展ACL的步驟ip access-list extended INTERNET-FILTER ! 創(chuàng)建一個名為INTERNET-FILTER的擴(kuò)展ACL permit tcp 192.168.10.0 0.0.0.255 any eq www deny udp any any eq 1434 ! 阻止SQL Slammer蠕蟲端口 permit icmp any any echo-reply ! 只允許ping的回包不允許主動ping出去 permit ip any any如果你想在第一條之后插入一條新規(guī)則可以ip access-list extended INTERNET-FILTER 15 deny tcp any any eq 3389 ! 指定序列號15這條規(guī)則會插在默認(rèn)序列號10和20之間使用show access-lists INTERNET-FILTER可以看到每條規(guī)則前面的序列號方便進(jìn)行精準(zhǔn)編輯。3.2. 基于時間的ACL策略網(wǎng)絡(luò)策略并非總是全天候不變的。例如你希望在工作時間周一至周五9:00-18:00禁止訪問視頻網(wǎng)站而在休息時間放開。這時就需要時間ACL。 首先定義一個時間范圍time-range WORK-HOURS periodic weekdays 9:00 to 18:00然后在ACL中引用這個時間范圍ip access-list extended WEB-POLICY deny tcp 10.0.0.0 0.255.255.255 any eq 443 time-range WORK-HOURS permit ip any any這樣該條拒絕規(guī)則只在WORK-HOURS定義的時間段內(nèi)生效。你可以使用absolute關(guān)鍵字來設(shè)置絕對時間如從某年某月某日到某年某月某日實(shí)現(xiàn)更復(fù)雜的調(diào)度。時間ACL是實(shí)現(xiàn)靈活安全策略的利器但在配置時務(wù)必注意設(shè)備的系統(tǒng)時間是否準(zhǔn)確最好配置NTP否則策略會錯亂。4. ACL的部署實(shí)戰(zhàn)Inbound與Outbound的玄機(jī)創(chuàng)建好ACL后必須將其應(yīng)用在接口的特定方向上才能生效。這個“方向”是相對于路由器接口而言的是ACL配置中最容易出錯的地方之一。4.1 Inbound與Outbound的準(zhǔn)確定義Inbound (入方向)數(shù)據(jù)包進(jìn)入路由器該接口的方向。ACL將在此接口上對接收到的數(shù)據(jù)包進(jìn)行檢查。Outbound (出方向)數(shù)據(jù)包離開路由器該接口的方向。ACL將在此接口上對要從此接口發(fā)送出去的數(shù)據(jù)包進(jìn)行檢查。一個簡單的記憶方法是站在路由器的“肩膀”上面朝接口外部。從外面來的就是Inbound從里面出去的就是Outbound。4.2 接口應(yīng)用配置與流量路徑分析應(yīng)用命令如下interface GigabitEthernet0/0 ip access-group 110 in ! 將ACL 110應(yīng)用在Gi0/0接口的入方向 ! 或 ip access-group 110 out ! 將ACL 110應(yīng)用在Gi0/0接口的出方向讓我們通過一個經(jīng)典拓?fù)鋪砝斫庖慌_路由器內(nèi)網(wǎng)接口Gi0/0IP: 192.168.1.1/24連接公司局域網(wǎng)外網(wǎng)接口Gi0/1IP: 203.0.113.1/30連接互聯(lián)網(wǎng)。場景一阻止內(nèi)網(wǎng)特定主機(jī)上網(wǎng)錯誤做法在Gi0/0的out方向應(yīng)用一個拒絕該主機(jī)源地址的ACL。這會導(dǎo)致該主機(jī)發(fā)往路由器本身比如管理IP的流量也被拒絕因?yàn)槿ネ酚善鞅镜谿i0/0接口IP的流量對于Gi0/0接口來說也是out方向。正確做法在Gi0/0的in方向應(yīng)用ACL。當(dāng)該主機(jī)發(fā)出的數(shù)據(jù)包進(jìn)入Gi0/0接口時就被過濾掉根本不會進(jìn)入路由器的處理流程。場景二阻止外部網(wǎng)絡(luò)ping通公司服務(wù)器192.168.1.100錯誤做法在Gi0/0的in方向應(yīng)用拒絕ICMP到該服務(wù)器的ACL。這無法生效因?yàn)橥獠縫ing包是從Gi0/1接口進(jìn)入的。正確做法在Gi0/1的in方向應(yīng)用擴(kuò)展ACLdeny icmp any host 192.168.1.100。或者在Gi0/0的out方向應(yīng)用因?yàn)閺耐獠康椒?wù)器的回包在離開Gi0/0接口去往服務(wù)器時會被檢查。一個黃金法則為了簡化思考和減少錯誤盡量在離源地址最近的接口的入方向in應(yīng)用ACL。這樣非法流量在進(jìn)入設(shè)備的最初時刻就被丟棄最節(jié)省設(shè)備資源。5. 高級特性與排錯指南5.1 記錄日志與匹配計(jì)數(shù)器在ACL條目的末尾加上log或log-input關(guān)鍵字可以讓路由器在匹配該規(guī)則時生成日志消息。log-input還會記錄數(shù)據(jù)包進(jìn)入的接口和源MAC地址信息更豐富。這對于監(jiān)控和排錯極其有用。access-list 150 deny tcp any any eq 23 log配置后你可以通過show logging或show access-lists來查看匹配計(jì)數(shù)器和日志。show access-lists命令會顯示每條規(guī)則被命中的次數(shù)這是判斷ACL是否生效、策略是否符合預(yù)期的第一手?jǐn)?shù)據(jù)。如果某條你認(rèn)為該被觸發(fā)的deny規(guī)則計(jì)數(shù)器始終為0那很可能意味著流量被前面某條規(guī)則匹配了或者流量根本就沒走到這個檢查點(diǎn)。5.2 常見排錯流程與實(shí)戰(zhàn)案例當(dāng)配置了ACL后網(wǎng)絡(luò)出現(xiàn)異常可以遵循以下步驟排查確認(rèn)ACL是否已正確應(yīng)用show ip interface GigabitEthernet0/0查看輸出中是否有Inbound access list is 110之類的信息。查看ACL匹配計(jì)數(shù)器show access-lists 110。這是最關(guān)鍵的一步。關(guān)注計(jì)數(shù)器的變化。如果相關(guān)規(guī)則的計(jì)數(shù)器在增加說明ACL生效且匹配了流量。如果計(jì)數(shù)器不增加要么是流量路徑不對沒經(jīng)過應(yīng)用了ACL的接口/方向要么是流量特征與ACL規(guī)則不匹配比如端口號不對、協(xié)議不對。檢查ACL規(guī)則順序和邏輯逐條審視規(guī)則。記住“自上而下首次匹配”。一個常見的錯誤是在一條寬松的permit any any后面又添加了具體的deny規(guī)則后面的deny永遠(yuǎn)不生效。驗(yàn)證通配符掩碼確認(rèn)你寫的通配符掩碼是否真的匹配了你意圖中的網(wǎng)段。host 192.168.1.1等價于192.168.1.1 0.0.0.0。any等價于0.0.0.0 255.255.255.255。考慮路由因素ACL只能過濾經(jīng)過路由器的流量。如果數(shù)據(jù)包的目的地就是路由器本身比如Telnet到路由器那么只有入方向in的ACL能過濾它。如果數(shù)據(jù)包是被路由器轉(zhuǎn)發(fā)的那么入方向和出方向的ACL都可能過濾它取決于應(yīng)用位置。實(shí)戰(zhàn)排錯案例用戶報(bào)告無法從子網(wǎng)A10.1.1.0/24訪問子網(wǎng)B10.2.2.0/24的Web服務(wù)器。中間經(jīng)過一臺路由器。排查在路由器上show access-lists發(fā)現(xiàn)應(yīng)用在子網(wǎng)A所在接口入方向的ACL中有一條permit tcp 10.1.1.0 0.0.0.255 any eq 80計(jì)數(shù)器在增加。這說明HTTP請求包已經(jīng)通過。但問題依舊于是考慮可能是返回的流量被過濾。檢查子網(wǎng)B所在接口的ACL發(fā)現(xiàn)出方向有一條deny tcp any any eq 80本意是阻止外部訪問但寫錯了方向或地址。服務(wù)器返回的HTTP響應(yīng)源端口80匹配了這條規(guī)則被拒絕。教訓(xùn)配置ACL時必須雙向考慮流量。特別是對于TCP協(xié)議一個會話有“去”和“回”兩個方向的流量。通常我們只控制發(fā)起方向的端口如客戶端到服務(wù)器的目標(biāo)端口80而對返回的流量服務(wù)器到客戶端源端口80目標(biāo)端口是隨機(jī)高端口應(yīng)該放行。更安全的做法是使用established關(guān)鍵字它只匹配TCP報(bào)文頭中ACK或RST標(biāo)志置位的包即響應(yīng)報(bào)文。5.3 使用established關(guān)鍵字簡化策略對于TCP協(xié)議established關(guān)鍵字是一個非常實(shí)用的工具。它允許你只放行那些作為已建立會話一部分的返回流量。access-list 120 permit tcp any any established access-list 120 permit tcp 10.0.0.0 0.255.255.255 any eq 80 access-list 120 permit tcp 10.0.0.0 0.255.255.255 any eq 443這條ACL的邏輯是首先允許所有已建立的TCP連接返回的流量這保證了內(nèi)網(wǎng)發(fā)起的請求能得到回應(yīng)。然后允許內(nèi)網(wǎng)發(fā)起HTTP和HTTPS請求。這樣外部網(wǎng)絡(luò)就無法主動向內(nèi)網(wǎng)發(fā)起新的TCP連接大大增強(qiáng)了安全性。這是一種簡單的狀態(tài)檢測模擬。6. ACL的局限性與最佳實(shí)踐盡管ACL功能強(qiáng)大但它并非萬能也有其局限性無狀態(tài)性傳統(tǒng)ACL是無狀態(tài)的除了established這種取巧方法。它單獨(dú)檢查每一個數(shù)據(jù)包而不理解整個會話上下文?,F(xiàn)代防火墻的狀態(tài)檢測是更優(yōu)的選擇。性能影響ACL條目越多且應(yīng)用在高速接口上對路由器CPU的負(fù)擔(dān)就越重。長列表的ACL會影響轉(zhuǎn)發(fā)性能。無法深度檢測ACL只能基于IP頭部和TCP/UDP頭部信息進(jìn)行過濾無法檢測應(yīng)用層載荷如HTTP內(nèi)容、病毒特征。因此在現(xiàn)代網(wǎng)絡(luò)設(shè)計(jì)中ACL的最佳實(shí)踐是明確的安全邊界在網(wǎng)絡(luò)的信任邊界如內(nèi)網(wǎng)與外網(wǎng)之間使用擴(kuò)展ACL實(shí)施基礎(chǔ)防護(hù)。配合專業(yè)防火墻ACL作為防火墻策略的補(bǔ)充或在沒有防火墻的設(shè)備上提供基礎(chǔ)安全。控制管理訪問使用標(biāo)準(zhǔn)或擴(kuò)展ACL限制對網(wǎng)絡(luò)設(shè)備VTY線路、SNMP社區(qū)名的管理訪問這是最基本的安全加固。文檔與注釋為復(fù)雜的命名ACL條目添加注釋使用remark關(guān)鍵字說明每條規(guī)則的目的便于后期維護(hù)。定期審計(jì)定期使用show access-lists查看計(jì)數(shù)器分析流量模式清理從未被匹配的“僵尸規(guī)則”優(yōu)化ACL性能。ACL是思科網(wǎng)絡(luò)世界的語法基礎(chǔ)之一它的邏輯直接、強(qiáng)大。掌握它不僅是為了通過認(rèn)證考試更是為了在真實(shí)的網(wǎng)絡(luò)故障面前能快速、準(zhǔn)確地?fù)]舞這把手術(shù)刀切除網(wǎng)絡(luò)中的“病灶”。配置時多問自己幾個問題流量從哪里來到哪里去我是在哪個接口的哪個方向進(jìn)行過濾我的規(guī)則順序是否合理隱含拒絕會不會誤傷正常流量帶著這些問題去實(shí)踐你就能從ACL的“使用者”變?yōu)椤榜{馭者”。