大家從圖中可以看出,標準ACL只檢查數(shù)據(jù)包中的源地址,至于數(shù)據(jù)幀頭是HDLC,數(shù)據(jù)報頭是TCP,標準ACL統(tǒng)統(tǒng)不管,就認一個源IP頭,也就是說標準ACL只會檢查IP數(shù)據(jù)包的源地址,然后根據(jù)是否滿足條件來決定是允許還是拒絕整個協(xié)議集。
擴展ACL,如下圖所示:
擴展ACL
擴展ACL比標準ACL檢查的東西要多,檢查源地址、目的地址、協(xié)議以及相應(yīng)端口;即擴展ACL可以結(jié)合這四個參數(shù)來決定是允許還是拒絕某個特殊的協(xié)議如TCP,UDP,ICMP等等。所以擴展ACL的功能比標準ACL的功能要強!
那么如何定義標準或者是擴展ACL呢?
ACL的定義可以分為兩類:1 使用數(shù)字號碼范圍來定義 2 使用名字來定義
1 使用數(shù)字號碼范圍定義:
標準ACL的范圍是1-99 ,擴展范圍1300-1999
擴展ACL范圍是100-1999,擴展范圍2000-2699
在此為什么使用擴展范圍呢,主要是因為現(xiàn)在的網(wǎng)絡(luò)規(guī)模和網(wǎng)絡(luò)的復(fù)雜性都在增加,原來的號碼范圍可能已經(jīng)不能滿足需要,所以推出擴展范圍。
2 使用名字來定義
我們前面所介紹的標準ACL還是擴展ACL有一個使用起來很不方便的地方,就是如果在設(shè)置ACL的時候,如果發(fā)現(xiàn)中間有某個設(shè)置的不正確,希望刪除某一條,是做不到的,那么就可以使用命名ACL,可以為每個ACL定義一個形象的名字。好處是可以對ACL中的每一個具體的規(guī)則進行處理,但如果是使用數(shù)字的話,只能是刪除全部規(guī)則,不能刪除其中一個規(guī)則。這樣的話在大型網(wǎng)絡(luò)中就不是很方便,而使用命名ACL可以解決這個問題:語法也很簡單:
(config)# ip access-list extended/standared dufei 注意:標準和擴展都可以創(chuàng)建命名ACL
然后在創(chuàng)建規(guī)則:如
Permit 10.10.10.10 0.0.0.0
Perimit 20.20.20.20. 0.0.0.0
Deny 30.30.30.30 0.0.0.0
那如果我們希望刪除其中一個如 第一個,則使用 no permit 10.10.10.10 0.0.0.0即可,其他的仍然存在。
訪問控制列表還涉及到一個進站和出站的問題,也就是數(shù)據(jù)包的流向是進方向還是出方向。當(dāng)然是進還是出要看具體情況,有的時候可以應(yīng)用在任何一個上面。有的時候就必須唯一確定。
我們看一下出站方向上的ACL應(yīng)用,我們還是從一個圖入手,如下圖所示:
ACL應(yīng)用
分析:
1 數(shù)據(jù)包通過入站接口進入路由器,此時開始查找路由表中是否有匹配的路由條目,如果 沒有,則直接將其丟棄。這一步和ACL還沒有任何關(guān)系,只是沒有相應(yīng)路由,就無法轉(zhuǎn)發(fā)數(shù)據(jù)包,所以在此也需要說明一點,ACL也必須在數(shù)據(jù)包能夠被路由的基礎(chǔ)之上才起作用。
2 如果路由表中有相應(yīng)的路由條目才被路由到一個相應(yīng)的接口上。
3 查看該接口是否有ACL的配置,如果沒有則立即被轉(zhuǎn)發(fā),如果設(shè)置了ACL,則檢查該數(shù)據(jù)包是否匹配ACL規(guī)則。如果匹配并規(guī)則中明確該數(shù)據(jù)包可以正常轉(zhuǎn)發(fā)。否則丟棄!注意:如果ACL測試規(guī)則中沒有明確指定數(shù)據(jù)包通過,則說明此數(shù)據(jù)包沒有與相關(guān)的規(guī)則匹配,那么還有一個隱含的規(guī)則就是deny all,這一點和微軟的ISA是一樣的,安裝好防火墻就有一個默認規(guī)則拒絕一切,可以說是“六親不認”!
下面咱們就來細說一下ACL規(guī)則測試,如下圖:
ACL 規(guī)則
如圖所示,在ACL中可以有多個規(guī)則。如圖:假設(shè)在ACL中有三個明確規(guī)則,則數(shù)據(jù)包進入后首先匹配第一個規(guī)則,如果數(shù)據(jù)包匹配該規(guī)則并設(shè)置為permit,則數(shù)據(jù)包被轉(zhuǎn)發(fā),如果數(shù)據(jù)包也匹配該規(guī)則,但卻被設(shè)置為deny,則數(shù)據(jù)包直接被丟棄。
如果第一個規(guī)則不匹配則該數(shù)據(jù)包繼續(xù)向前走,此時再檢查是否匹配第二個規(guī)則,如果匹配并設(shè)置為permit,則該數(shù)據(jù)包被轉(zhuǎn)發(fā),如果匹配但被設(shè)置為deny則被丟棄。
如果第二個規(guī)則也不匹配則繼續(xù)向前走,此時遇到第三個規(guī)則,同時還是檢查是否匹配,如果匹配并設(shè)置為permit,同樣也可以被轉(zhuǎn)發(fā),如果被設(shè)置為deny,則被丟棄。如果第三個是規(guī)則是最后一個,該數(shù)據(jù)包都沒有匹配,
注意:1 規(guī)則最后千萬不要忘記還有一個隱含規(guī)則:Deny ALL!!!
2 在此還需要注意,Cisco的ACL規(guī)則完全是按照規(guī)則編寫的順序進行的。所以最精確的規(guī)則應(yīng)當(dāng)寫在最上方,否則將被大范圍的規(guī)則所覆蓋而導(dǎo)致設(shè)置失效。如拒絕一臺主機訪問外網(wǎng),必須先寫拒絕這一臺,然后再寫運行所有,那如果順序錯了,運行所有在上面,拒絕一臺在下面,系統(tǒng)會檢查一個數(shù)據(jù)包,發(fā)現(xiàn)任何一個數(shù)據(jù)包都可以通過,就直接轉(zhuǎn)發(fā)了,下面的一條就不起作用了!
3 必須先創(chuàng)建ACL,再應(yīng)用到相應(yīng)的接口上
4 ACL不能過濾路由器自己產(chǎn)生的數(shù)據(jù)。
ACL理論東西沒有太多,也很簡單,下面咱們來看一下標準控制列表的配置過程,其實不論是標準還是擴展ACL的配置主要就是兩個命令
1 設(shè)置訪問控制列表
Router(config)# access-list acl_number permit|deny {}
2 在接口上應(yīng)用訪問控制列表,
Ip access-group acl_number in|out
這里可以是某個接口,也可以是VTY,Qos等應(yīng)用中。其中in代表是入站方向,out代表的是出站方向。
那么標準ACL就顯得更簡單了,如:
Access-list acl_number {permit|deny} source [mask]
其中 acl_number 指的是ACL編號范圍:1-99或1300-1999
Permit 表示 通過
Deny 表示 拒絕
Source 代表的是源地址,可以是某一個主機或是一個網(wǎng)段
Mask 掩碼,但需要注意的是ACL支持的是反掩碼,所以在設(shè)置的時候一定要注意。
但我們有時候可能會在source前面加上host或是any,這又是什么用意呢?
Host不是必須的,但是當(dāng)匹配一個特定的主機地址時是非常有用的。也就是使用host的時候是匹配的某一個具體的主機,是一個精確匹配,此時的反掩碼則0.0.0.0
如:
1 Access-list 10 permit 10.10.10.0 0.0.0.255 表示的是一個網(wǎng)段10.10.10.0,表示匹配該網(wǎng)段的所有數(shù)據(jù)報文。
2 access-list 10 permit 10.10.10.10 0.0.0.0 表示匹配源地址是10.10.10.10這一個具體的主機,這個語句可以寫成 access-list 10 permit host 10.10.10.10
Any 也不是必須的,但是如果是匹配所有報文時是非常有用的,表示匹配所有的地址,是0.0.0.0 255.255.255.255的簡寫
如:
Access-list 10 permit 0.0.0.0 255.255.255.255 表示所有數(shù)據(jù)包通過,此語句可以寫成:
Access-list 10 permit any
下面咱們結(jié)合幾個小實例來看一下標準ACL的具體配置過程:
我們所參考的拓撲圖如下:
實驗拓撲圖
我們結(jié)合這個拓撲來做三個實驗:
實例1:我們只允許192.168.10.0與192.168.20.0兩個網(wǎng)段可以通訊
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface fa0/0
Router(config-if)#ip address 192.168.10.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface fa0/1
Router(config-if)#ip address 192.168.20.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface e1/0
Router(config-if)#ip address 192.168.30.1 255.255.255.0
Router(config-if)#no shutdown
現(xiàn)在默認情況下,三個網(wǎng)段之間是可以進行正常通訊的,如圖:
配置前
那么下面我們怎么做才能只讓10.0和20.0通訊呢,具體配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 permit 192.168.10.0 0.0.0.255
Router(config)#access-list 2 permit 192.168.20.0 0.0.0.255
Router(config)#interface fa 0/0
Router(config-if)#ip access-group 2 out
Router(config-if)#exit
Router(config)#interface fa 0/1
Router(config-if)#ip access-group 1 out
Router(config-if)#exit
Router(config)#
然后測試如下:
配置后
剛才我們是匹配的整個網(wǎng)段,下面咱們看如何匹配一個具體的主機:
實例2:我們不允許192.168.10.10 可以訪問 非192.168.20.0 網(wǎng)段,也就是不允許192.168.10.10這一臺機器訪問192.168.30.0網(wǎng)段
具體配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 deny 192.168.10.10 0.0.0.0
Router(config)#access-list 1 permit any
Router(config)#interface e0/2
Router(config-if)#ip access-group 1 out
此時再來測試:
禁止某一主機
大家可以看到和192.168.20.0網(wǎng)段通訊沒有問題,但是和192.168.30.0網(wǎng)段就不行,這就是對某一臺機器進行精確匹配,那么如果我們把192.168.10.10的IP改為192.168.10.100又如何呢?
調(diào)整IP
發(fā)現(xiàn)又可以通訊了,因為和我們所設(shè)置的規(guī)則不匹配了!
同時我們也是通過幾個實例來具體看一下擴展ACL的配置,關(guān)于標準ACL與擴展ACL的區(qū)別,我們在前面已經(jīng)做了介紹,在此不再累述,下面看具體的匹配命令;
1 創(chuàng)建ACL:
Access-list ACL_number permit|deny protocol soure wildcard [port] destination waildcard [port]
大家一看就覺得比標準ACL要復(fù)雜點,這要可以指定源地址,目標地址,使用的協(xié)議以及使用的端口號等,當(dāng)然還可以使用log來指定日志服務(wù)器,在此不作講解!
2 在接口上應(yīng)用ACL
Ip access-group ACL_number in | out
下面咱們還是通過具體的實例來掌握擴展ACL的應(yīng)用
實例3: 我們拒絕192.168.20. 0 telnet到192.168.10.0上的任何一個主機上!
拓撲圖
具體配置如下:
Router>enable
Router#conf terminal
Router(config)#access-list 101 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 23
Router(config)#access-list 101 permit ip any any
注意:默認有一個deny all
接下來要應(yīng)用以相應(yīng)的接口上,例如出端口 E 0/0
Router(config)#interface e0/0
Router(config-if)#ip access-group 101 out
配置還是很簡單的!
只不過需要注意有的服務(wù)是有輔助端口的,所以一定要把輔助端口一起封!
如,如果需要封FTP服務(wù)器,則需要使用兩條語句:
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 21
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 eq 20
查看某上端口上應(yīng)用的訪問控制列表,我們可以使用命令:show ip interface 接口,如圖:
查看接口
還可以查看所有的訪問控制列表:show access-lists
查看ACL表
反向ACL的用途
反向訪問控制列表屬于ACL的一種高級應(yīng)用。一般使用在源訪問對方可以,但反之不行。如A訪問B節(jié)點可以,但是B不能訪問A節(jié)點。如我們在Router1上可以telnet到Router2,但Router2不能telnet1上。那有人可能要問這是怎么實現(xiàn)的,在這里我們就以ping為例講一下其中的原理,我們知道Ping使用的是icmp協(xié)議,但同樣是icmp協(xié)議,它所使用的類型是不同的,簡單說我們ping對方,是發(fā)出一個icmp request類型的數(shù)據(jù)包,但是對方回來的是則是攜帶了我們request標志的reply類型的包,所以我們?nèi)绻幌M鸄 ping B,不讓B ping A,就可以這么判斷,如果A ping B,發(fā)現(xiàn)回來的ICMP包是攜帶了A的request標簽則允許通過,否則拒絕,就OK了!也可以用于保護網(wǎng)絡(luò)的安全性,如我們只能由內(nèi)部網(wǎng)絡(luò)始發(fā)的,外部網(wǎng)絡(luò)的響應(yīng)流量可以進入,由外部網(wǎng)絡(luò)始發(fā)的流量如果沒有得到一個明確的允許,是禁止進入的。說白了,就是內(nèi)網(wǎng)可以訪問外網(wǎng),但外網(wǎng)不能訪問內(nèi)網(wǎng),如圖所示:
拓撲圖
如,咱們看一個實例:我們希望內(nèi)網(wǎng)的192.160.10.0網(wǎng)段可以訪問(ping)外網(wǎng)的192.160.20.0,但是外網(wǎng)不能ping內(nèi)網(wǎng)。這里需要使用Reflexive ACL技術(shù),基中包含兩個部分,一部分是outbound的配置,另一部分是inbound的配置。工作流程:由內(nèi)網(wǎng)始發(fā)的數(shù)據(jù)到達路由器后,路由器會生成一個三層和四層的臨時訪問表,在此會將其中的一些參數(shù)作一些更改,如源IP和目標IP,源端口和目標端口適當(dāng)作些對調(diào)操作。這樣的話,當(dāng)數(shù)據(jù)包從外網(wǎng)再進入內(nèi)網(wǎng)的時候會檢查此表,如果匹配上,則路由器才會允許此數(shù)據(jù)進入內(nèi)網(wǎng)。
ACL應(yīng)用位置:
標準的ACL的應(yīng)用位置應(yīng)該是離目的近的地方,而擴展的ACL則應(yīng)該是離源近的地方對于標準的ACL來說,僅定義了它的源,如果你把它放在離源近的地方,那么它會把所有該源的流量給阻斷,或者產(chǎn)生其他的效果.為了避免這種情況產(chǎn)生,所以將標準的ACL放置在離目標較近的地方,也就是遠源端.但是對于擴展的來說,我們定義了它的源IP,目標IP,源端口,目標端口,以及協(xié)議,這種完全可以進行精確的匹配,所以不用擔(dān)心它會對不需要控制的流量產(chǎn)生影響,而將其放在近源端口,這樣也可以在一定程度上面節(jié)約帶寬。
基于時間的ACL:
顧名思義是根據(jù)時間對ACL進行配置,如我們單位規(guī)定禁止在上網(wǎng)班時間使用QQ,MSN等等操作。如:我們禁止在上午9:00 — 下午17:00訪問互聯(lián)網(wǎng)上的Web站點即(http:80/https:443)
基于時間的訪問控制列表由兩部分組成,第一部分是定義時間段,第二部分是用擴展訪問控制列表定義規(guī)則。這里我們主要講解下定義時間段,具體格式如下:
time-range 時間段名稱
absolute start [小時:分鐘] [日 月 年] [end] [小時:分鐘] [日 月 年]
當(dāng)然也可以使用Periodic:為周期性重復(fù)使用的時間范圍的定義。完整格式為periodic 日期關(guān)鍵字 開始時間 結(jié)束時間
例如:time-range dufei
absolute start 9:00 1 may 2009 end 12:00 1 may 2010
意思是定義了一個時間段,名稱為dufei,并且設(shè)置了這個時間段的起始時間為2009年5月1日9點,結(jié)束時間為2010年5月1日中午9點。我們通過這個時間段和擴展ACL的規(guī)則結(jié)合就可以指定出針對自己公司時間段開放的基于時間的訪問控制列表了。當(dāng)然我們也可以定義工作日和周末。下面看一個小例子:
目的:我們部分規(guī)定只允許192.168.15.0網(wǎng)段的用戶在周末訪問192.168.10.10(娛樂服務(wù)器)上的FTP資源,工作時間不能下載該FTP資源。
路由器配置命令:
ime-range ftptime 定義時間段名稱為ftptime
periodic weekend 00:00 to 23:59 定義具體時間范圍,為每周周末(6,日)的0點到23點59分。當(dāng)然可以使用periodic weekdays定義工作日或跟星期幾定義具體的周幾。
access-list 101 deny tcp any 192.168.10.10 0.0.0.0 eq ftp time-range ftptime 設(shè)置ACL
access-list 101 permit ip any any 設(shè)置ACL,容許其他時間段和其他條件下的正常訪問。
int e1
ip access-group 101 out 應(yīng)用ACL
在VTY上應(yīng)用標準ACL:
我們可以利用ACL來控制對VTY的訪問,ACL可以用在VTY上,我們在第二節(jié)中介紹過VTY,其實也就是對Cisco設(shè)備的Telnet操作,一般我們說可以將ACL應(yīng)用在5個VTY虛擬終端上。但是要注意的是Cisco是否僅支持5個VTY,這要根據(jù)路由器的版本和內(nèi)存和決定,所以在設(shè)置ACL的時候一定要先弄清楚VTY的數(shù)量)
將ACL應(yīng)用在VTY上,可以實現(xiàn)不考慮路由器的物理接口的拓撲來實現(xiàn)對路由器的遠程控制。但是要注意的是在此只能使用標準ACL。
那么具體設(shè)置命令也很簡單:我們前面是在某個接口上設(shè)置ACL,所以必須使用interface命令進行接口模式,而在此需要進入vty線路模式。在應(yīng)用的時候是使用access-class 而不是ip access-group;我們來具體看一下:
1 進行線路模式
命令:line vty vty_number|vry_range
在此可以一個具體終端或指定的一個地址范圍,一定要注意事先查清VTY的數(shù)量
2 應(yīng)用ACL:
命令:access-class ACL_number in|out
我們來看一個具體的配置實例:
實例:我們拒絕R3路由器遠程Telnet到R1路由器上
實驗拓撲圖
配置前提是已經(jīng)使用OSPF協(xié)議實現(xiàn)了全網(wǎng)互通!
R1路由器的配置:
R1#enable
R1#conf t
R1(config)#interface fa0/1
R1(config-if)#ip address 192.168.10.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#exit
R1(config)#interface fa0/0
R1(config-if)#ip address 192.168.100.100 255.255.255.0
R1(config-if)#exit
R1(config)#router ospf 1
R1(config-router)#network 192.168.100.0 0.0.0.255 area 0
R1(config-router)#network 192.168.10.0 0.0.0.255 area 0
R1(config-router)#end
至于R2與R3的配置在此不再詳細描述!
我們可以在R1上查看路由信息:
R1上的路由信息
并且實現(xiàn)全網(wǎng)全通:
全網(wǎng)通暢
再往下,我們準備開啟R1的telnet功能:
R1#configure t
R1(config)#username dufei password dufei
R1(config)#line vty 0 4
R1(config-line)#login local
此時我們到R3上遠程Telnet測試是否成功!
R3>enable
R3#tel
R3#telnet 192.168.10.1
Trying 192.168.10.1 … Open
User Access Verification
Username: dufei
Password:
R1>
telnet登錄
OK! 登錄成功,下面我們就來看一下如何拒絕R3的遠程Telnet.
R1(config)#access-list 10 deny host 192.168.20.2
R1(config)#access-list 10 permit any
R1(config)#line vty 0 4
R1(config-line)#access-class 10 in
R1(config-line)#exit
然后R3再次Telnet到R1上, 見到下圖,我就恭喜你了!嘻。。。。。成功了!
成功登錄
但是我們使用R2是可以Telnet到R1上的,如圖所示:
ACL設(shè)置生效
至此,實驗完畢,ACL的基本應(yīng)用就這么簡單。我們這一節(jié)課程也結(jié)束了,休息,休息一會吧!