一、FPM(也叫NGACL)正则表达式
FPM是Cisco IOS新一代的ACL,叫作Flexible Packet Matching,灵活的包匹配。架构
以下是一个示例:tcp
FPM的限制:spa
①无状态的,若是是有状态的,那和防火墙也没啥差异了。xml
②只能匹配IPv4单播包。blog
③不能去分析报文的IP options 。接口
④不支持tunnel或者MPLS接口。ip
⑤一些特殊的网卡FlexWAN Cards也不支持。ci
⑥非初始化的fragment也不能匹配。input
FPM三种匹配流量的方式:
①使用协议头描述文件(Protocol Header Description File,PHDF);
②基于offset(偏移量)和length直接匹配流量;
③以上两种的混合。
好比,以下是ip.phdf的一部分(XML文件):
注意:可能之后配置都是xml or JSON的文件格式了!
二、举例说明FPM功能:
2-一、PHDF文件
咱们看一下Router上的PHDF文件:
R1#dir system:/fpm/phdf/?
system:/fpm/phdf/ether.phdf system:/fpm/phdf/icmp.phdf
system:/fpm/phdf/ip.phdf system:/fpm/phdf/tcp.phdf
system:/fpm/phdf/udp.phdf
例如咱们查看ip.phdf文件:
R1#more system:/fpm/phdf/ip.phdf <<<这会显示出“1”中截图所示信息
2-二、以login invalid为例
R1尝试去Telnet R2,这里故意输错密码,能够看到以下结果:
R1#telnet 12.1.1.2
Trying 12.1.1.2 ... Open
User Access Verification
Username: cisco
Password:
% Login invalid <<<这个信息确定是在PHDF文件中的一个信息
Username:
对这个过程进行分析:
其中的报文中,主要包含Telnet Data,这里面主要的信息是在创建Telnet远程链接时,输入的username,另外一个是password,这里有10个包是包含了cisco这个信息(若是手速够快,多个字符也可能在一个包中)。另外一个是错误的密码“123”有三个包。
注意:咱们输入用户名cisco能看到,是由于对端回显,而不是咱们键盘直接输入在显示器显示的效果,因此,咱们这里抓取到了10个报文,而密码123是看不到的,没有回显,因此是3个报文。
后续出现的关键信息:
这里,咱们就能够写class-map和policy-map去实现,让这个信息不出如今咱们的显示中。仍是如以前所说的,关键的参数是“偏移量”(也就是指定一个位置算起,到咱们须要匹配的数据的地方,到底有多少个字节),而后是长度有多长字节,匹配的信息是哪些等。
例如这里吧invalid给deny掉:它的偏移量是10个字节(包含\r\n% Login)包括2个字节的空格,也就是在invalid出现以前,有10个字节,而invalid有7个字节(ASCII)。
三、配置操做:
3-1 加载PHDF文件
因为Telnet是TCP的,因此咱们加载ip.phdf和tcp.phdf就行了
R1(config)#load protocol system:/fpm/phdf/ip.phdf
R1(config)#load protocol system:/fpm/phdf/tcp.phdf
3-2 配置Class-map
Class-map分为stack(堆栈类,就是匹配全部的TCP流量)和access-control(访问控制器类)
R1(config)#class-map type stack match-all ip-tcp
R1(config-cmap)#match field ip protocol eq 0x6 next tCP (IP协议号6-TCP;17-UDP;1-ICMP;47-GRE;50-ESP;51-AH)
R1(config)#class-map type access-control match-all DENY-invalid
R1(config-cmap)#match field TCP source-port eq 23
R1(config-cmap)#match field IP length eq 0x47 (这里是IP长度)
R1(config-cmap)#match start TCP payload-start offset 10 size 7 string invalid (string invalid能够换为正则表达式regex [Ii][Nn][Vv][Aa][Ll][Ii][Dd])
注意,关键是看从哪一个头部开始计算,这里是TCP负载开始,若是是IP负载开始,那么offset就是30,若是是L3开始,那就还要加上IP头部,offset就是50。
命令分别以下:
R1(config-cmap)#match start IP payload-start offset 30 size 7 string invalid
R1(config-cmap)#match start l3-start payload-start offset 50 size 7 string invalid
另外,上面IP长度包中显示的是10进制,16进制为47:
3-3 配置Policy-map
Policy-map只是access-control类型的。
R1(config)#policy-map type access-control TCP-Policy
R1(config-pmap)#class DENY-invalid
R1(config-pmap-c)#drop
R1(config-pmap-c)#exit
R1(config-pmap)#exit
R1(config)#policy-map type access-control FPM-POlicy
R1(config-pmap)#class ip-tcp
R1(config-pmap-c)#service-policy TCP-Policy
3-4 在接口调用Policy-map
R1(config)#int f0/0
R1(config-if)#service-policy type access-control input FPM-POlicy
查看匹配状况:
R1#show policy-map type access-control interface f0/0
FastEthernet0/0
Service-policy access-control input: FPM-POlicy
Class-map: ip-tcp (match-all)
39 packets, 2579 bytes
5 minute offered rate 0 bps
Match: field IP protocol eq 0x6 next TCP
Service-policy access-control : TCP-Policy
Class-map: DENY-invalid (match-all)
3 packets, 255 bytes
5 minute offered rate 0 bps
Match: field TCP source-port eq 23
Match: field IP length eq 0x47
Match: start TCP payload-start offset 10 size 7 string "invalid"
drop
Class-map: class-default (match-any)
36 packets, 2324 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: any
Class-map: class-default (match-any)
0 packets, 0 bytes
5 minute offered rate 0 bps, drop rate 0 bps
Match: any
验证,输入了错误的密码后,一直卡在这里
R1#telnet 12.1.1.2
Trying 12.1.1.2 ... Open
User Access Verification
Username: cisco
Password:
在查看一下接口上的信息:
R1#show policy-map type access-control interface f0/0
FastEthernet0/0
Service-policy access-control input: FPM-POlicy
Class-map: ip-tcp (match-all)
83 packets, 5648 bytes
5 minute offered rate 0 bps
Match: field IP protocol eq 0x6 next TCP
Service-policy access-control : TCP-Policy
Class-map: DENY-invalid (match-all)
9 packets, 765 bytes
5 minute offered rate 0 bps
Match: field TCP source-port eq 23
Match: field IP length eq 0x47
Match: start TCP payload-start offset 10 size 7 string "invalid"
drop Class-map: class-default (match-any) 74 packets, 4883 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any Class-map: class-default (match-any) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any