ccna60d/d09-ACL.md

941 lines
39 KiB
Markdown
Raw Normal View History

2020-11-24 08:13:36 +08:00
# 第9天 访问控制清单
**Access Control Lists**
___
Gitbook[ccna60d.xfoss.com](https://ccna60d.xfoss.com/)
你可以在 https://github.com/gnu4cn/ccna60d 上 fork 本项目,并提交你的修正。
本书结合了学习技巧,包括阅读、复习、背书、测试以及 hands-on 实验。
> 本书译者用其业余时间完成本书的翻译工作,并将其公布到网上,以方便你对网络技术的学习掌握,为使译者更有动力改进翻译及完成剩下章节,你可以 [捐赠译者](https://github.com/gnu4cn/buy-me-a-coffee)。
___
## 第九天的任务
- 阅读今天的课文
- 完成今天的实验
- 阅读ICND1记诵指南
- 在[subnetting.org](http://www.subnetting.org)上花15分钟
和子网划分及VLSM一样访问控制清单access control lists, ACL对于新CCNA学员来说也是一大难点one of the bugbear subjects。有关ACL的问题包括学习相关的IOS配置命令、理解ACL规则包括隐式的`deny all`规则),以及掌握端口号及协议类型。
与其它CCNA科目一样应该在学习过程中一次完成一个小部分在路由器上使用所见到的每个命令并完成许多实验。
今天你将学到以下内容。
- ACL基础
- 标准ACLs扩展ACLs 以及命名ACLs
- ACL 规则
- 反掩码wildcard masks
- ACL的配置
- ACLs 故障排除
本课程对应了以下CCNA大纲要求。
+ 描述ACLs的类型、特性及应用
- 标准ACLs, standard
- 序列号, sequence numbers
- ACLs的编辑, editing
- 扩展的ACLs, extended
- 命名的ACLs, named
- 编号的ACLs, numbered
- 日志选项, log option
- 在某个网络环境下配置并验证ACLs
## ACL基础
**ACL Basics**
**ACLs用于过滤那些通过路由器的流量**。没有那个网络是会让任何流量都进入或流出该网络的。
**在流量过滤的同时ACLs 还可用于对NAT地址池的引用及对调试命令进行过滤filter your debugging commands, 以及对路由地图进行过滤这是超出CCNA大纲要求的**。
依据所配置的ACL类型可实现基于源网络/IP地址的过滤、基于目的网络/IP地址的过滤、基于协议或基于端口号的过滤。可在路由器的任何接口包括Telnet端口上应用ACLs。
下面是3中主要的ACLs类型。
- 标准的编号ACLs
- 扩展的编号ACLs
- 标准或扩展的命名ACLs
**标准的编号ACLs是可以应用到路由器上的最为基本的ACL形式**。它们是最易于配置的,因此其可用的过滤有着最大的限制。**它们仅能依据源IP地址或源网络进行过滤**。识别标准ACL的方法就是看配置行的前导数字标准ACLs的该数字为`1`到`99`。
**扩展的编号ACLs可以有多得多的粒度, 但配置和故障排除起来会更难应付。**它们可以对某个目的或源IP地址或网络、某种协议类型以及某个端口号进行过滤they can filter a destination or source IP address or network, a protocol type, and a port number。可用于配置扩展ACLs的编号为`100`到`199`(包含`100`和`199`)。
**命名ACLs允许给某过滤清单一个名称而不是编号**。这就令到在路由器配置中更易于区别这些ACLs了。命名ACLs可以是标准及扩展ACLs; 在该ACLs的初始化配置行处可以选择其作为标准ACL还是扩展ACL。
为在CCNA考试中取得成功并成为一名思科工程师你需要理解以下内容。
- 端口号port numbers
- ACL规则ACL rules
- ACLs的命令语法command syntax for ACLs
## 端口号Port Numbers
如要通过CCNA考试以及要在实际网络上工作就必须要记住这些常见的端口号。在客户盯着你做事时去查一下常见端口号是不可能的。这里有些你会碰到且需掌握的一些最常见的端口号。
<table>
<tr><th>端口</th><th>服务</th><th>端口</th><th>服务</th></tr>
<tr><td>`20`</td><td>FTP数据</td><td>`80`</td><td>HTTP</td></tr>
<tr><td>`21`</td><td>FTP控制</td><td>`110`</td><td>POP3</td></tr>
<tr><td>`22`</td><td>SSH</td><td>`119`</td><td>NNTP</td></tr>
<tr><td>`23`</td><td>Telnet</td><td>`123`</td><td>NTP</td></tr>
<tr><td>`25`</td><td>SMTP</td><td>`161/162`</td><td>SNMP</td></tr>
<tr><td>`53`</td><td>DNS</td><td>`443`</td><td>HTTPS(带有SSL的HTTP)</td></tr>
<tr><td>`69`</td><td>TFTP</td><td></td><td></td></tr>
</table>
## 访问控制清单规则Access Control List Rules
这是最难掌握的部分之一。我从没有在哪本思科手册中见到里面曾写过一条完整的规则清单。仅有一些手册对其简单概过或是稍加解释另外一些则完全不讲。难点就在于这些规则一直都在用但到目前为止你都是通过试误法发现的它们the difficulty is that the rules always apply but unitil now, you found them only by trial and error。下面就是你需要知道的这些规则了。
### ACL规则一 -- 在每个接口的每个方向只使用一条ACL
**Use only one ACL per interface per direction**
这么做是很明智的。在同一接口上有多条ACLs去做不同的事情大概不是你想要的。简单地配置一条ACL来完成需要完成的事情而不是将过滤器分散到两条或多条的清单中。本应将“每个协议per protocol”加入到此规则中因为这里是可以包含IPX的访问控制清单的不过在现代网络中IP已成为唯一的协议了。
![接口上的一个方向仅做一条ACL](images/0901.png)
*图9.1 -- 接口上的一个方向仅做一条ACL*
### ACL规则二 -- ACLs行自顶向下进行处理
**the lines are processed top-down**
某些工程师在他们的ACL未如预期那样运行时感到迷惑。路由器会看看ACL的顶行在发现匹配后就会停在那里且不再对其它行进行检查了。为此需要将**最明确的(最小的)那些条目放在ACL的顶部**you need to put the most specific entries at the top of the ACL。比如在利用ACL来阻挡主机`172.16.1.1`时的做法。
<table>
<tr><td>`Permit 10.0.0.0`</td><td></td><td>没有匹配的</td></tr>
<tr><td>`Permit 192.168.1.1`</td><td></td><td>没有匹配的</td></tr>
<tr><td>`Permit 172.16.0.0`</td><td>``</td><td>匹配了-放行</td></tr>
<tr><td>`Permit 172.16.1.0`</td><td></td><td>不会处理了</td></tr>
<tr><td>`Deny 172.16.1.1`</td><td></td><td>不会处理了</td></tr>
</table>
在本例中,应该将`Deny 172.16.1.1`这行放到顶部或至少应在语句statement`Permit 172.16.0.0`之前。
### ACL规则三 -- 在每条ACL的底部都有一句隐式的“deny all”
**There is an implicit "deny all" at the bottom of every ACL**
这条规则另很多工程师为难。在每条ACL的底部有着一条看不见的命令。该命令设置为拒绝尚未匹配的所有流量。而阻止此命令起作用的唯一方法就是在底部手动配置一条`permit all`命令。在取得来自IP地址`172.20.1.1`的某个进入的数据包时的做法。
<table>
<tr><td>`Permit 10.0.0.0`</td><td>无匹配项</td></tr>
<tr><td>`Permit 192.168.1.1`</td><td>无匹配项</td></tr>
<tr><td>`Permit 172.16.0.0`</td><td>无匹配项</td></tr>
<tr><td>`Permit 172.16.1.0`</td><td>无匹配项</td></tr>
<tr><td>`[Deny all]`</td><td>匹配 -- 丢弃数据包</td></tr>
</table>
你实际上想要路由器放行该数据包,但却拒绝了。原因就在于那条隐式的`deny all`命令了,而该命令实际上是一种安全手段。
### ACL规则四 -- 路由器是不能过滤自己产生的流量的
**The router can't filter self-generated traffic.**
这在某个实际网络上于部署ACL前进行测试时会造成混乱。路由器不会过滤其自身产生的流量。在图9.2中有演示。
![对自身流量的ACL测试](images/0902.png)
*图9.2 -- 对自身流量的ACL测试*
### ACL规则五 -- 不能对运行中的ACL进行编辑
**You can't edit a live ACL.**
实际上,在`IOS 12.4`之前的版本中只能对命名ACL进行编辑, 而不能对标准ACL或扩展ACLs两种进行编辑。这曾是ACL架构的一个局限this was a limitation of ACL architecture。在`IOS 12.4`之前如想要编辑标准ACL或扩展ACL就必须按照以下步骤进行这里使用`list 99`作为例子)。
1. 使用命令`no ip access-group 99 in`在接口上停用ACL流量stop ACL traffic on the interface with the `no ip access-group 99 in` command
2. 将该条ACL复制粘贴到文本编辑器并在那里编辑好。
3. 进入到ACL模式将新的ACL粘贴上去。
4. 再次将该ACL应用到接口。
在实际的路由器上,执行下面的这些命令。
在接口上已创建并应用的ACL。
```console
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#access-list 1 permit 172.16.1.1
Router(config)#access-list 1 permit 172.16.2.1
Router(config)#interface FastEthernet0/0
Router(config-if)#ip access-group 1 in
```
现在其从接口上卸下。
```console
Router(config)#int FastEthernet0/0
Router(config-if)#no ip access-group 1 in
Router(config-if)#^Z
```
查看那些ACLs。将其复制并粘贴到文本编辑器并进行修改。
```console
Router#show run ← or show ip access lists
access-list 1 permit host 172.16.1.1
access-list 1 permit host 172.16.2.1
```
实际上还需在配置行之间加入一个叹号如是将其粘贴到路由器上的情况下来告诉路由器执行一次确认you actually need to add an exclamation mark in-between each line of configuration, if you are pasting it in, to tell the router to do a carriage return[wikipedia: 回车符](http://zh.wikipedia.org/wiki/%E5%9B%9E%E8%BD%A6%E7%AC%A6)。
```console
access-list 1 permit host 172.16.1.1
!
access-list 1 permit host 172.16.2.2
```
下面是正被粘贴到路由器配置中的那些行。要先删除早先的ACL再粘贴进新版本。
```console
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#no access-list 1
Router(config)#access-list 1 permit host 172.16.1.1
Router(config)#!
Router(config)#access-list 1 permit host 172.16.2.2
Router(config)#exit
Router#
%SYS-5-CONFIG_I: Configured from console by console
show ip access
Router#show ip access-lists
Standard IP access list 1
permit host 172.16.1.1
permit host 172.16.2.2
Router#
Router(config)#int FastEthernet0/0
Router(config-if)#ip access-group 1 in ← reapply to the interface
```
如使用的是Packet Tracer, 那么这些命可能不会工作。同时,请一定在某台路由器上尝试这些命令,因为它们是考试考点。**记住在编辑ACL前要先在接口上关闭它此时它就不再是活动的了以避免一些奇怪或是不可预期的行为发生**。而在`IOS 12.4`及以后的版本中如何来编辑ACLs会在后面演示。
### ACL规则六 -- 在接口上关闭ACL
**Disable the ACL on the interface.**
在打算短时间对ACL进行测试或是撤销ACL时许多工程师都会将其完全删除掉。这是不必要的。如你要停止ACL运行只需简单地将其从所应用到的接口上移除即可。
```console
Router(config)#int FastEthernet0/0
Router(config-if)#no ip access-group 1 in
Router(config-if)#^Z
```
### ACL规则七 -- 可重用同一ACL
**You can reuse the same ACL.**
这是我在实际网络中经常见到的。整个网络通常都有着同样的ACL策略。与其配置多条ACLs只需简单地引用同一ACL然后在所需要的那些接口上应用该ACL即可。图9.3演示了此概念。
![ACL的重用](images/0903.png)
*图9.3 -- ACL的重用*
### ACL规则八 -- ACL应保持简短
ACLs的基本规则就是保持简短且只专注于做一件事情。许多新手的思科工程师将其ACL延伸到数行那么长最后经深思熟虑后就可以紧缩到少数几行的配置。前面提到的将那些最为特定的最小的行放在ACL的顶部。这是好的做法从而可以节约路由器CPU的执行周期。
优良的ACL配置技能来自于知识和操练。
### ACL规则九 -- 尽可能将ACL放在接近源的地方
思科文档建议将扩展ACL尽量放在离源近的地方而将标准ACL尽量放在离目的近的地方因为这可以避免不必要的开销又能放行那些合法流量。
![将ACL尽量放在离源近的地方](images/0904.png)
*图9.4 -- 将ACL尽量放在离源近的地方*
>Farai 指出 -- “思科官方建议是扩展ACL尽量离源近而标准ACL尽量离目的近”。
## 反掩码
**Wildcard Masks**
**因为在ACLs及某些路由协议的配置中反掩码是命令行的组成部分所有有必要学习反掩码**。之所有存在反掩码是因为需要有某种方式来告诉路由器我们要去匹配IP地址或网络地址的哪些部分。
匹配实在二进制层面完成的,却可以采用与子网掩码相同的表示法,来容易地配置反掩码。一个二进制`1`告诉路由器忽略对应的位,`0`则是要匹配的位。
CCNA考试中反掩码计算的一种简易方法就是把一个数与子网掩码相加确保它们的和为`255`。那么如果子网掩码的某个`8`位值为`192`时,需要加上`63`才等于`255`。而如果子网掩码的某个`8`位值为`255`, 则需要加的就是`0`。看看下面的例子吧。
<table>
<tr><th>子网掩码</th><td>`255`</td><td>`255`</td><td>`255`</td><td>`192`</td></tr>
<tr><th>反掩码</th><td>`0`</td><td>`0`</td><td>`0`</td><td>`63`</td></tr>
<tr><th>相加之和</th><td>`255`</td><td>`255`</td><td>`255`</td><td>`255`</td></tr>
</table>
<table>
<tr><th>子网掩码</th><td>`255`</td><td>`255`</td><td>`224`</td><td>`0`</td></tr>
<tr><th>反掩码</th><td>`0`</td><td>`0`</td><td>`31`</td><td>`255`</td></tr>
<tr><th>相加之和</th><td>`255`</td><td>`255`</td><td>`255`</td><td>`255`</td></tr>
</table>
<table>
<tr><th>子网掩码</th><td>`255`</td><td>`128`</td><td>`0`</td><td>`0`</td></tr>
<tr><th>反掩码</th><td>`0`</td><td>`127`</td><td>`255`</td><td>`255`</td></tr>
<tr><th>相加之和</th><td>`255`</td><td>`255`</td><td>`255`</td><td>`255`</td></tr>
</table>
在想要ACL与匹配某个子网或是整个网络时就需要输入一个反掩码。比如要匹配`172.20.1.0 255.255.224.0`, 就需要输入下面的命令。
`Router(config)#access-list 1 permit 172.20.1.0 0.0.31.255`
而要匹配子网`192.200.1.0 255.255.255.192`, 就需要下面的命令。
`Router(config)#access-list 1 permit 192.200.1.0 0.0.0.63`
在OSPF中应用网络语句时也要当心(be careful when applying network statements with OSPF),那位那也要用到反掩码。
在有着一个仅有两位主机位的网络时也要当心因为需要输入一条ACL来匹配这些主机位。比如要匹配子网`192.168.1.0 255.255.255.252`, 或`/30`的话,需要输入下面的命令。
`Router(config)#access-list 1 permit 192.168.1.0 0.0.0.3`
这里剔除了一些配置,是为展示出对应的部分。上面的命令将匹配`192.168.1.0`网络上的`1`号和`2`号主机。而如果要匹配`192.168.1.4/30`网络上的`5`号和`6`号主机,则需输入下面的命令。
`Router(config)#access-list 1 permit 192.168.1.4 0.0.0.3`
请阅读子网划分和VLSM部分的课文以更好地掌握此概念。
## 访问控制清单的配置
**Configuring Access Control Lists**
熟能生巧对于任何技能都是适用的。如同前面提到的你应该在路由器上输入这里给出的每个例子完成尽可能多的实验并构建出自己的实例。在考试和现实世界中你都需要精准快速的设计ACL。
接下来的章节中出现的标准和扩展ACLs都是编号ACLs。它们是配置ACLs的经典方法。命名ACLs是配置ACLs的另一种方式将在其后的部分出现。
### 标准ACLs
**Standard ACLs**
标准的编号ACLs是最易于配置的所以拿它来作为开端是最好的。**标准ACLs只能实现依据源网络或源IP地址的过滤**。
![带有源和目的地址的进入数据包](images/0905.png)
*图9.5 -- 带有源和目的地址的进入数据包*
在上面的图9.5中进入的数据包有着一个源和目的地址但标准ACL只会查看源地址。该ACL会放行会拒绝该源地址参见图9.6)。
![有着多台/个主机网络的网络](images/0906.png)
```console
Router(config)#access-list 1 permit host 172.16.1.1
Router(config)#access-list 1 permit host 172.16.1.1
Router(config)#access-list 1 permit host 192.168.1.1
Router(config)#access-list 1 permit 10.1.0.0 0.0.255.255
```
此ACL应在服务器侧的路由器上应用。又记得在清单的底部有一条隐式的`deny all`,所以其它流量都会给阻止掉。
### 扩展ACLs
**Extended ACLs**
**扩展的编号ACLs中可以构建出细得多的粒度**。而正是由于有了细得多的粒度令到扩展的编号ACLs变得诡异起来。藉由扩展的编号ACLs可以对源或目的网络地址、端口、协议及服务进行过滤。
一般来说你可以看看扩展的ACLs配置语法就像下面这样。
```console
access list# permit/deny [service/protocol] [source network/IP] [destination network/IP] [port#]
```
比如下面这样。
```console
access-list 101 deny tcp 10.1.0.0 0.0.255.255 host 172.30.1.1 eq telnet
access-list 100 permit tcp 10.1.0.0 0.0.255.255 host 172.30.1.1 eq ftp
access-list 100 permit icmp any any
```
![阻止服务器访问实例](images/0907.png)
*图9.7 -- 阻止服务器访问实例*
可为上面的网络配置一条ACL以e-mail、web和文件服务器为例可以像下面这样应用在服务器侧的
```console
access-list 100 permit tcp host 172.16.1.1 host 172.20.1.1 eq smtp
access-list 100 permit tcp 10.1.0.0 0.0.255.255 host 172.30.1.1 eq ftp
access-list 100 permit tcp host 192.168.1.1 host 172.40.1.1 eq www
```
而如有不同要求就也可以像下面这条ACL。
```console
access-list 101 deny icmp any 172.20.0.0 0.0.255.255
access-list 101 deny tcp 10.1.0.0 0.0.255.255 host 172.30.1.1 eq telnet
```
或者也可以像下面这样。
`access-list 102 permit tcp any host 172.30.1.1 eq ftp established`
关键字`[established]`告诉路由器仅放行在网络内部的主机所发起的流量。三次握手标志ACK或RST位将表明这点the three-way handshake flags, ACK or RST bit, will indicate this
### 命名ACLs
**Named ACLs**
与编号ACLs不同命名ACLs可由其描述性名称容易地区分而这在一些大型的配置中尤其有用。引入命名ACLs就是为增加灵活性及ACLs的易于管理的。命名ACLs可以看着是配置增强的提升因为它并未对ACLs结构进行修改仅改变了引用ACL的方式而已
其语法跟编号ACLs是相似的主要的不同就是使用名称而不是编号来区分ACLs。和编号ACLs一样可以配置标准的或扩展的命名ACLs。
在配置命名ACLs时的另一不同之处就是必须一直使用命令`ip access-list`这与编号ACLs可以只使用简单的`access-list`命令,是不一样的。
```console
Router(config)#access-list ?
<1-99> IP standard access list
<100-199> IP extended access list
<1100-1199> Extended 48-bit MAC address access list
<1300-1999> IP standard access list (expanded range)
<200-299> Protocol type-code access list
<2000-2699> IP extended access list (expanded range)
<700-799> 48-bit MAC address access list
dynamic-extended Extend the dynamic ACL absolute timer
rate-limit Simple rate-limit specific access list
Router(config)#ip access-list ?
extended Extended access list
log-update Control access list log updates
logging Control access list logging
resequence Resequence access list
standard Standard access list
R1(config)#ip access-list standard ?
<1-99> Standard IP access-list number<1300-1999> Standard IP access-list number (expanded range)
WORD Access-list name
R1(config)#ip access-list extended ?
<100-199> Extended IP access-list number
<2000-2699> Extended IP access-list number (expanded range)
WORD Access-list name
```
命名ACLs在语法上与其它类型的ACLs也就是标准和扩展的编号ACLs有着轻微的不同。同时也**可以编辑活动的命名ACLs**, 这是一个有用的特性。只需简单地告诉路由器要配置一条命名ACL 而不管它是标准的还是扩展的。在较新的IOS版本上也可以编辑编号ACLs所以请检查所用的平台。
在使用`ip access-list`命令常见一条命名ACL时思科IOS会将你带入ACL配置模式在那里就可以输入或是移除ACL条目了就是那些拒绝或放行的访问条件。图9.8展示了一条命名ACL的实例以及相应的输出。
![命名ACL](images/0908.png)
**图9.8 -- 命名ACL**
```console
Router(config)#ip access-list extended BlockWEB
Router(config-ext-nacl)#?
Ext Access List configuration commands:
<1-2147483647> Sequence Number
default Set a command to its defaults
deny Specify packets to reject
dynamic Specify a DYNAMIC list of PERMITs or DENYs
evaluate Evaluate an access list
exit Exit from access-list configuration mode
no Negate a command or set its defaults
permit Specify packets to forward
remark Access list entry comment
Router(config-ext-nacl)#deny tcp any any eq 80
Router(config-ext-nacl)#permit ip any any
```
命名ACL的验证可通过下面的命令完成。
- `show ip access-list`: 显示设备上所创建的所有ACLs
- `show ip access-list <acl_name>`: 显示某条特定的命名ACL
```console
Router(config)#do show ip access-lists
Standard IP access list test
30 permit 10.1.1.1
20 permit 192.168.1.1
15 permit 172.20.1.1
10 permit 172.16.1.1
```
要知道如何来增加或是删除某条命令ACL中的条目请参考下面的“ACL序号ACL Sequence Numbers”小节。
### 应用ACLs
**Applying ACLs**
**为让ACLs发挥效果就必须将ACL应用到路由器的某个接口或端口上**。之所以这样讲是因为我曾见到许多的新手思科工程师在敲入了ACL后就想为什么它不工作或者他们配置了ACL却将错误的ACL编号或命名应用到相应的接口上。
**如要应用在某条线路上,就必须使用`access-class`命令来指定它**,而**如果是应用在某个接口上,就要用`ip access-group`命令**。思科这么做的原因,我也不知道。
这里有应用ACLs到端口或接口上的三个实例。
接口上的应用。
```console
Router(config)#int FastEthernet0/0
Router(config-if)#ip access-group 101 in
```
线路上的应用。
```console
Router(config)#line vty 0 15
Router(config-line)#access-class 101 in
```
接口上的应用。
```console
Router(config)#int FastEthernet0/0
Router(config-if)#ip access-group BlockWEB in
```
## ACL序号
**ACL Sequence Numbers**
自`12.4`往后你会发现思科IOS给每个ACL条目添加了序号。那么现在就可以创建一条访问控制清单并在其后从它里面一处一行了。
```console
Router(config)#ip access-list standard test
Router(config-std-nacl)#permit 172.16.1.1
Router(config-std-nacl)#permit 192.168.1.1
Router(config-std-nacl)#permit 10.1.1.1
Router(config-std-nacl)#
Router(config-std-nacl)#exit
Router(config)#exit
Router#
*Jun 6 07:38:14.155: %SYS-5-CONFIG_I: Configured from console by console access
Router#show ip access-lists
Standard IP access list test
30 permit 10.1.1.1
20 permit 192.168.1.1
10 permit 172.16.1.1
```
注意到**在路由器运行配置中,序号并不会显示出来**。要查看它们,必须执行一个`show [ip] access-list`命令。
## 加入一个ACL行
**Add an ACL Line**
**要加入一个新的ACL行只需简单地输入新的序号并接着输入该ACL语句**。下面的例子展示如何往现有的ACL中加入行`15`。
```console
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#ip access
Router(config)#ip access-list standard test
Router(config-std-nacl)#15 permit 172.20.1.1
Router(config-std-nacl)#
Router(config-std-nacl)#do show ip access
Router(config-std-nacl)#do show ip access-lists
Standard IP access list test
30 permit 10.1.1.1
20 permit 192.168.1.1
15 permit 172.20.1.1
10 permit 172.16.1.1
Router(config-std-nacl)#
```
### 移除一个ACL行
**Remove an ACL Line**
要移除某个ACL行只需简单地敲入`no <seq_number>`命令即可,就如同下面的例子中行`20`被删除掉了。
```console
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#ip access
Router(config)#ip access-list standard test
Router(config-std-nacl)#no 20
Router(config-std-nacl)#
Router(config-std-nacl)#do show ip access
Router(config-std-nacl)#do show ip access-lists
Standard IP access list test30 permit 10.1.1.1
15 permit 172.20.1.1
10 permit 172.16.1.1
Router(config-std-nacl)#
```
### 为某条ACL重新编号
**Resequence an ACL**
要对某条ACL重新编号使用`ip access-list resequence <acl_name> <starting_seq_number> <step_to_increment>`命令。该命令的行为可由下面的例子进行检验。
```console
Router(config)#ip access-list resequence test 100 20
Router(config)#do show ip access-lists
Standard IP access list test
100 permit 10.1.1.1
120 permit 172.20.1.1
140 permit 172.16.1.1
Router(config-std-nacl)#
```
命令`resequence`则会创建新的序号,自`100`开始,每个新行增加`20`。译者注在更新的IOS版本中此命令可指定开始序号及步进序号。
### ACL日志
**ACL Logging**
默认情况下通过那些为某个接口的数据包所匹配上的ACL条目会创建出一个不断增大的计数器该计数器可使用`show ip access-list`命令进行查看,如下面的例子所示。
```console
Router#show ip access-lists
Extended IP access list test
10 deny tcp any any eq 80 (10 matches)
20 permit ip any any (56 matches)
```
而如果需要更详细的有关那些为ACL条目所匹配的流量信息可以给相关的ACL条目配置`log`或`log-input`参数。
```console
Router(config)#ip access-list extended test
Router(config)#no 10
Router(config)#10 deny tcp any any eq 80 log
Router#show ip access-lists
Extended IP access list test
10 deny tcp any any eq 80 log
20 permit ip any any (83 matches)
```
在上面的配置样例中配置了test ACL的10号条目的ACL日志。在某个数据包与那个条目匹配时该ACL计数器就会增加与此同时路由器也会生成一条包含了该特定ACL匹配的详细日志记录。
`%SEC-6-IPACCESSLOGP: list test denied tcp 10.10.10.2(24667) -> 10.10.10.1(80), 1 packet`
而如果你仍需要更多有关该事件transaction的细节就要用`log-input`参数替代`log`参数了,就像下面这样。
```console
Router(config)#ip access-list extended test
Router(config)#no 10
Router(config)#10 deny tcp any any eq 80 log-input
Router#show ip access-lists
Extended IP access list test
10 deny tcp any any eq 80 log-input
20 permit ip any any (125 matches)
```
这时当有该特定ACL条目匹配时路由器就会生成一条更为详细的日志消息当中包含了进入的接口以及源MAC地址。
```console
%SEC-6-IPACCESSLOGP: list test denied tcp 10.10.10.2(14013) (FastEthernet0/0 00aa.aabb.ccdd) -> 10.10.10.1(80), 1 packet
```
**ACL日志在查看到底那些数据包被丢弃或放行的故障排除中会是非常有用的**, 但在现实世界情形中此内容超出CCNA考试范围不得提的是包含`[log]`或`[log-input]`关键字的ACL条目是为路由器进行线程交换的, 与之相反,现代路由器中, 默认都是经由CEF交换的ACL entries that contain `[log]` or `[log-input]` keyword are process-switched by the router, as opposed to being CEF-switched, which is the default in modern routers。这需要更多的路由器CPU周期因而导致在有大量与被记录的ACL条目匹配时出现问题。
### 使用ACLs来限制Telnet和SSH访问
**Using ACLs to Limit Telnet and SSH Access**
除了在接口级别过滤流量外ACLs可与其他设备特性配合使用包括过滤VTY线路上的流量。在前面的课程中我们曾学过如何利用`line vty`命令配置Telnet和SSH以实现对某台设备的访问比如路由器或交换机
有时我们可能不想接受到设备或自设备发出的所有Telnet/SSH连接。而为实现此操作就必须定义一条ACL以指定在VTY线路上所允许或拒绝的流量类型。该ACL可以是编号ACL或命名ACL。通过命令`access-class <acl> | [in|out]`, 将该ACL加入到想要的VTY线路上。
下面的例子定义了一条允许来自主机`10.10.10.1`的Telnet流量该ACL随后被应用到VTY线路的进入方向。
```console
Router(config)#ip access-list extended VTY_ACCESS
Router(config-ext-nacl)#permit tcp host 10.10.10.1 any eq telnet
Router(config-ext-nacl)#deny tcp any any
Router(config-ext-nacl)#exit
Router(config)#
Router(config)#line vty 0 4
Router(config-line)# access-class VTY_ACCESS in
Router(config-line)#
```
使用以下命令对配置进行验证。
```console
Router#show run | sect line vty
line vty 0 4
access-class VTY_ACCESS in
.....
```
## ACLs故障排除和验证
**Trubleshooting and Verifying ACLs**
相信有了对配置命令和规则的深入理解在访问控制清单上就不会有问题了。在ACL不工作的时候首先要通过ping操作检查有没有基本的IP连通性问题。接着看看有没有应用该ACL看看在ACL中有没有什么文字错误以及你是否需要允许任何IP流量通过记住那个隐式的`deny all`条目。而一些在ACL故障排除过程中最重要的检查点包括下面这些。
- 查看ACL统计信息
- 检查所允许的网络
- 检查应用ACL的接口及方向
### 查看ACL统计信息
在成功配置一条ACL并将其应用到某个接口上之后某种可以验证该ACL正确行为的手段非常重要尤其是某个ACL条目被使用到的次数。基于匹配次数就可以对过滤策略进行调整或者对ACLs进行增强以实现整体安全性的提升。而根据需求的不同可以在全局层面或者单个接口上从`IOS 12.4`开始查看ACL统计信息。
**ACL全局统计信息**
**Global ACL Statistics**
可使用命令`show ip access-list` 或 `show access-list`命令, 查看ACL全局统计信息这两个命令又可以仅查看某个特定编号ACL或命名ACL的全局统计信息。
```console
Router#show ip access-lists
Extended IP access list test
10 deny tcp any any eq 80 (10 matches)
20 permit ip any any (56 matches)
```
在将某同一ACL重用到不同接口上时这种方式并不会提供到十分特定的信息因为它给出的是整体统计信息。
**单个接口上的ACL统计信息**
**Per Interface ACL Statistics**
在想要查看单个接口上的ACL匹配情况不管是进还是出方向时可以使用命令`show ip access-list interface <interface_name> [in|out]`,如下面所示。
```console
Router#show ip access-list interface FastEthernet0/1 in
Extended IP access list 100 in
10 permit ip host 10.10.10.1 any (5 matches)
30 permit ip host 10.10.10.2 any (31 matches)
```
如未有指定方向则应用到该特定接口上的任何进或出方向的ACL都将显示出来。此特性也叫做“ACL可管理能力ACL Manageability自`IOS 12.4`开始可用。
### 检查那些放行的网络
**Verifying the Permitted Networks**
有的时候特别实在那些必须配置很多ACLs的大型网络中在配置ACL条目是就会犯下一些书写错误而这就会导致不同接口上有错误的流量被阻止。为了检查那些正确的ACL条目也就是permit及deny语句可以照前面章节中讲到的那样使用`show run | section access-list`或者`show ip access-list`命令。
### 检查ACL的接口和方向
**Verifying the ACL Interface and Direction**
在将某条ACL应用到某个接口上时一个常见的错误就是将其应用到了错误的方向也就是本应在进方向的却应用到了出方向或者本应在出方向的却应用到了进方向。这会导致功能上和安全方面的很多问题。于是在ACL故障排除上的最先几步之一就是检查ACL应用到正确的接口及正确的方向。
为此,可以使用多种命令,包括`show run`及`show ip access-list interface <interface> | [in|out]`命令。
## 第九天的问题
1. You can have a named, extended, and standard ACL on one incoming interface. True or false?
2. You want to test why your ping is blocked on your Serial interface. You ping out from the router but it is permitted. What went wrong? (Hint: See ACL Rule 4.)
3. Write a wildcard mask to match subnet mask `255.255.224.0`.
4. What do you type to apply an IP access control list to the Telnet lines on a router?
5. How can you verify ACL statistics per interface (name the command)?
6. How do you apply an ACL to an interface?
## 第九天问题的答案
1. False. You can only configure a single ACL on an interface per direction.
2. A router wont filter traffic it generated itself.
3. `0.0.31.255`.
4. access-class .
5. Issue the show ip access-list interface command.
6. Issue the `ip access-group <ACL_name> [in|out]` command.
## 第九天的实验
### 标准ACL实验
**Standard ACL Lab**
**拓扑图**
![标准ACL实验拓扑图](images/0909.png)
标准ACL实验拓扑图
**实验目的**
学习如何配置一条标准ACL。
**实验步骤**
1. 配置上面的网络。在两台路由器上加入一条静态路由,领导到任何网络的任何流量都从串行接口发出。这么做的原因是,尽管这不是一个路由实验,仍然需要路由的流量。把`.1`地址加到路由器`A`的串行接口,`.2`地址加到路由器`B`的串行接口。
```console
RouterA(config)#ip route 0.0.0.0 0.0.0.0 s0/1/0
RouterB(config)#ip route 0.0.0.0 0.0.0.0 s0/1/0
```
2. 在路由器A上配置一条标准ACL放行`192.168.1.0/10`网络。默认情况下,其它所有网络都将被阻止。
```console
RouterA(config)#access-list 1 permit 192.168.1.0 0.0.0.63
RouterA(config)#int Serial0/1/0
RouterA(config-if)#ip access-group 1 in
RouterA(config-if)#exit
RouterA(config)#exit
RouterA#
```
3. 从路由器`B`上测试该条ACL默认将使用`10.0.0.1`地址。
```console
RouterB#ping 10.0.0.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds:
UUUUU
Success rate is 0 percent (0/5)
```
4. 以源地址`192.168.1.1`来做另一个ping测试这将没有问题。
```console
RouterB#ping
Protocol [ip]:
Target IP address: 10.0.0.1
Repeat count [5]:Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: 192.168.1.1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds:
Packet sent with a source address of 192.168.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 31/31/32 ms
```
### 扩展ACL实验
**拓扑图**
![扩展ACL实验的拓扑图](images/0910.png)
扩展ACl实验的拓扑图
**实验目的**
学习如何配置一条扩展ACL。
**实验步骤**
1. 配置上述网络。在路由器`B`上加入一条静态路由,令到前往所有网络的所有流量都从串行接口上发出。这么做是因为,尽管这不是一个路由实验,仍然需要路由流量。
```console
RouterB(config)#ip route 0.0.0.0 0.0.0.0 s0/1/0
```
2. 在路由器`A`上配置一条扩展ACL。仅允许往环回接口上发起Telnet流量。
```console
RouterA(config)#access-list 100 permit tcp any host 172.20.1.1 eq 23
RouterA(config)#int s0/1/0
RouterA(config-if)#ip access-group 100 in
RouterA(config-if)#line vty 0 15
RouterA(config-line)#password cisco
RouterA(config-line)#login
RouterA(config-line)#^Z
RouterA#
```
上面的那条ACL编号为`100`, 这就告诉路由器它是一条扩展ACL。所要允许的是TCP。该条ACL允许来自任何网络的目的地址为`172.20.1.1`的Telnet端口端口号为`23`。在执行`show run`命令时,就会看到,路由器实际上会将端口号替换为其对应的名称,就像下面演示的这样。
```console
access-list 100 permit tcp any host 172.20.1.1 eq telnet
```
3. 现在从路由器B上做一个Telnet测试。首先往路由器`A`的串行接口上Telnet将会被阻止。接着测试环回接口。
```console
RouterB#telnet 10.0.0.1
Trying 10.0.0.1 ...
% Connection timed out; remote host not responding
RouterB#telnet 172.20.1.1
Trying 172.20.1.1 ...Open
User Access Verification ←password wont show when you type it
Password:
RouterA> ←Hit Control+Shift+6 together and then let go and press the X key to quit.
```
2020-12-29 17:37:48 +08:00
> **注意:** 我们会在其它实验中涉及ACLs但你真的需要完全地掌握这些内容。为此要尝试其它的TCP端口比如`80`、`25`等等。另外要试试那些UDP端口比如`53`。如没有将一台PC接上路由器则是无法对这些其它端口进行测试的。
2020-11-24 08:13:36 +08:00
## 命名ACL实验
**拓扑图**
![命名ACL实验拓扑图](images/0911.png)
命名ACL实验拓扑图
**实验目的**
学习如何配置一条命名ACL。
**实验步骤**
1. 配置上面的网络。在两台路由器上加入一条静态路由,领导到任何网络的任何流量都从串行接口发出。这么做的原因是,尽管这不是一个路由实验,仍然需要路由的流量。
```console
RouterA(config)#ip route 0.0.0.0 0.0.0.0 s0/1/0
RouterB(config)#ip route 0.0.0.0 0.0.0.0 s0/1/0
```
2. 在路由器`B`上加入一条扩展的命名ACL。只放行主机`172.20.1.1`,阻止其它任何主机或网络。
```console
RouterB(config)#ip access-list extended blockping
RouterB(config-ext-nacl)#permit icmp host 172.20.1.1 any
RouterB(config-ext-nacl)#exit
RouterB(config)#int s0/1/0
RouterB(config-if)#ip access-group blockping in
RouterB(config-if)#
```
3. 现在分别从路由器`A`的串行接口和换回接口发出`ping`来测试该条ACL。
```console
RouterA#ping 192.168.1.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.1, timeout is 2 seconds:
UUUUU
Success rate is 0 percent (0/5)
RouterA#ping
Protocol [ip]:
Target IP address: 192.168.1.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: 172.20.1.1
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.1, timeout is 2 seconds:
Packet sent with a source address of 172.20.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 31/34/47 ms
```
2020-12-29 17:37:48 +08:00
> **注意:** 你需要搞清楚各种服务以及各种服务所用到的端口。否则要配置ACL就会非常棘手。本条ACL相当简单因此可以仅用一行完成。在有着路由协议运行时需要放行它们。
2020-11-24 08:13:36 +08:00
要放行RIP就要像这样指定。
```console
access-list 101 permit udp any any eq rip
```
要放行OSPF要像这样指定。
```console
access-list 101 permit ospf any any
```
要放行EIGRP要像这样指定。
```console
access-list 101 permit eigrp any any
```