反掩码详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
反掩码详解
在配置路由协议的时候(如OSPF、EIGRP )使用的反掩码必需是连续的1即网络地址。
例: routeospf 100 network 192.168.1.0 0.0.0.255 network 192.168.2.0 0.0.0.255
而在配置ACL的时候可以使用不连续的1,只需对应的位置匹配即可。
例:access-list 1 permit 198.78.46.0 0.0.11.255
正掩码和反掩码的区别:正掩码必须是连续的,而反掩码可以不连续,例如:C类地址子网掩码中不可以出现
255.253.255.0(二进制为11111111 11111101 11111111 00000000)这样的掩码;
而反掩码可以出现0.0.0.2(二进制为00000000 00000000 00000000 00000010)。
正掩码表示的路由条目,而反掩码表示的范围。
反掩码就是通配符掩码,通过标记0和1告诉设备应该匹配到哪位。
在反掩码中,相应位为1的地址在比较中忽略,为0的必须被检查.
IP地址与反掩码都是32位的数
例如掩码是
255.255.255.0 wildcard-mask 就是0.0.0.255
255.255.255.248 反掩就是0.0.0.7
通配符掩码(wildcard-mask)
路由器使用的通配符掩码(或反掩码)与源或目标地址一起来分辨匹配的地址范围,它跟子网掩码刚好相反。
它像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配符掩码告诉路由器为了判断出匹配,它需要检查IP 地址中的多少位。
这个地址掩码对使我们可以只使用两个32位的号码来确定IP地址的范围。
这是十分方便的,因为如果没有掩码的话,你不得不对每个匹配的IP客户地址加入一个单独的访问列表语句。
这将造成很多额外的输入和路由器大量额外的处理过程。
所以地址掩码对相当有用。
在子网掩码中,将掩码的一位设成1表示IP地址对应的位属于网络地址部分。
相反,在访问列表中将通配符掩码中的一位设成1表示I P地址中对应的位既可以是1又可以是0。
有时,可将其称作“无关”位,因为路由器在判断是否匹配时并不关心它们。
掩码位设成0则表示IP地址中相对应的位必须精确匹配。
通配符掩码表
CIDR子网掩码反掩码
/30 255.255.255.252 0.0.0.3
/29 255.255.255.248 0.0.0.7
/28 255.255.255.240 0.0.0.15
/27 255.255.255.224 0.0.0.31
/26 255.255.255.192 0.0.0.63
/25 255.255.255.128 0.0.0.127
/24 255.255.255.0 0.0.0.255
/23 255.255.254.0 0.0.1.255
/22 255.255.252.0 0.0.3.255
/21 255.255.248.0 0.0.7.255
/20 255.255.240.0 0.0.15.255
/19 255.255.224.0 0.0.31.255
/18 255.255.192.0 0.0.63.255
/17 255.255.128.0 0.0.127.255
/16 255.255.0.0 0.0.255.255
/15 255.254.0.0 0.1.255.255
/14 255.252.0.0 0.3.255.255
/13 255.248.0.0 0.7.255.255
/12 255.240.0.0 0.15.255.255
/11 255.224.0.0 0.31.255.255
/10 255.192.0.0 0.63.255.255
/9 255.128.0.0 0.127.255.255
/8 255.0.0.0 0.255.255.255
十进制通配符掩码计算方法
用二进制来表示子网掩码值,再用广播地址求其差值,然后再算回十进制。
即,推出公式:通配符掩码=255-掩码.255-掩码.255-掩码.255-掩码
举例一
求子网掩码255.255.255.248通配符掩码(反掩码)
(1)、把子网掩码255.255.255.248转换成二进制为:
11111111.11111111.11111111.11111000
通配符掩码值为:广播全1(二进制)地址减去子网掩码二制制值,即:
11111111.11111111.11111111.11111111 - 11111111.11111111.11111111.11111000 得到结果为:
00000000.00000000.00000000.00000111
转换为十进制:
0.0.0.7
(2)、通配符掩码=255-掩码.255-掩码.255-掩码.255-掩码,即:
255-255.255-255.255-255.255-248=0.0.0.7
举例二
求子网掩码255.255.128.0通配符掩码(反掩码)
(1)、把子网掩码255.255.128.0转换成二进制为:
11111111.11111111.10000000.0000000
通配符掩码值为:广播全1(二进制)地址减去子网掩码二制制值,即:
11111111.11111111.11111111.11111111 - 11111111.11111111.10000000.0000000
得到结果为:
00000000.00000000.01111111.11111111
转换为十进制:
0.0.127.255
(2)、通配符掩码=255-掩码.255-掩码.255-掩码.255-掩码,即:
IP访问控制列表(access control list,ACL)用于过滤IP流量,其中RFC 1700定义了知名(well-known)端口号,RFC 1918定义了私有IP地址空间
Pt.2 Understanding ACL Concepts
Using Masks
ACL里的掩码也叫inverse mask(反掩码)或wildcard mask(通配符掩码),由32位长的2进制数字组成,4个八位位组.其中0代表必须精确匹配,1代表任意匹配(即不关心) 反掩码可以通过使用255.255.255.255减去正常的子网掩码得到,比如要决定子网掩码为255.255.255.0的IP地址172.16.1.0的反掩码:
255.255.255.255-255.255.255.0=0.0.0.255 即172.16.1.0的反掩码为0.0.0.255
注意:
反掩码为255.255.255.255的0.0.0.0代表any,即任意地址
反掩码为0.0.0.0的10.1.1.2代表主机地址10.1.1.2
Summarizing ACLs
下面描述的是如何汇总(summarization)一组网络地址,来达到优化ACL的目的:
192.168.32.0/24
192.168.33.0/24
192.168.34.0/24
192.168.35.0/24
192.168.36.0/24
192.168.37.0/24
192.168.38.0/24
192.168.39.0/24
这组IP地址的前2个和最后1个八位位组是一样的,再看第3个八位位组,把它们写成2进制的形式:
32:00 10 00 00
33:00 10 00 01
34:00 10 00 10
35:00 10 00 11
36:00 10 01 00
37:00 10 01 01
38:00 10 01 10
39:00 10 01 11
注意这组范围里的前5位都是一样的,所以这组IP地址范围可以汇总为192.168.32.0/21 255.255.248.0,那么这组IP 地址范围的反掩码为255.255.255.255-255.255.248.0=0.0.7.255
比如在做IP standard ACL的时候,就可以:
access-list 10 permit 192.168.32.0 0.0.7.255
再来看另一组IP地范围:
192.168.146.0/24
192.168.147.0/24
192.168.148.0/24
192.168.149.0/24
照之前的方法,把第3个八位位组写成2进制形式:
146:10 01 00 10
147:10 01 00 11
148:10 01 01 00
149:10 01 01 01
是不是可以写成192.168.146.0/21呢?不是.因为采用/21的话将有8个子网将被考虑进去,如果在用ACL拒绝上述1组地址的时候,就有可能把另外4个地址给封杀掉.一定要考虑到精确匹配,上述地址就只能汇总成下面这2条地址:
对于192.168.146.x-192.168.147.x为:192.168.146.0/23(192.168.146.0 255.255.254.0)
对于192.168.146.8-192.168.149.x为:192.168.148.0/23(192.168.148.0 255.255.254.0)
所以反掩码分别为:0.0.1.255和0.0.1.255
比如在做IP standard ACL的时候,就可以:
access−list 10 permit 192.168.146.0 0.0.1.255
access−list 10 permit 192.168.148.0 0.0.1.255
Processing ACLs
当流量经过了配置的有ACL的路由器的时候,将和ACL里的条目从上往下的进行比较,直到找到匹配的语句为止,如果没有任何匹配的语句,流量将被拒绝(deny)掉.一般在设置ACL的时候,尽可能的把permit语句放在ACL的最上部.并且要记住的是,ACL在结尾处默认隐含的有1条拒绝所有流量的deny语句,如下2个ACL,ACL 101和ACL 102是有相同的效果的:
access-list 101 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
access-list 102 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
access-list 102 deny ip any any
ACL例子如下:
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1
access-list 101 permit udp host 10.1.1.2 host 172.16.1.1
access-list 101 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
最后1条语句就足够了,前3条语句可以不用配置.因为TCP就包括了telnet,并且IP包括了TCP和UDP.所以只需要写最后1条语句即可
Defining Ports and Message Types
在设置ACL的时候,可能不光要设置源地址和目标地址,还要设置端口号(参阅RFC 1700)或ICMP信息类型(参阅RFC 792).当然可以在设置的时候输入?来查看提示,如下:
access-list 102 permit tcp host 10.1.1.1 host 172.16.1.1 eq ?
bgp Border Gateway Protocol (179)
chargen Character generator (19)
cmd Remote commands (rcmd, 514)
在配置的时候,路由器同样可以把数字转化为人性化的值,比如在设置下面的ICMP类型14的时候:
access-list 102 permit icmp host 10.1.1.1 host 172.16.1.1 14
就成了:
access-list 102 permit icmp host 10.1.1.1 host 172.16.1.1 timestamp-reply
Applying ACLs
当你配置了ACL的时候,不在路由器上应用它,是将不会生效的.如下图:
当你要阻断从source到destination的流量的时候,尽可能的把ACL设置在离源地址近的地方,即在路由器A上的E0接口(inbound)
Defining in and out
in和out是相对于路由器来说的.离开路由器接口的流量即为out;进入这个路由器的接口的流量即为in.在配置ACL的时候,in和out并不是绝对的.比如上面那个例子,在路由器A上设置ACL,方向就要用in,因为站在路由器A的角度上看,流量是进入路由器A的.但是同样可以把ACL设置在路由器C上的E1接口,方向为out,因为流量是离开路由器C
Editing ACLs
在对ACL进行编辑的时候要特别的注意.如果你删除了ACL中某条语句,那么整个ACL也随之被删除掉了.如下:
router#config t
router(config)#access-list 101 deny icmp any any
router(config)#access-list 101 permit ip any any
router(config)#^Z
router#show access-list
Extended IP access list 101
deny icmp any any
permit ip any any
router#
*Mar 9 00:43:12.784: %SYS-5-CONFIG_I:
Configured from console by console
router#config t
router(config)#no access-list 101 deny icmp any any
router(config)#^Z
router#show access-list
router#
*Mar 9 00:43:29.832:
%SYS-5-CONFIG_I: Configured from console by console
所以如果你要修改ACL的语句的时候,可以把路由器的配置拷贝到TFTP服务器上,用文本编辑器比如notepad.exe进行编辑后,在拷贝回路由器上
当然也可以用命名访问列表的方式进行修改(稍后讲解),如下:
router#config t
router(config)#ip access-list extended test
router(config-ext-nacl)#permit ip host 2.2.2.2 host 3.3.3.3
router(config-ext-nacl)#permit tcp host 1.1.1.1 host 5.5.5.5 eq www
router(config-ext-nacl)#permit icmp any any
router(config-ext-nacl)#permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain
验证下ACL的设置,如下:
router#show access-list
Extended IP access list test
permit ip host 2.2.2.2 host 3.3.3.3
permit tcp host 1.1.1.1 host 5.5.5.5 eq www
permit icmp any any
permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain
设置好ACL,进行删除和增加语句,如下:
router(config)#ip access-list extended test
router(config-ext-nacl)#no permit icmp any any /---------------删除1条语句---------/
router(config-ext-nacl)#permit gre host 4.4.4.4 host 8.8.8.8 /---------------增加1条语句---------/
修改后进行验证,如下:
router#show access-list
Extended IP access list test
permit ip host 2.2.2.2 host 3.3.3.3
permit tcp host 1.1.1.1 host 5.5.5.5 eq www
permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain
permit gre host 4.4.4.4 host 8.8.8.8
可以看到新增的语句位于ACL的结尾
当要删除整个ACL的时候,使用如下命令:
interface <interface>
no ip access-group <acl number>in|out
Troubleshooting
当要对流量进行debug的时候,首先要确认,当前设置的有ACL,但是没有应用它,并且路由器的fast-switching要关闭,步骤如下:
1.使用access-list命令捕捉需要监测的数据,比如:
access-list 101 permit ip any host 10.2.6.6
access-list 101 permit ip host 10.2.6.6 any
2.在卷入debug过程中的接口的fast-switching功能要关闭,如果不关闭的话,将只看的到第一个经过该接口的包.在接口配置模式下使用如下命令:
no ip route-cache
3.在特权模式下使用terminal monitor命令,这样debug输出的信息将被显示
4.使用debug ip packet 101 [detail]命令开始debug
5.debug完成以后,在特权模式下使用no debug all命令关闭debug.并且进入接口配置模式使用ip route-cache命令打开fast-switching功能
Pt.3 Types of IP ACLs
Standard ACLs
标准ACL是比较古老的ACL,可以追溯到Cisco IOS Release 8.3.标准ACL(以IP访问列表为例)通过比较IP包的源地址和ACL中设置的地址来做转发或者丢弃的决定.语法如下:
access-list <access-list-number> {permit|deny} {host |source wildcard-mask | any}
在一般的IOS版本中,access-list-number的范围是1到99.在Cisco IOS Release 12.0.1中,还可以使用额外的一段1300到1999
当定义了标准ACL以后,进入接口配置模式使用如下命令进行应用:
ip access-group <access-list-number> {in|out}
Extended ACLs
扩展ACL是在Cisco IOS Release 8.3中引入的.顾名思义,它和之前那种古老的比较方式,增加了许多额外的比较.命令如下:
对于IP:
access-list <access-list-number> [dynamic dynamic-name [timeout minutes]] {deny | permit} protocol source wildcard-mask destination wildcard-mask [precedence precedence] [tostos] [log | log-input] [time-range time-range-name]
对于ICMP:
access-list <access-list-number> [dynamic dynamic-name [timeout minutes]] {deny | permit} icmp source wildcard-mask destination wildcard-mask [icmp-type | [[icmp-type icmp-code] | [icmp-message]] [precedenceprecedence] [tostos] [log | log-input] [time-range time-range-name]
对于UDP:
access-list <access-list-number> [dynamic dynamic-name [timeout minutes]] {deny | permit} udp source wildcard-mask [operator [port]] destination wildcard-mask [operator [port]] [precedence precedence] [tostos] [log | log-input] [time-range time-range-name]
对于TCP:
access-list <access-list-number> [dynamic dynamic-name [timeout minutes]] {deny | permit} tcp source wildcard-mask [operator [port]] destination wildcard-mask [operator [port]] [precedence precedence] [tostos] [log | log-input] [time-range time-range-name]
在一般的IOS版本里,access-list-number可以为101到199.在Cisco IOS Release 12.0.1以后,还可以额外的使用2000到2699
再接下来就要将定义好的ACL应用在接口上,命令如下(接口配置模式下):
ip access-group {acl-number | acl-name} {in|out}
Lock and Key (Dynamic ACLs)
Lock and Key(也叫动态ACL)是在Cisco IOS Release 11.1引入的.这个特性是依靠于telnet,验证(authentication,本
地和远程)还有扩展ACL的
Lock and Key的配置是在应用ACL的时候进行设置的,当验证通过以后,才允许telnet,语法如下:
username <username> password <password>
interface <interface>
ip access-group {number|name} {in|out}
验证之后将动态的往现有ACL里增加1条语句,语法如下:
access-list <access-list-number> dynamic <name> {permit|deny} [protocol] {source wildcard-mask|any} {destination wildcard-mask|any} [precedence precedence] [tostos] [established] [log|log-input] [operator destination-port|destination port]
接下来:
line vty<line_range>
login local
如下就是一个Lock and Key的配置例子:
username test password 0 test
username test autocommand access-enable host timeout 10 /-----定义空闲超时时间为10分钟---/ interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in
access-list 101 permit tcp any host 10.1.1.1 eq telnet
access-list 101 dynamic testlist timeout 15 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
line vty 0 4
login local
当10.1.1.2要telnet到10.1.1.1的时候,动态ACL将被应用.当telnet连接断开以后,用户就可以访问172.16.1.x网络
IP Named ACLs
命名ACL是在Cisco IOS Release 11.2引入的,它允许用命名的方式取代数字,IP命名ACL语法如下:
ip access-list {extended|standard} <name>
如下是一个使用命名ACL来阻断除telnet以外10.1.1.2到172.16.1.1的流量的例子
interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group in_to_out in
ip access-list extended in_to_out
permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet:
Reflexive ACLs
反身ACL是在Cisco IOS Release 11.3引入的.它只能和扩展的命名IP ACL一起定义而不能和基于数字的或标准ACL,以及其他协议的ACL一起.语法如下:
ip access-list extended <name> permit <protocol> any any reflect name [timeout <seconds>]
ip access-list extended <name> evaluate <name>
interface <interface>
ip access-group {number|name} {in|out}
下面引用一个例子(原作者: alienguo 出处:雨声论坛
好,现在进行测试,在10.1.1.2上ping 192.1.1.2,通了,RouterB上则ping不通10.1.1.2.
现在还余下一个问题:路由器既然已经deny了外网进来的所有流量,那么它是怎么允许内网出去的返回流量进来呢?
它是通过创建动态生成的ACL来允许返回流量的,下面看看show access-list的结果:
……
Reflexive IP access list icmp_traffic
permit icmp host 192.1.1.2 host 10.1.1.2 (24 matches) (time left 196)
……
这些动态ACL可通过TCP的FIN/RST包来动态自动消除,对ICMP这样stateless的包来说,是通过内置的timer来消除的,这点可通过上述show access-list结果中的(time left 196)来核实.
最后再说说那另一个测试,也就是两个ACL中加的多余的东西:
ip access-list extended outbound_filter
permit ip any any
ip access-list extended inbound_filter
deny ip any any log
我在10.1.1.2上发起一个到192.1.1.2的TELNET连接,这个流量到了S0口后由ACL outbound_filter中的permit ip any any检测后放行.到了RouterB后,RouterB进行处理然后返回流量,这个流量到了S0口后由inbound_filter检测,因为evaluate icmp_traffic中并没有包含对TCP类型流量的检测,这个包由deny ip any any log一句处理后丢弃并生成日志:
00:24:28: %SEC-6-IPACCESSLOGP: list inbound_filter denied tcp 192.1.1.2(23) -> 10.1.1.2(1483), 1 packet
Time-Based ACLs Using Time Ranges
基于时间的ACL是在Cisco IOS 12.0.1T中引入的,顾名思义,它对流量的控制可以是基于时间的.命令如下:
1.定义time range(时间范围):
time-range <time-range-name>
2.定义时间周期:
periodic [days-of-the-week] hh:mm to [days-of-the-week] hh:mm
或,定义绝对时间:
absolute [start time date] [end time date]
3.把time range使用在ACL中:
ip access-list <name|number><extended_definition> time-range <name_of_time-range>
例子如下:
time-range EVERYOTHERDAY
periodic Monday Wednesday Friday 8:00 to 17:00
access-list 101 permit tcp 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255 eq telnet time-range EVERYOTHERDAY
interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in
Commented IP ACL Entries
为ACL语句标记注释这个特性是在Cisco IOS Release 12.0.2.T中引入的.
为命名ACL添加注释的语法为:
ip access-list {standard|extended} <name> remark <remark>
为基于数字的ACL添加注释的语法为:
access-list <access-list-number> remark <remark>
例子如下:
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet
access-list 101 remark permit_telnet
interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in。