訪問控制列表(ACL)是應用在路由器接口的指令列表(即規則)。這些指令列表用來告訴路由器,那些數據包可以接受,那些數據包需要拒絕。
訪問控制列表(ACL)的工作原理
ACL使用包過濾技術,在路由器上讀取OSI七層模型的第3層和第4層包頭中的信息。如源地址,目標地址,源端口,目標端口等,根據預先定義好的規則,對包進行過濾,從而達到訪問控制的目的。
ACl是一組規則的集合,它應用在路由器的某個接口上。對路由器接口而言,訪問控制列表有兩個方向。
出:已經過路由器的處理,正離開路由器的數據包。
入:已到達路由器接口的數據包。將被路由器處理。
如果對路由器的某接口應用了ACL,那么路由器對數據包應用該組規則進行順序匹配,使用匹配即停止的,不匹配則使用默認規則的方式來過濾數據包。如下圖:
訪問控制列表的類型
標准訪問控制列表:根據數據包的源IP地址來允許或拒絕數據包,標准訪問控制列表的訪問控制列表號是1-99。
擴展訪問控制列表:根據數據包的源IP地址,目的IP地址,指定協議,端口和標志,來允許或拒絕數據包。擴展訪問控制列表的訪問控制列表號是100-199
配置標准控制列表
創建標准ACL的語法如下:
Router(config)#access-list access-list-number {permit|deny} source [souce-wildcard]
下面是命令參數的詳細說明
access-list-number:訪問控制列表號,標准ACL取值是1-99。
permit|deny:如果滿足規則,則允許/拒絕通過。
source:數據包的源地址,可以是主機地址,也可以是網絡地址。
source-wildcard:通配符掩碼,也叫做反碼,即子網掩碼去反值。如:正常子網掩碼255.255.255.0取反則是0.0.0.255。
刪除已建立的標准ACL語法如下:
Router(config)#no access-list access-list-number
列如:創建一個ACL允許192.168.1.0網段的所有主機。
Router(config)#access-list 1 permit 192.168.1.0 0.0.0.255
列如:創建一個ACL允許某個主機。
Router(config)#access-list 1 permit host 10.0.0.1
列如:創建一個默認ACL拒絕所有主機訪問。
Router(config)#access-list 1 deny any
注意:上述中的關鍵字host可以指定一個主機地址,而不用寫子網反碼,而any可以代表所有主機。
配置擴展訪問控制列表
創建擴展的ACL語法如下:
Router(config)#access-list access-list-number {permit|deny} protocol {source souce-wildcard destination destination-wildcard} [operator operan]
下面是命令參數的詳細說明
access-list-number:訪問控制列表號,擴展ACL取值是100-199。
permit|deny:如果滿足規則,則允許/拒絕通過。
protocol:用來指定協議的類型,如IP,TCP,UDP,ICMP等。
source、destination:源和目的,分別用來標示源地址和目的地址。
souce-wildcard、destination-wildcard:子網反碼,souce-wildcard是源反碼,destination-wildcard是目標反碼。
operator operan:lt(小於)、gt(大於)、eq(等於)、neq(不等於)一個端口號。
刪除已建立的擴展ACL語法如下:
Router(config)#no access-list access-list-number
列如:允許192.168.1.0/24訪問192.168.2.0/24,而拒絕其他所有主機訪問。
Router(config)#access-list 101 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
Router(config)#access-list 101 deny ip any any
列如:拒絕網絡192.168.1.0/24訪問FTP服務器192.168.2.100/24,而允許其他主機訪問。
Router(config)#access-list 102 deny tcp 192.168.1.0 0.0.0.255 host 192.168.2.100 eq 21
Router(config)#access-list 102 permit ip any any
列如:禁止網絡192.168.1.0/24中的主機ping同服務器192.168.2.200/24,而允許其它主機訪問。
Router(config)#access-list 103 deny icmp 192.168.1.0 0.0.0.255 host 192.168.1.200 echo
Router(config)#access-list 103 permit ip any any
將創建好的ACL應用與路由器的接口上
不管是標准ACL還是擴展ACL只有將創建好的ACL應用與路由器的接口上才算是有效的。語法如下:
Router(config-if)#ip access-group access-list-number {in|out}
參數解釋如下:
access-list-number:創建ACL時指定的訪問控制列表號
in:應用到入站接口。
out:應用出站接口。
取消接口上的ACL應用可以使用如下命令:
Router(config-if)#no ip access-group access-list-number {in|out}
可以使用show access-lists命令查看ACL配置。
注意:不管是標准ACL或者是擴展ACL,只要應用了該規則就不可以在向里面添加新的規則了,只能是刪除整個ACL。這樣很不方便我們管理ACL,那么我們改這么辦呢?下面我們來講解命名訪問控制列表。
配置命名訪問控制列表
所謂的命名控制列表就是給控制列表取個名字,而不是想上面所述的使用訪問控制列表號。我們通過命令訪問控制列表可以很方便的管理ACL規則,可以隨便添加和刪除規則,而無需刪除整個訪問控制列表了。
創建命名訪問控制列表的語法如下:
Router(config)#ip access-list {standard|extended} access-list-name
下面是命令參數的詳細說明
standard:創建標准的命名訪問控制列表。
extended:創建擴展的命名訪問控制列表。
access-list-name:命名控制列表的名字,可以是任意字母和數字的組合。
標准命名ACL語法如下:
Router(config-std-nacl)#[Sequence-Number] {permit|deny} source [souce-wildcard]
擴展命名ACL語法如下:
Router(config-ext-nacl)#[Sequence-Number] {permit|deny} protocol {source souce-wildcard destination destination-wildcard} [operator operan]
無論是配置標准命名ACL語句還是配置擴展命名ACL語句,都有一個可選參數Sequence-Number。Sequence-Number參數表明了配置的ACL語句在命令ACL中所處的位置,默認情況下,第一條為10,第二條為20,以此類推。Sequence-Number可以很方便地將新添加的ACL語句插於到原有的ACL列表的指定位置,如果不選擇Sequence-Number,默認添加到ACL列表末尾並且序列號加10。
刪去以創建的命名ACL語法如下:
Router(config)#no ip access-list {standard|extended} access-list-name
對於命名ACL來說,可以刪除單條ACL語句,而不比刪除整個ACL。並且ACL語句可以有選擇的插入到列表中的某個位置,使得ACL配置更加方便靈活。
如果要刪除某一ACL語句,可以使用“no Sequence-Number”或“no ACL”語句兩種方式。
列如:將一條新添加的ACL加入到原有標准命名ACL的序列15的位置。內容為允許主機192.168.1.1/24訪問Internet。
Router(config)#ip access-list standard test1
Router(config-std-nacl)#15 permit host 192.168.1.1
列如:創建擴展命名ACL,內容為拒絕192.168.1.0/24訪問FTP服務器192.168.2.200/24,允許其他主機。
Router(config)#ip access-list extended test2
Router(config-ext-nacl)#deny tcp 192.168.1.0 0.0.0.255 host 192.168.2.200 eq 21
Router(config-ext-nacl)#permit ip any any
將命名ACL應用於接口語法如下:
Router(config-if)#ip access-group aaccess-list-name {in|out}
取消命名ACL的應用語法如下:
Router(config-if)#no ip access-group aaccess-list-name {in|out}