反掩码详解————————————————————————————————作者: ————————————————————————————————日期:ﻩ反掩码详解在配置路由协议的时候(如OSPF、EIGRP )使用的反掩码必需是连续的1即网络地址。
例:route ospf 100 network 192.168.1.00.0.0.255 network 192.168.2.00.0.0.255 而在配置ACL的时候可以使用不连续的1,只需对应的位置匹配即可。
例:access-list 1 permit 198.78.46.0 0.0.11.255ﻫ正掩码和反掩码的区别:正掩码必须是连续的,而反掩码可以不连续,例如:C类地址子网掩码中不可以出现255.253.255.0(二进制为111111111111110111111111 00000000)这样的掩码;而反掩码可以出现0.0.0.2(二进制为00000 00000)。
正掩码表示的路由条目,而反掩码表示的范围。
反掩码就是通配符掩码,通过标记0和1告诉设备应该匹配到哪位。
在反掩码中,相应位为1的地址在比较中忽略,为0的必须被检查.IP地址与反掩码都是32位的数例如掩码是255.255.255.0 wildcard-mask 就是0.0.0.255255.255.255.248 反掩就是0.0.0.7通配符掩码(wildcard-mask)ﻫ路由器使用的通配符掩码(或反掩码)与源或目标地址一起来分辨匹配的地址范围,它跟子网掩码刚好相反。
它像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配符掩码告诉路由器为了判断出匹配,它需要检查IP地址中的多少位。
这个地址掩码对使我们可以只使用两个32位的号码来确定IP地址的范围。
这是十分方便的,因为如果没有掩码的话,你不得不对每个匹配的IP客户地址加入一个单独的访问列表语句。
这将造成很多额外的输入和路由器大量额外的处理过程。
所以地址掩码对相当有用。
ﻫ在子网掩码中,将掩码的一位设成1表示IP地址对应的位属于网络地址部分。
相反,在访问列表中将通配符掩码中的一位设成1表示I P地址中对应的位既可以是1又可以是0。
有时,可将其称作“无关”位,因为路由器在判断是否匹配时并不关心它们。
掩码位设成0则表示IP地址中相对应的位必须精确匹配。
ﻫﻫﻫ通配符掩码表CIDR子网掩码反掩码25 30/ ﻫ5.255.255.252 0.0.0.3255.2 29/ ﻫ55.255.248 0.0.0.7255.255.255.224 0.0.0.31ﻫ/26 255.255.255.27/28 255.255.255.240 0.0.0.15ﻫ/1920.0.0.63ﻫ/25 255.255.255.128 0.0.0.127255.255.254.0 0.0.1.25523/24 255.255.255.00.0.0.255ﻫ//22255.255.252.00.0.3.255/21 255.255.248.0 0.0.7.25518255.255.19//20255.255.240.0 0.0.15.255ﻫ/19 255.255.224.00.0.31.255ﻫ2.00.0.63.255/17 255.255.128.0 0.0.127.255ﻫ/16255.255.0.00.0.255.255ﻫ/15255.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ﻫ/12255.240.0.00.15.255.255ﻫ/11 255.224.0.0/9255.128.0.0 0.127.255.255 0.31.255.255ﻫ/10 255.192.0.00.63.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-掩码,即: ﻫ255-255.255-255.255-128.255-0=0.0.127.255ﻫConfiguring IP AccessListIP访问控制列表(accesscontrollist,ACL)用于过滤IP流量,其中RFC 1700定义了知名(well-kno wn)端口号,RFC 1918定义了私有IP地址空间ﻫﻫPt.2 Understanding ACL ConceptsﻫﻫUsing Mask sﻫﻫACL里的掩码也叫inverse mask(反掩码)或wildcardmask(通配符掩码),由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/24192.168.35.0/24192.168.33.0/24ﻫ192.168.34.0/24ﻫ192.168.36.0/24192.168.38.0/24192.168.37.0/24ﻫ192.168.39.0/24ﻫ这组IP地址的前2个和最后1个八位位组是一样的,再看第3个八位位组,把它们写成2进制的形式:36:00 10 01 0034:0010 0010ﻫ35:001000 11ﻫ32:0010 00 00ﻫ33:00 10 00 01ﻫ37:00 10 01 0138:00 10 01 10ﻫ39:00 1001 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ﻫ比如在做IPstandard ACL的时候,就可以:access-list 10 permit 192.168.32.0 0.0.7.255ﻫﻫ再来看另一组IP地范围:192.168.148.0/24ﻫ192.168.149.0/24192.168.146.0/24ﻫ192.168.147.0/24ﻫ照之前的方法,把第3个八位位组写成2进制形式:147:10 01 0011146:10 0100 10ﻫ148:100101 00149: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 standardACL的时候,就可以:ﻫﻫaccess−list 10permit192.168.146.0 0.0.1.255 access−list 10permit 192.168.148.00.0.1.255Processing 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-list102 permit ip 10.1.1.0 0.0.0.255172.16.1.0 0.0.0.255access-list 102deny ip anyanyﻫACL例子如下:access-list101 permit tcphost 10.1.1.2 host172.16.1.1eq telnetﻫaccess-list 101 permittcp host 10.1.1.2host 172.16.1.1ﻫaccess-list 101 permit udphost10.1.1.2 host 172.16.1.1ﻫaccess-list 101 permit ip 10.1.1.0 0.0.0.255 172.16.1.00.0.0.255ﻫ最后1条语句就足够了,前3条语句可以不用配置.因为TCP就包括了telnet,并且IP包括了TCP和UDP.所以只需要写最后1条语句即可ﻫDefining Ports and MessageTypesﻫ在设置ACL的时候,可能不光要设置源地址和目标地址,还要设置端口号(参阅RFC 1700)或ICMP信息类型(参阅RFC 792).当然可以在设置的时候输入?来查看提示,如下:ﻫaccess-list 102permittcp host 10.1.1.1 host 172.16.1.1 eq ?ﻫbgp BorderGateway Protocol(179)ﻫchargen Character generator (19)ﻫcmd Remote commands (rcmd,514)ﻫ在配置的时候,路由器同样可以把数字转化为人性化的值,比如在设置下面的ICMP类型14的时候:ﻫaccess-list 102permit icmphost 10.1.1.1 host 172.16.1.1 14ﻫ就成了:ﻫaccess-list102 permit icmp host 10.1.1.1host 172.16.1.1 timestamp-replyﻫﻫApplying ACLs当你配置了ACL的时候,不在路由器上应用它,是将不会生效的.如下图:ﻫﻫ当你要阻断从source到destination的流量的时候,尽可能的把ACL设置在离源地址近的地方,即在路由器A 上的E0接口(inbound)ﻫDefiningin 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#configtrouter(config)#access-list 101 deny icmp anyanyrouter(config)#access-list 101 permitip any anyrouter(config)#^Zrouter#showaccess-listﻫExtended IP access list 101ﻫdeny icmp anyanypermit ipany anyﻫrouter#ﻫ*Mar 9 00:43:12.784: %SYS-5-CONFIG_I:ﻫConfigured from consolebyconsolerouter#config trouter(config)#no access-list 101 deny icmp any anyﻫrouter(config)#^Zﻫrouter#showaccess-listrouter#*Mar 900:43:29.832:ﻫ%SYS-5-CONFIG_I: Configured from consoleby consoleﻫ所以如果你要修改ACL的语句的时候,可以把路由器的配置拷贝到TFTP服务器上,用文本编辑器比如notepad.exe进行编辑后,在拷贝回路由器上ﻫ当然也可以用命名访问列表的方式进行修改(稍后讲解),如下:ﻫﻫrouter#config tﻫrouter(config)#ip a ccess-list extended testrouter(config-ext-nacl)#permit ip host 2.2.2.2 host 3.3.3.3router(config-ext-nacl)#permit tcphost 1.1.1.1 host 5.5.5.5eq (config-ext-nacl)#permit icmp any anyﻫrouter(config-ext-nacl)#permit udphost 6.6.6.6 10.10.10.0 0.0.0.255 eqdomainﻫ验证下ACL的设置,如下:router#show access-listExtended IPaccesslist testpermitip host 2.2.2.2 host3.3.3.3ﻫpermit tcp host 1.1.1.1 host 5.5.5.5eq icmpany any permitudp host6.6.6.6 10.10.10.0 0.0.0.255 eq domainﻫ设置好ACL,进行删除和增加语句,如下:ﻫrouter(config)#ip access-listextended testrouter(config-ext-nacl)#no permit icmpany any /---------------删除1条语句---------/ router(config-ext-nacl)#permit grehost 4.4.4.4host 8.8.8.8 /---------------增加1条语句---------/ﻫ修改后进行验证,如下:ﻫrouter#showaccess-listﻫExtended IP access listtestﻫpermit ip host 2.2.2.2 host3.3.3.3ﻫperm it tcp host 1.1.1.1 host 5.5.5.5 eq udphost 6.6.6.6 10.10.10.0 0.0.0.255 eq domain permit gre host 4.4.4.4 host8.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 permitipanyhost 10.2.6.6access-list101 permitip host 10.2.6.6anyﻫ 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.并且进入接口配置模式使用iproute-cache命令打开fast-switching功能ﻫPt.3 Types of IPACLsﻫﻫStandard ACLsﻫﻫ标准ACL是比较古老的ACL,可以追溯到Cisco IOSRelease 8.3.标准ACL(以IP访问列表为例)通过比较IP包的源地址和ACL中设置的地址来做转发或者丢弃的决定.语法如下:ﻫﻫaccess-list <access-list-number>{permit|deny} {host|sourcewildcard-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是在CiscoIOS Release 8.3中引入的.顾名思义,它和之前那种古老的比较方式,增加了许多额外的比较.命令如下:ﻫﻫ对于IP:ﻫaccess-list <access-list-number>[dynamic dynamic-name [timeout minutes]] {d eny |permit} protocolsourcewildcard-mask destinationwildcard-mask [precedence precedence] [tos tos] [log | log-input][time-range time-range-name]ﻫ对于ICMP:ﻫﻫaccess-list <access-list-number> [dynamic dynamic-name [timeout minutes]] {deny | permit} icmp sourcewildcard-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 | perm it} udp source wildcard-mask [operator [port]] destinationwildcard-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} tcpsource wildcard-mask[operator [port]] destination wildcard-mask [operator [po rt]] [precedence precedence][tos tos] [log |log-input] [time-range time-range-name]ﻫﻫ在一般的IOS版本里,access-list-number可以为101到199.在CiscoIOS 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 IOSRelease 11.1引入的.这个特性是依靠于telnet,验证(au thentication,本地和远程)还有扩展ACL的Lock and Key的配置是在应用ACL的时候进行设置的,当验证通过以后,才允许telnet,语法如下:ﻫusername <us ername> 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} {destinationwildcard-mask|any} [precedence precedence] [tos tos][established] [log|log-input] [operator destination-port|destinationport]ﻫ接下来:ﻫline vty<line_range>ﻫlogin localﻫ如下就是一个Lock and Key的配置例子:ﻫusername test password0testﻫusernametest autocommand access-enablehosttimeo ut10 /-----定义空闲超时时间为10分钟---/interface Ethernet0/0ip address 10.1.1.1 255.255.255.0ipaccess-group 101inaccess-list101 permittcp any host 10.1.1.1eq telnetaccess-list 101 dynamic testlisttimeout 15 permit ip10.1.1.0 0.0.0.255172.16.1.0 0.0.0.255ﻫline vty 0 4login 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的流量的例子interfaceEthernet0/0ﻫip address 10.1.1.1 255.255.255.0ip access-groupin_to_outinﻫip access-listextended in_to_outﻫpermit tcp host 10.1.1.2 host 172.16.1.1 eqtelnet:ﻫReflexive ACLsﻫﻫ反身ACL是在Cisco IOS Release 11.3引入的.它只能和扩展的命名IP ACL一起定义而不能和基于数字的或标准ACL,以及其他协议的ACL一起.语法如下:ﻫip access-list extended <name> permit <protocol> anyany 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 listicmp_trafficﻫpermit icmp host192.1.1.2 host10.1.1.2 (24 matches) (time left196)……ﻫﻫ这些动态ACL可通过TCP的FIN/RST包来动态自动消除,对ICMP这样stateless的包来说,是通过内置的timer来消除的,这点可通过上述show access-list结果中的(time left 196)来核实.ﻫ最后再说说那另一个测试,也就是两个ACL中加的多余的东西:ﻫip access-list extended outbound_filterpermit ip any anyﻫﻫip access-list extended inbound_filterﻫdenyip any any logﻫ我在10.1.1.2上发起一个到192.1.1.2的TELNET连接,这个流量到了S0口后由ACLoutbound_filter中的permit ip any any检测后放行.到了RouterB后,RouterB进行处理然后返回流量,这个流量到了S0口后由inb ound_filter检测,因为evaluateicmp_traffic中并没有包含对TCP类型流量的检测,这个包由denyipany any log一句处理后丢弃并生成日志:00:24:28:%SEC-6-IPACCESSLOGP: list inbound_filter denied tcp 192.1.1.2(23) -> 10.1.1.2(1483),1 packetTime-Based ACLs Using Time Ranges基于时间的ACL是在Cisco IOS12.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 [starttimedate] [end timedate]ﻫ3.把time range使用在ACL中:ﻫﻫip access-list <name|number> <extended_definition> time-range <name_of_time-range>例子如下:time-range EVERYOTHERDAYperiodic Monday Wednesday Friday 8:00 to 17:00ﻫaccess-list 101 permit tcp 10.1.1.00.0.0.255 172.16.1.00.0.0.255eq telnettime-r ange EVERYOTHERDAYﻫinterfaceEthernet0/0ﻫip address10.1.1.1255.255.255.0ﻫip access-group 101 inﻫCommented IP ACLEntriesﻫ为ACL语句标记注释这个特性是在Cisco IOS Release12.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 eqtelnetaccess-list 101 remark permit_telnetﻫinterface Ethernet0/0ip address 10.1.1.1 255.255.255.0ip access-group 101 inﻫ。