目录
一、ACL_PLUGIN测试
1.三层测试
因为acl_plugin默认采用白名单机制,策略挂载到端口后,未匹配到数据包全部拒绝。所以直接采用permit即可生效。同时,可直接ip掩码,例如10.10.150.0/24格式,提供了很高灵活性。
- 数据流入方向input/output 端口permit测试
- 数据流出方向input/output 端口permit测试
##步骤1.配置访问控制规则 vat# acl_add_replace ipv4 permit src 10.10.150.0/24 vat# acl_add_replace ipv4 permit dst 10.10.150.0/24 ##如果指定网段前缀24,第四字节需要为0,即10.10.150.0/24才行。
##步骤2.将某些控制规则配置到某端口,下面8条分别测试(input /output均可生效,且为白名单机制) vat# acl_interface_set_acl_list eth2 input 0 1 #允许通过150网段,拦截其他网段 vat# acl_interface_set_acl_list eth2 output 0 #默认拦截所有网段,acl没生效因src 150 vat# acl_interface_set_acl_list eth1 input 0 #默认拦截所有网段,acl没生效因src 150 vat# acl_interface_set_acl_list eth1 output 0 #允许通过150网段,拦截其他网段
##步骤3.查询端口绑定情况确认成功 vat# acl_interface_list_dump |
实验结论:验证端口的input output方向挂载acl均可生效,但src和dst需要斟酌指定。
2.黑名单实现
因默认机制为白名单方式,所以实现黑名单功能至少需要2条acl控制规则,并同时挂载某端口。通过调整挂载acl序号顺序,判断多个挂载规则表之间关系。
##1.配置访问控制规则 vat# acl_add_replace permit, ipv6 permit vat# acl_add_replace ipv4 deny src 10.10.150.0/24
## 2.将某些控制规则配置到某端口,下面分别测试不同ACL执行顺序(input /output均可生效,且为白名单机制) ##先允许所有包通过,后拒绝某网段,实验结果是全部包通过 vat# acl_interface_set_acl_list eth1 output 0 1
##先拒绝某网段,后允许所有包通过,实验结果是拒绝150网段,剩下未匹配包都通过 vat# acl_interface_set_acl_list eth1 output 1 0
vat#acl_interface_list_dump #查询端口绑定情况确认成功 |
实验结论:对于符合第一条规则的数据包击中,则不往后执行。未击中,执行后续acl规则。
3.二层测试
##步骤1.配置访问控制规则 vat# macip_acl_add ipv4 permit ip 10.10.150.0/24 mac 64:00:6a:1d:75:06 mask ff:ff:ff:ff:ff:ff
##步骤2.将某些控制规则配置到某端口 vat# macip_acl_interface_add_del eth1 add acl 0
##步骤3.查询端口绑定情况确认成功 vat# macip_acl_interface_get vat# macip_acl_dump |
二、CLASSIFY测试
1.二层测试
对源MAC为64:00:6a:1d:75:06数据包进行拒绝。
# classify table mask l2 src buckets 16 # classify session acl-hit-next deny opaque-index 0 table-index 0 match l2 src 64:00:6a:1d:75:06 # set int input acl intfc eth2 l2-table 0 ##测试不可行,无拦截(测试失败) # set int input acl intfc eth2 ip4-table 0 ##测试可行(ip4-table生效,l2-table不生效) #查看并从端口删除策略表 # show inacl type l2 # set int input acl intfc eth1 ip4-table 0 del ##解除端口绑定 # classify table table 0 del ##删除某table策略表 vpp# show classify tables //查看表 show classify tables verbose vpp# show outacl type ip4 //查看出接口挂载策略表情况 |
实验结果:
策略挂载到eth2 input后,实现功能,图片显示数据包击中策略,被拦截证实的图片。测试策略表仅挂在eth2的input方向成功,output失败。同时,挂载eth1的input和output 均不生效。
150.2 ping 200.2 不通,删除session后ping通 //效果实现
100.2 ping 150.2 不通,删除session后通 //效果实现
2.三层测试
(1)对源IP为10.10.150.2的ICMP数据包进行拒绝。测试可行
# classify table mask l3 ip4 src buckets 16 # classify session acl-hit-next deny opaque-index 0 table-index 1 match l3 ip4 src 10.10.150.2 proto 01 # set int input acl intfc eth2 ip4-table 1 ##测试可行,实现拦截(测试成功) # set int output acl intfc eth2 ip4-table 1 ##测试不可行,无拦截(测试失败) # set int input acl intfc eth1 ip4-table 1 ##测试不可行,无拦截(测试失败) # set int output acl intfc eth1 ip4-table 1 ##测试不可行,无拦截(测试失败) #查看并从端口删除策略表 # show inacl type ip4 # set int input acl intfc eth1 ip4-table 1 del |
实验结果:
执行set int input acl intfc eth2 ip4-table 1时,测试成功,实现指定拦截。
150.2 ping 200.2 不通 | 150.2 ping 100.2 不通 |
100.2 ping 200.2 通 | 100.2 ping 150.2 不通 |
(2)添加dest 拦截测试
分别挂载到eth1端口的input 、output端口。
# classify table mask l3 ip4 dst table 2 # classify session acl-hit-next deny table-index 2 match l3 ip4 dst 10.10.200.2 # set int input acl intfc eth2 ip4-table 1 ##测试实现拦截 # set int output acl intfc eth2 ip4-table 1 ##测试失败,无拦截 # set int input acl intfc eth1 ip4-table 1 ##测试失败,无拦截 # set int output acl intfc eth1 ip4-table 1 ##测试失败,无拦截 |
测试发现仅挂eth2的input流入方向生效,output不生效;同时,挂载端口eth1无法生效。
3.四层测试
对源IP地址为10.10.150.2的TCP数据包进行拒绝。l4创建acl table必须添加l3参数,指定session时l4后参数为src_port 和dst_port。
# classify table mask l3 ip4 src l4 dst_port # classify session acl-hit-next deny table-index 3 match l3 ip4 src 10.10.150.2 l4 dst_port 12865 # set int input acl intfc eth2 ip4-table 3 #查看并删除该网口之前绑定策略表 # show inacl type ip4 # set int input acl intfc eth2 ip4-table 3 del |
使用netperf发送数据报,实现成功拦截端口号为12865的TCP数据报文。
4.Hex测试:某session中配置多个过滤条件
- 对源MAC为00:0c:29:e9:0e:9c和(且)源IP为10.10. 150.2的ICMP包进行过滤。
Ip proto Offset 10B, Ip src 13B begin。
# classify table mask hex 000000000000ffffffffffff0000000000000000000000ff0000ffffffff000000000000 # classify session acl-hit-next deny opaque-index 0 table-index 0 match hex 00000000000064006a1d750600000000000000000000000100000a0a9602000000000000 # set int input acl intfc eth2 ip4-table 0 |
(2)对源IP地址为10.10. 150.0/24网段的所有ICMP数据包进行过滤,即match参数中的0x0a0a96,proto即match参数中的0x01。
# classify table mask hex 0000000000000000000000000000000000000000000000ff0000ffffff0000000000
# classify session acl-hit-next deny opaque-index 0 table-index 0 match hex 00000000000000000000000000000000000000000000000100000a0a9600000000000000 # set int input acl intfc eth2 ip4-table 0 |
实验结果: 实现整个网段的ICMP过滤功能,修改150.2为150.4进行测试拦截成功。
5.多table组成表链测试
(1)使用多个表过滤源IP地址和源MAC地址,即将参数next-table指向下一个策略表。对源MAC为00:0c:29:e9:0e:9c或源IP为10.10.150.2的数据包进行拒绝。
# classify table mask l3 ip4 src # classify session acl-hit-next deny opaque-index 0 table-index 3 match l3 ip4 src 10.10.150.2 ##查看表show classify tables [verbose] # classify table mask l2 src next-table 0 # classify session acl-hit-next deny opaque-index 1 table-index 4 match l2 src 00:0c:29:e9:0e:9c # set int input acl intfc eth1 ip4-table 1 |
结果:先执行table1,没匹配成功MAC,则执行下一表table0匹配。此时table2 src ip有匹配成功数据包21个。则执行动作数据包拒绝通过。
(2)ACL表0禁止来源是10.10.150.0/24网段的数据包访问,表1禁止来源是10.10.150.2的数据包访问,即表0、表1是覆盖关系。
##创建table0端口 # classify table mask hex 0000000000000000000000000000000000000000000000ff0000ffffff00000000000000 table 0 # classify session acl-hit-next deny opaque-index 0 table-index 0 match hex 00000000000000000000000000000000000000000000000100000a0a9600000000000000 ##创建table1端口 # classify table mask hex 0000000000000000000000000000000000000000000000ff0000ffffffff00000000000000 table 1 # classify session acl-hit-next deny opaque-index 0 table-index 1 match hex 00000000000000000000000000000000000000000000000100000a0a960200000000000000 ##添加table索引 #classify table table 0 next-table 1 ##将table挂到eth2端口 # set int input acl intfc eth2 ip4-table 0 |
实验结果:只hit到网段拦截,但下一跳具体ip无拦截。
结论:若数据包匹配成功,则执行动作;匹配失败则匹配下一表。
(3)白名单permit实现
classify默认采用黑名单模式,需要直接指定拒绝策略,则其他未匹配数据包均能通过。通常cisco产品具有添deny any关键字,但classify中无any关键字,session中只能指定具体值。测试案例,仅允许10.10.150.2的IP访问通过,其他拒绝。
##创建table0端口,拒绝所有10.10.150.0/24网段的ICMP包 # classify table mask hex 0000000000000000000000000000000000000000000000ff0000ffffff00000000000000 table 0 # classify session acl-hit-next deny opaque-index 0 table-index 0 match hex 00000000000000000000000000000000000000000000000100000a0a9600000000000000 ##创建table1端口,允许10.10.150.2通过 # classify table mask hex 0000000000000000000000000000000000000000000000ff0000ffffffff00000000000000 table 1 # classify session acl-hit-next permit opaque-index 0 table-index 1 match hex 00000000000000000000000000000000000000000000000100000a0a960200000000000000 ##添加table索引
##下面命令行1、2分别执行,表示挂载顺序。测试table表链执行关系 ##1#classify table table 0 next-table 1 ##table0挂载eth2端口后,拦截150.2数据包 ##2#classify table table 1 next-table 0 ##table1挂载eth2端口后,允许150.2数据包通过,有hit。同时,不允许150.3通过,有hit。实现白名单控制。
##将table挂到eth2端口 # set int input acl intfc eth2 ip4-table 1 |
实验结果:首先匹配到数据包会执行动作,就不会匹配往后策略表。未匹配到则继续匹配策略表。对150网段内主机IP任意修改,拦截ping200网段数据包,实现网段测试。
实验结论:table表连接都是或的关系,只要某数据包有命中,就不会往下执行。
- table表的循环索引
table表死循环的测试,在挂端口后设置循环列表,vpp,vppctl进程仍在运行,但都vpp,vppctl都卡死;VPP其他网段无法ping通。
结论:挂端口后不可形成循环链表,需挂端口前设置好索引关系,或挂端口后处理好索引关系。
6.单table配多条session测试
对发往10.10.200.2,源IP地址为10.10.150.2、10.10.150.3、10.10.100.2、10.10.100.3的数据包进行过滤。证实table可以同时挂多个端口并生效,并每条table中设置多条session。
# classify table mask l3 ip4 src buckets 16 # classify session acl-hit-next deny opaque-index 0 table-index 4 match l3 ip4 src 10.10.150.2 # classify session acl-hit-next deny opaque-index 1 table-index 4 match l3 ip4 src 10.10.150.3 # classify session acl-hit-next deny opaque-index 1 table-index 4 match l3 ip4 src 10.10.100.2 # classify session acl-hit-next deny opaque-index 1 table-index 4 match l3 ip4 src 10.10.100.3 # set int input acl intfc eth2 ip4-table 0 # set int input acl intfc eth0 ip4-table 0 |