访问控制列表(一)

? TCP和UDP协议

TCP/IP协议族的传输层协议主要有两个:TCP(Transmission ,传输控制协议)和UDP(User Datagram Protocol,用户数据抱协议)。

? TCP协议

TCP是面向连接的、可靠的进程到进程通信的协议。TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存和接受缓存,用来临时存储数据。

1. TCP报文段

TCP将若干个字节构成一个分组,叫做报文段(Segment)。TCP报文段封装在IP数据段中。

首部长度为20-60字节,以下是各个字段的含义:

? 源端口:它是16位字段,为发送方进程对应的端口号

? 目标端口号:它是16位字段,对应的是接收端的进程,接收端收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。

? 序号:当TCP从进程接收数据字节时,就把它们存储在发送缓存中,并对每一个字节进行编号。编号的特点如下所述:

u 编号不一定从0开始,一般会产尘一个随机数作为第1个字节的编号,称为初始序号(ISN),范围是0~232-1。

u TCP每一个方向的编号是互相独立的。

u 当字节都被编上号后,TCP就给每一个报文段指派一个序号,序号就是该报文段中第1个字节的编号。

当数据到达目的地后,接收端会按照这个序号把数据重新排列,保证数据的正确性。

? 确认号:确认号是对发送端的确认信息,用它来告诉发送端这个序号之前的数据段都已经收到,比如确认号是X,就是表示前X-1个数据段都已经收到。

? 首部长度:用它可以确定首部数据结构的字节长度。一般情况下TCP首部是20字节,但首部长度最大可以扩展为60字节。

? 保留:这部分保留位作为今后扩展功能用,现在还没有使用到。

? 控制位:这六位有很重要的作用,TCP的连接、传输和断开都是受六个控制为的指挥。各位含义如下:

u URG:紧急指针有效位。(指定一个包快速传送(重要数据优先传送))

u ACK:只有当ACK=1时,确认序列号字段才有效。当ACK=0时,确认号字段无效。(同意连接)

u PSH :标志位为1时要求接收方尽快将数据段送达应用层。(不进入缓存)

u RST:当RST值为1时通知重新建立TCP连接。

u SYN:同步序列号。TCP需要建立连接时将这个值设为1。

u FIN:发送端完成发送任务,当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1。

? 窗口值:它说明本地可接收数据段的数目,这个值的大小是可变的,当网络通畅时将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP协议中的流量控制机制就是依靠变化窗口的大小实现的。

? 校验和:它是用来做差错控制的,与IP的校验和不同,TCP校验和的计算包括TCP首部、数据和其他填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次校验和计算。若这两次的校验和一致,则说明数据基本是正确的。否则将认为该数据已被破坏,接收端将丢弃该数据。

? 紧急指针:和URG配置使用,当URG=1时有效。

? 选项:在TCP首部可以有多达40字节的可选信息。

2. TCP连接

TCP是面向连接的协议,它在源点和终点之间建立一条虚连接。

在数据通信之前,发送端与接收端要先建立连接。等数据发送结束后,双方再断开连接。TCP连接的每一方都是由一个IP地址和一个端口号组成的。

1) 连接建立

TCP建立连接的过程称为三次握手:










clip_p_w_picpath001
clip_p_w_picpath002


clip_p_w_picpath003
clip_p_w_picpath004


PC1 服务器

1.clip_p_w_picpath005发送SYN报文

(Seq=x,SYN=1)

clip_p_w_picpath006 2.发送SYN+ACK报文

(Seq=y,Ack=x+1,

SYN=1,ACK=1)

3.发送ACK报文

clip_p_w_picpath007(Seq=x+1,Ack=y+1,

ACK=1)

? 第一次握手:

PC1使用一个随机的端口号向PC2的80端口发送建立连接的请求,此过程的典型标志就是TCP的SYN控制位为1,其他五个控制全为0。

? 第二次握手:

实际上是分两部分来完成的。

(1)PC2收到了PC1的请求,向PC1回复一个确认信息,此过程的典型标志就是TCP的ACK控制位为1,其他五个控制位全为0,而且确认序列号是PC1的初始序列号加1。

(2)PC2也向PC1发送建立连接的请求,此过程的典型标志和第一次握手一样,就是TCP的STN控制为1,其他五个控制全为0。

为了提高效率,一般将这两部分合并在一个数据包里实现。

? 第三次握手:

PC1收到了PC2的回复(包含请求和确认),也要向PC2回复一个确认信息,此过程的典型标志就是TCP的ACK控制位为1,其他五个控制位全为0,而且确认序列号是PC2的初始序列号加1。

注意:

? netstat命令可以显示协议统计信息和当前的TCP/IP网络连接。

? 参数-a显示所有连接和监听端口,-n以数字形式显示地址和端口号。

? 使用netstat/?可查看详细的说明。

从以上演示中可以将TCP三次握手总结为如下图所示的过程:图中Seq表示请求序列号,Ack表示确认序列号,SYN和ACK为控制位。

可以看出,SYN控制位只有在请求建立连接时才被置为1。

TCP使用面向连接的通信方式,这大大提高了数据传输的可靠性,使发送端和接受端在数据正式传输之前就有了交互,为数据正式传输打下了可靠的基础。

2) 连接终止

参加交换数据的双方中的任何一方(客户或服务器)都可以关闭连接。TCP断开连接分四步,也称为四次握手,如图所示:










clip_p_w_picpath001[1]
clip_p_w_picpath002[1]


clip_p_w_picpath008
clip_p_w_picpath009


PC1 服务器

clip_p_w_picpath0101.发送FIN/ACK报文

(FIN=1,ACK=1)

clip_p_w_picpath011 2.发送ACK报文

(ACK=1)

clip_p_w_picpath0123.发送FIN/ACK报文

(FIN=1,ACK=1)

4.发送ACK报文

clip_p_w_picpath013(ACK=1)

(1)服务器向客户端发送FIN和ACK位置1的TCP报文段。

(2)客户端向服务器返回ACK位置1的TCP报文段。

(3)客户端向服务器发送FIN和ACK位置1的TCP报文段。

(4)服务器向客户端返回ACK位置1的TCP报文段。

在TCP断开连接过程中,有一个半关闭的概念。TCP一方(通常是客户端)可以终止发送数据,但仍然可以接受数据,这被称做半关闭。具体描述如下:

? 客户端发送FIN报文段,半关闭了这个连接,服务器发送ACK报文段接受半关闭。

? 服务器继续发送数据,而客户端只发送ACK确认,不再发送任何数据。

? 当服务器已经把所有数据发送完毕时,就发送FIN报文段,客户再发送ACK报文段,这样就关闭了TCP连接。

TCP在网络中的应用范围很广,主要用在对于数据传输可靠性要求高的环境,比如大家熟悉的网页浏览,它使用的HTTP协议就是依赖TCP提供可靠性的。在使用TCP协议时,通信方对数据的可靠性要求高,即使因此降低了一点数据传输率也是可以接受的。

TCP端口及应用

端口 协议 说明

21 FTP FTP服务器所开放的控制端口

23 TELNET 用于远程登录,可以远程控制管理目标计算机

25 SMTP SMTP服务器开放的端口,用于发送邮件

80 HTTP 超文本传输协议

110 POP3 用于邮件的接受

? UDP协议

UDP是一个无连接、不保证可靠性的传输层协议,也就是说发送端不关心发送的数据是否到达目标主机,数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。

UDP的首部结构简单,在数据传输时能实现最小的开销,如果进程想发送很短的报文而不关心可靠性,就可以使用UDP。使用UDP发送很短的报文时,在发送端和接收端之间的交互要比使用TCP时少得多。

各字段的含义如下:

? 源端口号:用来标识数据发送端的进程,和TCP协议的端口号类似。

? 目的端口号:用来标识数据接收端的进程,和TCP协议的端口号类似。

? UDP长度:用来指出UDP的总长度,为首部加上数据。

? 校验和:用来完成对UDP数据的差错校验,它的计算与TCP的校验和类似。这是UDP协议提供的唯一的可靠机制。

UDP协议在实际工作中应用范围也很广,例如聊天工具QQ在处理发送短消息时就是使用了UDP的方式。不难想象,如果发送十几个字的短消息也使用TCP协议进行一系列的验证,将导致传输率大大下降。有谁愿意用一个“反应迟钝”的软件进行网络聊天呢?在网络飞速发展的今天,网络技术日新月异,对于常用的简单数据传输来说,UDP不失为一个很好的选择。在网络服务中也有用到UDP协议的,如下所示列出了UDP使用的一些常见端口:

UDP使用的一些常见端口

端口 协议 说明

69 TFTP 简单文件传输协议

111 RPC 远程过程调用

123 NTP 网络时间协议

n 访问控制列表概述

访问控制列表(ACL)是应用在路由器接口的指令列表(即规则)。这些指令列表用来告诉路由器,哪些数据包可以接收,哪些数据包需要拒绝。其基本原理:ACL使用包括技术,在路由器上读取OSI七层模型的第3层及第4层包头中的信息,如源地址、目的地址、源端口、目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的。

ACL可分为以下两种基本类型:

? 标准访问控制列表:检查数据包的源地址。其结果基于源网络/子网/主机IP地址,来决定允许还是拒绝转发数据包。它使用1-99之间的数字作为表号。

? 扩展访问控制列表:对数据包的源地址与目标地址均进行检查。它也能检查特定的协议、端口号以及其他参数。它使用100-199之间的数字作为表号。

n 访问控制列表的工作原理

ACL是一组规则的集合,它应用在路由器的某个接口上。对路由器接口而言,访问控制列表有两个方向:

? 出:已经过路由器的处理,正离开路由器接口的数据包。

? 入:已到达路由器接口的数据包,将被路由器处理。

如果对接口应用了访问控制列表,也就是说该接口应用了一组规则,那么路由器将对数据包应用该组规则进行顺序检查。

? 如果匹配第1条规则,则不再往下检查,路由器将决定该数据包允许通过或拒绝通过。

? 如果不匹配第1条规则,则依次往下检查,直到有任何一条规则匹配,路由器将决定该数据包允许通过或拒绝通过。

? 如果最后没有任何一条规则匹配,则路由器根据默认的规则将丢弃该数据包。

由此可见,数据包要么被允许,要么被拒绝。

根据以上的检查规则可知,在ACL中,各规则的放置顺序是很重要的。一旦找到了某一匹配规则,就结束比较过程,不再检查以后的其他规则。

n 访问控制列表的类型

1. 标准访问控制列表

标准访问控制列表根据数据包的源IP地址来允许或拒绝数据包。标准访问控制列表的访问控制列表号是1-99。

2. 扩展访问控制列表

扩展访问控制列表根据数据包的源IP地址、目的IP地址、指定协议、端口和标志来允许或拒绝数据包。扩展访问控制列表的访问控制列表号是100-199。

3. 命名访问控制列表

命名访问控制列表允许在标准和扩展访问控制列表中使用名称代替表号。

n 标准访问控制列表的配置

1. 创建ACL

命令语法如下:

Router(config)# access-list access-list-number {permit | deny} source [source-wildcard]

下面是命令参数的详细说明

? access-list-number访问控制列表表号,对于标准ACL来说,该表号是1-99中的一个数字。

? permit|deny如果满足测试条件,则允许/拒绝该通信流量。

? source数据包的源地址,可以是主机地址,也可以是网络地址。

? source-wildcard通配符掩码,也叫做反码。在用二进制0和1表示时,如果某位为1,表明这一位不需要进行匹配操作,如果为0,则表明这一位需要严格匹配。

例如,允许来自网络192.168.1.0/24和主机192.168.2.2的流量通过,标准ACL命令为:

Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255

Router(config)# access-list 1 permit 192.168.2.2 0.0.0.0

192.168.1.0/24的子网掩码是255.255.255.0,那么其反码可以通过255.255.255.255减去255.2553.255.0得到0.0.0.255。

同样,主机192.168.2.2的子网掩码是255.255.255.255,那么其反码可以通过255.255.255.255减去255.255.255.255得到0.0.0.0。

1) 隐含的拒绝语句

每一个ACL都有一条隐含的拒绝语句,拒绝所有流量,语句如下:

Router(config)# access-list 1 deny 0.0.0.0 255.255.255.255

2) 关键字host、any

在上面的例子中,192.168.2.2 0.0.0.0可以用“host 192.168.2.2”来表示,相应的ACL可改写为:

Router(config)# access-list 1 permit host 192.168.1.2

0.0.0.0 255.255.255.255可以使用关键字“any”来表示,相应的ACL可改写为:

Router(config)# access-list 1 deny any

3) 删除已建立的标准ACL

语法如下:

Router(config)# no access-list access-list-number

对标准ACL来说,不能删除单条ACL语句,只能删除整个ACL。这意味着如果要改变一条或几条ACL语句,必须先删除整个ACL,然后再输入所要的ACL语句。

2. 将ACL应用于接口

创建ACL后,只有将ACL应用于接口,ACL才会生效。

命令语法如下所述:

Router(config-if)# ip access-group access-list-number {in| out}

参数in|out用来指示该ACL是应用到入站接口(in),还是出站接口(out)。

要在接口上取消ACL的应用,可以使用如下命令:

Router(config-if)# no ip access-group access-list-number {in| out}

注意:每个方向上只能有一个ACL,也就是每个接口最多只能有两个ACL:一个入方向ACL,一个出方向ACL。

n 标准ACL的配置实例

clip_p_w_picpath015

实验要求:

拓扑图如上所示,需要再路由器实现如下功能,财务部的所有主机(192.168.2.0)不能访问internet,市场部中只有经理的主机(192.168.1.0)可以访问internet。

具体步骤:

1. 分析在哪个接口应用标准ACL

标准ACL既可以应用在入站接口,也可以应用在出站接口,二者有何不同呢?

路由器对进入的数据包先检查入访问控制列表,对允许传输的数据包才查询路由表,而对于外出的数据包先查询路由表,确定目标接口后才查看出访问控制列表。因此应该尽量把访问控制列表应用到入站接口,因为它比应用到出站接口效率更高:将要丢弃的数据包早路由器进行路由表查询出路之前就拒绝掉。

2. 配置全网互通

3. 配置标准ACL并应用到接口上。

命令如下所示:

clip_p_w_picpath016

4. 查看并验证配置

? 使用show access-list命令查看ACL配置,如下所示:

clip_p_w_picpath017

? 验证配置

财务部主机(192.168.2.2)不能ping通192.168.4.2,而经理主机(192.168.1.2)可以ping通192.168.4.2。

clip_p_w_picpath018