OVN系列8 -- ACL & 安全组

ACL & 安全组

同大部分使用OVS实现安全组功能的方案一样,OVN通过流表实现进出VM流量的有状态的ACL控制。状态还是通过linux conntrack维护,OVS 2.5版本起开始支持conntrack,在此之间需要通过Linux Bridge来使用ct,不可避免的对性能照成一定的影响。
OVS并为独立实现ct,实际上还是Linux内核的ct模块,我们通过conntrack命令可以看到他们是一个东西。我们知道在实现NAT、有状态防火墙这些功能的时候ct是一个重要的内核功能,能够一定程度上提高性能(降低 CPU 和延迟),这是因为只有第一个数据包需要完成整个网络栈的处理,参见 Comparing kube-proxy modes 一文,其中包含了这方面的例子。
但是如果需要同时处理非常大数量的活动连接,或者每秒处理极大数量的连接,ct就会成为瓶颈,ct表项的操作需要加自旋锁,应对这些情况对资源和性能消耗都会很大。如下,每秒处理大数量的连接时,内核在ct上的性能消耗。

6.53% [kernel] [k] _raw_qspin_lock
5.57% [kernel] [k] __nf_conntrack_find_get
5.01% [kernel] [k] copy_user_enhanced_fast_string
4.29% [kernel] [k] ebt_do_table
3.66% [kernel] [k] vhost_get_vq_desc
3.39% [kernel] [k] vhost_signal

所有如果能够预期会出现这些情况的话,可以考虑一下无状态的防火墙,当然无状态的防火墙的使用限制还是挺大的。详细可以参考Calico Do-not-track 策略。

配置

相关命令行

1、配置acl
// 命令行
ovn-nbctl acl-add entity direction priority match verdict
说明:
priority
指定acl规则的优先级,值越大优先级越高。如果匹配到的多条规则优先级相同,最终哪条规则生效是不确定的。
direction
指定报文的方向,只有两个值: from-lport和to-lport。前者表示入方向,后者表示出方向,这是在逻辑交换机的角度来说的,不是vm。
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。
2、配置地址集
// 创建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"'
3、显示
ovn-nbctl list acl ## 显示acl rule
ovn-nbctl list Address_Set ## 显示地址集合

配置安全组

配置一个白名单 安全组,控制 vpc-400中 vm2 的入向规则。
踩坑:

  • 注意配置地址集时,不能使用"-",使用错误不提示,控制层面数据生成都正确,但实际流表不下发。
  • --name 并不是给acl 命名,而是打log用的,和log功能绑定。
### 默认 drop
ovn-nbctl --name=vm-400-2-in-default  acl-add  sw-400 to-lport 0 'outport == "sw-400-port-vm2" && ip' drop
### 配置 允许30.1.1.12访问 4444端口
ovn-nbctl --name=vm-400-2-in-permit4444 acl-add  sw-400 to-lport 1000 'outport == "sw-400-port-vm2" && ip4.src == 30.1.1.12 && tcp.dst == 4444' allow-related
### 创建ip地址集合
ovn-nbctl create Address_Set name=vm_300_ipset addresses='30.1.1.111 30.1.1.112'
### 使用地址集,允许地址集中的vm访问5555端口
ovn-nbctl  acl-add  sw-400 to-lport 1000 'outport == "sw-400-port-vm2" && ip4.src == $vm_300_ipset && tcp.dst == 5555' allow-related
流表分析

附ct状态:

new 通过ct action指定报文经过conntrack模块处理,不一定有commit。
est 表示conntrack模块看到了报文双向数据流,一定是在commit 的conntrack后
rel 表示和已经存在的conntrack相关,比如icmp不可达消息或者ftp的数据流
rpl 表示反方向的报文
inv 无效的,表示conntrack模块没有正确识别到报文,比如L3/L4 protocol handler没有加载,或者L3/L4 protocol handler认为报文错误
trk 表示报文经过了conntrack模块处理,如果这个flag不设置,其他flag都不能被设置。任何进来的数据包,都是-trk状态,只有该数据包经过ct模块处理了,才会变为+trk状态。什么叫经过ct模块处理?流表的action指定了ct,并且报文通过了协议验证:pkt->md.ct_state = CS_TRACKED
snat 表示报文经过了snat,源ip或者port
dnat 表示报文经过了dnat,目的ip或者port

#### 1、ingress 方向安全组
## tcp rst 和 icmp type3 都是 acl的reject verdict 生成的报文,我们只配置了drop,所以没有实际的流量匹配这些流表
cookie=0x568f4201, duration=4690.495s, table=11, n_packets=0, n_bytes=0, priority=110,tcp,metadata=0x6,tcp_flags=rst actions=resubmit(,12)
 cookie=0x568f4201, duration=4690.496s, table=11, n_packets=0, n_bytes=0, priority=110,icmp,metadata=0x6,icmp_type=3 actions=resubmit(,12)
 cookie=0xf811791a, duration=4690.496s, table=11, n_packets=0, n_bytes=0, priority=110,ip,reg14=0x3,metadata=0x6 actions=resubmit(,12)
 cookie=0x1c982666, duration=4690.496s, table=11, n_packets=9, n_bytes=706, priority=100,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[96],resubmit(,12)
 
 cookie=0x7ff1837, duration=4690.496s, table=14, n_packets=0, n_bytes=0, priority=65535,ct_state=-new-est+rel-inv+trk,ct_label=0/0x1,metadata=0x6 actions=resubmit(,15)
## 已双向跟踪 && 反向流量 && 打了blocked flag == drop
 cookie=0xda49a9a8, duration=4690.496s, table=14, n_packets=0, n_bytes=0, priority=65535,ct_state=+est+rpl+trk,ct_label=0x1/0x1,metadata=0x6 actions=drop
## 无效报文 == drop
 cookie=0xda49a9a8, duration=4690.496s, table=14, n_packets=0, n_bytes=0, priority=65535,ct_state=+inv+trk,metadata=0x6 actions=drop
## "ct.est && !ct.rel && !ct.new && !ct.inv && ct.rpl && ct_label.blocked == 0"
 cookie=0x546d5489, duration=4690.496s, table=14, n_packets=9, n_bytes=706, priority=65535,ct_state=-new+est-rel+rpl-inv+trk,ct_label=0/0x1,metadata=0x6 actions=resubmit(,15)
## "ip && (!ct.est || (ct.est && ct_label.blocked == 1))" == 标记 reg0 = 1
 cookie=0x1349518f, duration=4690.496s, table=14, n_packets=0, n_bytes=0, priority=1,ct_state=-est+trk,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,15)
 cookie=0x1349518f, duration=4690.496s, table=14, n_packets=0, n_bytes=0, priority=1,ct_state=+est+trk,ct_label=0x1/0x1,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,15)
 
#### 2、egress 方向安全组
 cookie=0x58a88198, duration=4690.496s, table=41, n_packets=0, n_bytes=0, priority=110,icmp,metadata=0x6,icmp_type=3 actions=resubmit(,42)
 cookie=0x58a88198, duration=4690.496s, table=41, n_packets=0, n_bytes=0, priority=110,tcp,metadata=0x6,tcp_flags=rst actions=resubmit(,42)
 cookie=0xe70e698d, duration=4690.496s, table=41, n_packets=9, n_bytes=706, priority=110,ip,reg15=0x3,metadata=0x6 actions=resubmit(,42)
 cookie=0x8a28c202, duration=4690.496s, table=41, n_packets=37, n_bytes=2755, priority=100,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[96],resubmit(,42)
 
#### 3、以下resubmit(,45)都是白名单放行的各种情况,其他都会进入 [4] 代表的 default action流表中 执行drop
##  eg, 30.1.1.12 --> 40.1.1.12:4444,会先后走到这里的 91ef48b0(正方向 new),6169800e(正方向 est),a2bddbb0(反方向)放行。
## 流表中所有的控制器操作都是由于我配置了 --name,触发的 log处理,会触发上送控制器打日志。
##
 cookie=0xa2bddbb0, duration=4690.496s, table=44, n_packets=9, n_bytes=706, priority=65535,ct_state=-new+est-rel+rpl-inv+trk,ct_label=0/0x1,metadata=0x6 actions=resubmit(,45)
 cookie=0x628a564d, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=65535,ct_state=+est+rpl+trk,ct_label=0x1/0x1,metadata=0x6 actions=drop
 cookie=0xcc4f7527, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=65535,ct_state=-new-est+rel-inv+trk,ct_label=0/0x1,metadata=0x6 actions=resubmit(,45)
 cookie=0x628a564d, duration=4690.495s, table=44, n_packets=0, n_bytes=0, priority=65535,ct_state=+inv+trk,metadata=0x6 actions=drop
 
 cookie=0x91ef48b0, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0x1/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.12,tp_dst=4444 actions=load:0x1->NXM_NX_XXREG0[97],controller(userdata=00.00.00.07.00.00.00.00.00.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.70.65.72.6d.69.74.34.34.34.34),resubmit(,45)
##
 cookie=0x6169800e, duration=4690.496s, table=44, n_packets=8, n_bytes=537, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.12,tp_dst=4444 actions=controller(userdata=00.00.00.07.00.00.00.00.00.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.70.65.72.6d.69.74.34.34.34.34),resubmit(,45)
 cookie=0x4f257b76, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0x1/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.111,tp_dst=5555 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
 cookie=0x32d72a94, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.111,tp_dst=5555 actions=resubmit(,45)
 cookie=0x4f257b76, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0x1/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.112,tp_dst=5555 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
 cookie=0x32d72a94, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=-new+est-rpl+trk,ct_label=0/0x1,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.112,tp_dst=5555 actions=resubmit(,45)
 
 cookie=0x91ef48b0, duration=4690.496s, table=44, n_packets=2, n_bytes=148, priority=2000,ct_state=+new-est+trk,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.12,tp_dst=4444 actions=load:0x1->NXM_NX_XXREG0[97],controller(userdata=00.00.00.07.00.00.00.00.00.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.70.65.72.6d.69.74.34.34.34.34),resubmit(,45)
 
 cookie=0x4f257b76, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=+new-est+trk,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.111,tp_dst=5555 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
 cookie=0x4f257b76, duration=30.827s, table=44, n_packets=0, n_bytes=0, priority=2000,ct_state=+new-est+trk,tcp,reg15=0x2,metadata=0x6,nw_src=30.1.1.112,tp_dst=5555 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
#### 4、默认acl,执行: 提交ct 表项;打日志;默认行为(drop);设置ct_label=1
###    另外 先建ct,再删除 permit的rule表项的情况下,也走到这里,drop并设置流表的ct_label
 cookie=0x6a697aa1, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=1000,ct_state=+est+trk,ct_label=0/0x1,ip,reg15=0x2,metadata=0x6 actions=ct(commit,zone=NXM_NX_REG13[0..15],exec(load:0x1->NXM_NX_CT_LABEL[0])),controller(userdata=00.00.00.07.00.00.00.00.01.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.64.65.66.61.75.6c.74)
###  到了这里,还没有ct.est 或 匹配有drop 标记的报文,打日志 + drop(没有resubmit)
###  先建ct,再配置rule,会打 ct_label,走到这里。
 cookie=0xd4099538, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=1000,ct_state=+est+trk,ct_label=0x1/0x1,ip,reg15=0x2,metadata=0x6 actions=controller(userdata=00.00.00.07.00.00.00.00.01.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.64.65.66.61.75.6c.74)
### 先配置 rule,再有流量的情况下会走到这里,-est+trk,drop
 cookie=0xd4099538, duration=4690.496s, table=44, n_packets=24, n_bytes=1776, priority=1000,ct_state=-est+trk,ip,reg15=0x2,metadata=0x6 actions=controller(userdata=00.00.00.07.00.00.00.00.01.06.76.6d.2d.34.30.30.2d.32.2d.69.6e.2d.64.65.66.61.75.6c.74)
####
 cookie=0xf90599e3, duration=4690.496s, table=44, n_packets=0, n_bytes=0, priority=1,ct_state=-est+trk,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
 cookie=0xf90599e3, duration=4690.495s, table=44, n_packets=0, n_bytes=0, priority=1,ct_state=+est+trk,ct_label=0x1/0x1,ip,metadata=0x6 actions=load:0x1->NXM_NX_XXREG0[97],resubmit(,45)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容