ovn acl功能

本文介绍一下ovn的acl功能,用来设置访问控制列表,并且只能应用在逻辑交换机或者port group上,不能应用在逻辑路由器上。

acl table

在nbdb中提供了acl table,如下所示,其中每行都表示一条acl规则,参数包括优先级,方向,匹配域和动作。

image.png

priority
指定acl规则的优先级,值越大优先级越高。如果匹配到的多条规则优先级相同,最终哪条规则生效是不确定的。
direction
指定报文的方向,只有两个值: from-lport和to-lport。前者表示入方向,后者表示出方向,这是在逻辑交换机的角度来说的。
match
用来指定报文匹配域,具体的表达式规则可参考sbdb中 logical_flow table的match列。注意:类型为localnet和router的端口上不能应用acl规则。
action
对于匹配到规则的报文的处理,目前支持四个值:allow, allow-related, drop, or reject。
allow: 表示允许报文通过;
allow-related:表示允许报文和其响应报文通过;
drop:静默丢弃报文;
reject:丢弃报文,并回复报文。对于tcp协议报文,回复rst,对于其他类型的报文,回复ICMPv4/ICMPv6 unreachable。

比如在逻辑交换机ls1上添加如下规则,发往ls1-vm1端口的ip报文被丢弃,优先级为0。

ovn-nbctl acl-add ls1 to-lport 0 'outport == "ls1-vm1" && ip' drop

address_set table

address_set table的每行指定了地址集合,包含ipv4,ipv6和mac地址,可以用在acl规则的match字段。


image.png

如下两个例子

//创建ip地址集合
ovn-nbctl create Address_Set name=ipset addresses='10.10.20.2 10.10.10.3'
//创建mac地址集合
ovn-nbctl create Address_Set name=macset addresses='"02:00:00:00:00:01","02:00:00:00:00:02"'

应用acl

只在acl table添加规则是没用的,还需要将其应用到逻辑交换机或者port group。如下Logical_Switch和Port_Group table的acls列指定了acl规则的集合。

Logical_Switch TABLE 
  acls                          set of ACLs

Port_Group TABLE
  acls                          set of ACLs

实验

在前一篇文章ovn 配置逻辑路由器实现三层转发的基础上,做个小实验,拓扑如下

image.png

ls1和ls2两个网段的四个vm是可以互相通信的,现在要做的是在ls1上的vm1 namespace中启动一个web服务器,默认情况下,其他三个vm都可以访问这个web服务,然后通过添加acl规则限制,仅让ls2上的两个vm可以访问。

首先在ls1的vm1上启动web服务

rm /tmp/www -rf
mkdir -p /tmp/www
echo "i am vm1" > /tmp/www/index.html
cd /tmp/www
ip netns exec vm1 python -m SimpleHTTPServer 8000

先验证默认情况下,其余三个vm都可以访问web服务

root@master:~# ip netns exec vm2 curl 10.10.10.2:8000
i am vm1
root@node1:~# ip netns exec vm1 curl 10.10.10.2:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.2:8000
i am vm1

root@master:/tmp/www# ip netns exec vm1 python -m SimpleHTTPServer 8000
Serving HTTP on 0.0.0.0 port 8000 ...
10.10.10.3 - - [23/May/2021 19:32:42] "GET / HTTP/1.1" 200 -
10.10.20.2 - - [23/May/2021 19:32:49] "GET / HTTP/1.1" 200 -
10.10.20.3 - - [23/May/2021 19:32:53] "GET / HTTP/1.1" 200 -

然后在中心节点上添加两条优先级最低的规则,从ls1-vm1发出和发往ls1-vm1的ip报文默认drop

ovn-nbctl acl-add ls1 to-lport 0 'outport == "ls1-vm1" && ip' drop
ovn-nbctl acl-add ls1 from-lport 0 'inport == "ls1-vm1" && ip' drop

再次在其他vm上访问,结果是失败的。

下面添加另一个acl规则,使ls2上的两个vm可以访问web服务。

//只允许 10.10.20.0/24 网段的ip访问8000服务
ovn-nbctl acl-add ls1 to-lport 1000 'outport == "ls1-vm1" && ip4.src == 10.10.20.0/24 && tcp.dst == 8000' allow-related

查看结果,只有ls2上的vm1和vm2可以访问web服务

root@master:~# ip netns exec vm2 curl 10.10.10.2:8000
 ... ->不通
root@node1:~# ip netns exec vm1 curl 10.10.10.2:8000
i am vm1
root@node1:~# ip netns exec vm2 curl 10.10.10.2:8000
i am vm1

参考

https://blog.csdn.net/zhengmx100/article/details/75431393

你可能感兴趣的:(ovn acl功能)