ACL的常用匹配项设备支持的ACL匹配项种类非常丰富,其中最常用的匹配项包括以下几种。
生效时间段格式:time-range time-name
所有ACL均支持根据生效时间段过滤报文。关于生效时间段的详细介绍,请参见ACL的生效时间段。
IP承载的协议类型格式:protocol-number | icmp | tcp | udp | gre | igmp | ip | ipinip | ospf
高级ACL支持基于协议类型过滤报文。常用的协议类型包括:ICMP(协议号1)、TCP(协议号6)、UDP(协议号17)、GRE(协议号47)、IGMP(协议号2)、IP(指任何IP层协议)、IPinIP(协议号4)、OSPF(协议号89)。协议号的取值可以是1~255。
例如,当设备某个接口下的用户存在大量的攻击者时,如果希望能够禁止这个接口下的所有用户接入网络,则可以通过指定协议类型为IP来屏蔽这些用户的IP流量来达到目的。配置如下:
rule deny ip //表示拒绝IP报文通过再如,设备上打开透明防火墙功能后,在缺省情况下,透明防火墙会在域间丢弃所有入域间的报文,包括业务报文和协议报文。如果希望像OSPF这样的动态路由协议报文能正常通过防火墙,保证路由互通,这时,通过指定协议类型为OSPF即可解决问题。
rule permit ospf //表示允许OSPF报文通过
源/目的IP地址及其通配符掩码源IP地址及其通配符掩码格式:source { source-address source-wildcard | any }
目的IP地址及其通配符掩码格式:destination { destination-address destination-wildcard | any }
基本ACL支持根据源IP地址过滤报文,高级ACL不仅支持源IP地址,还支持根据目的IP地址过滤报文。
将源/目的IP地址定义为规则匹配项时,需要在源/目的IP地址字段后面同时指定通配符掩码,用来与源/目的IP地址字段共同确定一个地址范围。
IP地址通配符掩码与IP地址的反向子网掩码类似,也是一个32比特位的数字字符串,用于指示IP地址中的哪些位将被检查。各比特位中,“0”表示“检查相应的位”,“1”表示“不检查相应的位”,概括为一句话就是“检查0,忽略1”。但与IP地址子网掩码不同的是,子网掩码中的“0”和“1”要求必须连续,而通配符掩码中的“0”和“1”可以不连续。
通配符掩码可以为0,相当于0.0.0.0,表示源/目的地址为主机地址;也可以为255.255.255.255,表示任意IP地址,相当于指定any参数。
举一个IP地址通配符掩码的示例,当希望来自192.168.1.0/24网段的所有IP报文都能够通过,可以配置如下规则:
rule 5 permit ip source 192.168.1.0 0.0.0.255规则中的通配符掩码为0.0.0.255,表示只需检查IP地址的前三组二进制八位数对应的比特位。因此,如果报文源IP地址的前24个比特位与参照地址的前24个比特位(192.168.1)相同,即报文的源IP地址是192.168.1.0/24网段的地址,则允许该报文通过。表1-3展示了该例的地址范围计算过程。
表1-3 通配符掩码示例[td]
项目 | | |
参照地址 | 192.168.1.0 | 11000000.10101000.00000001.00000000 |
通配符掩码 | 0.0.0.255 | 00000000.00000000.00000000.11111111 |
确定的地址范围 | 192.168.1.* *表示0~255之间的整数 | 11000000.10101000.00000001.xxxxxxxx x既可以是0,也可以是1 |
更多的IP地址与通配符掩码共同确定的地址范围示例,详见表1-4。
表1-4 IP地址与通配符掩码共同确定的地址范围[td]
IP地址 | | |
0.0.0.0 | 255.255.255.255 | 任意IP地址 |
172.18.0.0 | 0.0.255.255 | 172.18.0.0/16网段的IP地址 |
172.18.5.2 | 0.0.0.0 | 仅172.18.5.2这一个主机地址 |
172.18.8.0 | 0.0.0.7 | 172.18.8.0/29网段的IP地址 |
172.18.8.8 | 0.0.0.7 | 172.18.8.8/29网段的IP地址 |
10.1.2.0 | 0.0.254.255(通配符掩码中的1和0不连续) | 10.1.0.0/24~10.1.254.0/24网段之间且第三个字节为偶数的IP地址,如10.1.0.0/24、10.1.2.0/24、10.1.4.0/24、10.1.6.0/24等。 |
源/目的MAC地址及其通配符掩码源MAC地址及其通配符掩码格式:source-mac source-mac-address [ source-mac-mask ]
目的地址及其通配符掩码格式:destination-mac dest-mac-address [ dest-mac-mask ]
仅二层ACL支持基于源/目的MAC地址过滤报文。
将源/目的MAC地址定义为规则匹配项时,可以在源/目的MAC地址字段后面同时指定通配符掩码,用来与源/目的MAC地址字段共同确定一个地址范围。
MAC地址通配符掩码的格式与MAC地址相同,采用十六进制数表示,共六个字节(48位),用于指示MAC地址中的哪些位将被检查。与IP地址通配符掩码不同的是,MAC地址通配符掩码各比特位中,1表示“检查相应的位”,0表示“不检查相应的位”。如果不指定通配符掩码,则默认掩码为ffff-ffff-ffff,表示检查MAC地址的每一位。
MAC地址与通配符掩码共同确定的地址范围示例,如表1-5所示。
表1-5 MAC地址与通配符掩码共同确定的地址范围[td]
MAC地址 | | |
00e0-fc01-0101 | 0000-0000-0000 | 任意MAC地址 |
00e0-fc01-0101 | ffff-ffff-ffff | 仅00e0-fc01-0101这一个MAC地址 |
00e0-fc01-0101 | ffff-ffff-0000 | 00e0-fc01-0000~00e0-fc01-ffff |
VLAN编号及其掩码外层VLAN及其掩码格式:vlan-id vlan-id [ vlan-id-mask ]
内层VLAN及其掩码格式:cvlan-id cvlan-id [ cvlan-id-mask ]
二层ACL支持基于外层VLAN或内层VLAN编号过滤报文。
将VLAN编号定义为规则匹配项时,可以在VLAN编号字段后面同时指定VLAN掩码,用来与VLAN编号字段共同确定一个VLAN范围。
VLAN掩码的格式是十六进制形式,取值范围是0x0~0xFFF。如果不指定VLAN掩码,则默认掩码为0xFFF,表示检查VLAN编号的每一位。
VLAN编号与掩码共同确定的VLAN范围示例,如表1-6所示。
表1-6 VLAN编号及其掩码共同确定的VLAN范围[td]
VLAN编号 | | |
10 | 0x000 | 任意VLAN |
10 | 0xFFF | 仅VLAN 10 |
10 | 0xFF0 | VLAN 1~VLAN 10 |
TCP/UDP端口号源端口号格式:source-port { eq port | gt port | lt port | range port-start port-end }
目的端口号格式:destination-port { eq port | gt port | lt port | range port-start port-end }
在高级ACL中,当协议类型指定为TCP或UDP时,设备支持基于TCP/UDP的源/目的端口号过滤报文。
其中,TCP/UDP端口号的比较符含义如下:
- eq port:指定等于源/目的端口。
- gt port:指定大于源/目的端口。
- lt port:指定小于源/目的端口。
- range port-start port-end:指定源/目的端口的范围。port-start是端口范围的起始,port-end是端口范围的结束。
TCP/UDP端口号可以使用数字表示,也可以用字符串(助记符)表示。例如,rule deny tcp destination-port eq 80,可以用rule deny tcp destination-port eq www替代。常见TCP端口号及对应的字符串如表1-7所示,常见UDP端口号及对应的字符串如表1-8所示。
表1-7 常见TCP端口号及对应的字符串[td]
端口号 | | | |
7 | echo | Echo | Echo服务 |
9 | discard | Discard | 用于连接测试的空服务 |
13 | daytime | Daytime | 给请求主机发送日期和时间 |
19 | CHARgen | Character generator | 字符生成服务;发送无止境的字符流 |
20 | ftp-data | FTP data connections | FTP数据端口 |
21 | ftp | File Transfer Protocol(FTP) | 文件传输协议(FTP)端口 |
23 | telnet | Telnet | Telnet服务 |
25 | smtp | Simple Mail Transport Protocol (SMTP) | 简单邮件传输协议 |
37 | time | Time | 时间协议 |
43 | whois | Nickname(WHOIS) | 目录服务 |
49 | tacacs | TAC Access Control System (TACACS) | 用于基于TCP/IP验证和访问的访问控制系统(TACACS登录主机协议) |
53 | domain | Domain Name Service (DNS) | 域名服务 |
70 | gopher | Gopher | 信息检索协议(互联网文档搜寻和检索) |
79 | finger | Finger | 用于用户联系信息的Finger服务,查询远程主机在线用户等信息 |
80 | www | World Wide Web (HTTP) | 用于万维网(WWW)服务的超文本传输协议(HTTP),用于网页浏览 |
101 | hostname | NIC hostname server | NIC机器上的主机名服务 |
109 | pop2 | Post Office Protocol v2 | 邮件协议-版本2 |
110 | pop3 | Post Office Protocol v3 | 邮件协议-版本3 |
111 | sunrpc | Sun Remote Procedure Call (RPC) | SUN公司的远程过程调用(RPC)协议,用于远程命令执行,被网络文件系统(NFS)使用 |
119 | nntp | Network News Transport Protocol (NNTP) | 网络新闻传输协议,承载USENET通信 |
179 | bgp | Border Gateway Protocol (BGP) | 边界网关协议 |
194 | irc | Internet Relay Chat (IRC) | 互联网中继聊天(多线交谈协议) |
512 | exec | Exec (rsh) | 用于对远程执行的进程进行验证 |
513 | login | Login (rlogin) | 远程登录 |
514 | cmd | Remote commands | 远程命令,不必登录的远程shell(rshell)和远程复制(rcp) |
515 | lpd | Printer service | 打印机(lpr)假脱机 |
517 | talk | Talk | 远程对话服务和客户 |
540 | uucp | Unix-to-Unix Copy Program | Unix到Unix复制服务 |
543 | klogin | Kerberos login | Kerberos版本5(v5)远程登录 |
544 | kshell | Kerberos shell | Kerberos版本5(v5)远程shell |
表1-8 常见UDP端口号及对应的字符串[td]
端口号 | | | |
7 | echo | Echo | Echo服务 |
9 | discard | Discard | 用于连接测试的空服务 |
37 | time | Time | 时间协议 |
42 | nameserver | Host Name Server | 主机名服务 |
53 | dns | Domain Name Service (DNS) | 域名服务 |
65 | tacacs-ds | TACACS-Database Service | TACACS数据库服务 |
67 | bootps | Bootstrap Protocol Server | 引导程序协议(BOOTP)服务端,DHCP服务使用 |
68 | bootpc | Bootstrap Protocol Client | 引导程序协议(BOOTP)客户端,DHCP客户使用 |
69 | tftp | Trivial File Transfer Protocol (TFTP) | 小文件传输协议 |
90 | dnsix | DNSIX Security Attribute Token Map | DNSIX安全属性标记图 |
111 | sunrpc | SUN Remote Procedure Call (SUN RPC) | SUN公司的远程过程调用(RPC)协议,用于远程命令执行,被网络文件系统(NFS)使用 |
123 | ntp | Network Time Protocol (NTP) | 网络时间协议,蠕虫病毒会利用 |
137 | netbios-ns | NETBIOS Name Service | NETBIOS名称服务 |
138 | netbios-dgm | NETBIOS Datagram Service | NETBIOS数据报服务 |
139 | netbios-ssn | NETBIOS Session Service | NETBIOS会话服务 |
161 | snmp | SNMP | 简单网络管理协议 |
162 | snmptrap | SNMPTRAP | SNMP陷阱 |
177 | xdmcp | X Display Manager Control Protocol (XDMCP) | X显示管理器控制协议 |
434 | mobilip-ag | MobileIP-Agent | 移动IP代理 |
435 | mobilip-mn | MobileIP-MN | 移动IP管理 |
512 | biff | Mail notify | 异步邮件,可用来通知用户有邮件到达 |
513 | who | Who | 登录的用户列表 |
514 | syslog | Syslog | UNIX系统日志服务 |
517 | talk | Talk | 远程对话服务器和客户端 |
520 | rip | Routing Information Protocol | RIP路由协议 |
TCP标志信息格式:tcp-flag { ack | established | fin | psh | rst | syn | urg }*
在高级ACL中,当协议类型指定为TCP时,设备支持基于TCP标志信息过滤报文。
TCP报文头有6个标志位:
- URG(100000):标识紧急指针有效
- ACK(010000):标识确认序号有效
- PSH(001000):标识接收方应该尽快将这个报文段上交给应用层
- RST(000100):标识重建连接
- SYN(000010):同步序号,用来发起一个连接
- FIN(000001):标识发送方完成发送任务
TCP标志信息中的established,表示标志位为ACK(010000)或RST(000100)。
指定tcp-flag的ACL规则可以用来实现单向访问控制。假设,要求192.168.1.0/24网段用户可以主动访问192.168.2.0/24网段用户,但反过来192.168.2.0/24网段用户不能主动访问192.168.1.0/24。可通过在设备上连接192.168.2.0/24网段的接口入方向上,应用ACL规则来实现该需求。
由TCP建立连接和关闭连接的过程可知,只有在TCP中间连接过程的报文才会ACK=1或者RST=1。根据这个特点,配置如下两种ACL规则,允许TCP中间连接过程的报文通过,拒绝该网段的其他TCP报文通过,就可以限制192.168.2.0/24网段主动发起的TCP连接。
- 类型一:配置指定ack和rst参数的ACL规则rule 5 permit tcp source 192.168.2.0 0.0.0.255 tcp-flag ack //允许ACK=1的TCP报文通过 rule 10 permit tcp source 192.168.2.0 0.0.0.255 tcp-flag rst //允许RST=1的TCP报文通过 rule 15 deny tcp source 192.168.2.0 0.0.0.255 //拒绝该网段的其他TCP报文通过
- 类型二:配置指定established参数的ACL规则rule permit tcp source 192.168.2.0 0.0.0.255 tcp-flag established // established表示ACK=1或者RST=1,表示允许TCP中间连接过程的报文通过 rule deny tcp source 192.168.2.0 0.0.0.255 //拒绝该网段的其他TCP报文通过
IP分片信息格式:none-first-fragment
基本ACL和高级ACL支持基于IP分片信息过滤报文。
IP分片除了首片报文外,还有后续分片报文,又叫做非首片分片报文。仅首片分片报文携带四层信息(如TCP/UDP端口号等),后续分片报文均不携带。网络设备收到分片报文后,会判断其是否是最后一个分片报文。如果不是,则为其分配内存空间,以便于最后一个分片报文到达后完成重组。黑客可以利用这一点,向接收方设备发起分片报文攻击,始终不向接收方发送最后一个分片报文,使得接收方的内存得不到及时释放(接收方会启动一个分片重组的定时器,在定时器超时前如果无法完成重组,将向发送方发送ICMP重组超时差错报文;如果定时器超时后仍未完成重组,则丢弃已存储的分片报文)。在分片报文发送数量很多并且发送速度很快的情况下,接收方的内存很容易被占满,从而导致接收方没有足够的内存资源处理其他正常的业务。
为了解决这个问题,可以配置指定none-first-fragment匹配项的ACL规则来阻塞非首片分片报文,从而达到防范分片报文攻击的目的。
针对非分片报文、首片分片报文、非首片分片报文这三类报文,ACL的处理方式如表1-9所示。
表1-9 ACL对IP分片报文的处理方式[td]
规则包含的匹配项 | | | |
三层信息(如源/目的IP地址) | 三层信息匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 | 三层信息匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 | 三层信息匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 |
三层信息 + 四层信息(如TCP/UDP端口号) | 三层和四层信息都匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 | 三层和四层信息都匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 | 不匹配,转下一条规则进行匹配 |
三层信息 + none-first-fragment | 不匹配,转下一条规则进行匹配 | 不匹配,转下一条规则进行匹配 | 三层信息匹配上,则返回匹配结果(permit/deny);未匹配上,则转下一条规则进行匹配 |
例如,ACL 3012中存在以下规则:
# acl number 3012 rule 5 deny tcp destination 192.168.2.2 0 none-first-fragment rule 10 permit tcp destination 192.168.2.2 0 destination-port eq www rule 15 deny ip # - 该报文是非分片报文或首片分片报文时:如果该报文的目的端口号是80(www对应的端口号是80),则报文与rule 10匹配,报文被允许通过;如果该报文的目的端口号不是80,则报文与rule 15匹配,报文被拒绝通过。
- 该报文是非首片分片报文时:该报文与rule 5匹配,报文被拒绝通过。