VPP中ACL(访问控制列表)的使用——系列二

目录
[一、ACL_PLUGIN测试]
  [1.三层测试]
  [2.黑名单实现]
  [3.二层测试]
[二、CLASSIFY测试]
  [1.二层测试]
  [2.三层测试]
  [3.四层测试]
  [4.Hex测试:某session中配置多个过滤条件]
  [5.多table组成表链测试]
  [6.单table配多条session测试]


一、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中配置多个过滤条件

  1. 对源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

发表评论

邮箱地址不会被公开。 必填项已用*标注