- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
1. Nova 安全组
; b+ D0 v7 i) y1 P+ `' r; G) L1.1 配置 X. r, H- V$ @6 Z- ^/ s2 K
节点 配置文件 配置项 说明
' i5 T3 _5 Q4 Z Hcontroller /etc/nova/nova.conf security_group_api = nova 是的 nova secgroup* 命令使用的是 nova 安全组的 API
% Z' c5 x2 M: Q. p0 _5 G" O/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组
7 x0 ?5 q! K' I5 E; J# P4 dnova-compute : T% }! @/ e' \, v
/etc/nova/nova.conf
* ]5 y4 ^! n; H# ]/ Z/etc/nova/nova-compute.conf
: T- s( | J% f5 r; p zfirewall_driver = nova.virt.firewall.IptablesFirewallDriver 指定 Nova 安全组的驱动,可以是IptablesFirewallDriver 或者 NWFilterFirewall。默认是 IptablesFirewallDriver。见下面的说明。8 _% M. P& e+ l! ~# r- ~
/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组
* W) { ?& K1 r, r) qnetwork /etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组& j q, q5 }5 u9 \
nova 提供两种实现方式:使用 libvirt's nwfilter 的实现以及使用 linux iptables 的实现,默认的方式是使用 linux iptables。可以通过设置配置项 firewall_driver 的值指定。需要注意的是,即使使用 iptables,依然使用了部分 nwfilter 功能。参见 https://ask.openstack.org/en/question/19456/how-security-group-is-implemented/' f7 Y# H% l" F8 V! Z* Z" S$ U
firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
3 U) C! v, p4 ?1 Nfirewall_driver=nova.virt.libvirt.firewall.NWFilterFirewall2 m# w8 G% J2 S9 `1 U* X& \
1.2 CLI, k! f$ [& g5 i) ?
复制代码) d' U* W2 z: c) t1 _7 ~
列表安全组:
2 T" A2 n; x* [7 T7 j/ w: d% K hs1@controller:~$ nova secgroup-list-rules novasg14 R) |5 y; A0 L: ^+ i' F
+-------------+-----------+---------+-----------+--------------+2 w" s$ h9 } n1 H/ e) K$ b, S
| IP Protocol | From Port | To Port | IP Range | Source Group |2 I7 W2 B! p" S) h2 v( ]( M4 |
+-------------+-----------+---------+-----------+--------------+
1 n/ }1 G: V3 }& F a/ V| tcp | 22 | 22 | 0.0.0.0/0 | |
0 e K; h! Z% w) N+-------------+-----------+---------+-----------+--------------+
7 ]7 p! U# }" R9 f6 i% L8 e' }% W创建一个安全组规则:, j8 n R; @' f. e
s1@controller:~$ nova secgroup-add-rule novasg1 udp 53 53 100.1.100.0/24
Q+ L T% W( [+-------------+-----------+---------+----------------+--------------+
/ t+ R; X& M: H8 y# s6 H| IP Protocol | From Port | To Port | IP Range | Source Group |- P5 n& s5 J4 K" u9 M
+-------------+-----------+---------+----------------+--------------+* o/ A4 V& V+ K$ ]' a& q; U6 ~" q
| udp | 53 | 53 | 100.1.100.0/24 | |
( z# D: I2 d6 P+-------------+-----------+---------+----------------+--------------+
/ P4 ^" T( h5 c删除虚机的安全组:
0 ^: d) Z( l$ m: n0 bs1@controller:~$ nova remove-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg11 a8 ]' ?; t: j
添加安全组到虚机:9 @6 I# k% H, |- C# F7 H4 ]
s1@controller:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg1
' V: X3 _7 s7 ]# c) L1 l创建第二个安全组:
1 v- \1 w! _0 l9 P' N: x8 ~s1@controller:~$ nova secgroup-add-rule novasg2
4 C1 H4 f' ?7 E0 d* Q: ]添加规则:
1 ~! M( O. t% O6 h# v$ T8 y, e1 r) vs1@controller:~$ nova secgroup-add-rule novasg2 icmp -1 -1 0.0.0.0/0
9 K+ `' F, {: h7 [0 f: P+-------------+-----------+---------+-----------+--------------+
0 O: I" p2 s1 ^" N. c. m1 Z2 F/ i| IP Protocol | From Port | To Port | IP Range | Source Group |
$ k% R" G, ~- h' f/ L+-------------+-----------+---------+-----------+--------------+3 T p$ z: Z4 | T1 C5 r6 n2 w
| icmp | -1 | -1 | 0.0.0.0/0 | |7 N$ n" G- G/ y6 v5 Z5 v
+-------------+-----------+---------+-----------+--------------+! ]0 I& C4 l) X a1 r8 V
再添加安全组到虚机:1 Y7 k9 Y4 ]& r s! y
s1@controller:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg2
3 G6 w$ \% B, L8 s" L/ x复制代码 r/ Y. Y# n0 X" t, Q/ `
1.3 iptables 链
& ^6 }4 E2 r. h1 E d0 ENova-compute 增加了 filter 表的 INPUT,OUTPUT 和 FORWARD 链:0 ?/ z8 U) l9 ^8 Q1 o
5 g. U9 n, J- U; r复制代码
. N1 ?# ], B% W& z& r3 B4 H-N nova-compute-FORWARD
% K. F2 {8 N" |9 G) Z-N nova-compute-INPUT" r) z* P$ t2 r. e4 B: |/ u0 T
-N nova-compute-OUTPUT2 a, Z: E. K; b) \+ c
-N nova-compute-inst-122 #每个虚机一个链,命名规则是 ”inst“-<instance 在数据库中的 id>
/ q# B/ S* K6 j: `$ U" k- {-N nova-compute-local* E9 y' R: N; p9 H9 h
-N nova-compute-provider
9 k1 [/ b7 E7 T- ~-N nova-compute-sg-fallback: c* o9 { n2 ^ ^6 @
-N nova-filter-top( t4 J/ S% Z9 @. ?8 N- p
-A INPUT -j nova-compute-INPUT
) o/ ^9 [8 [/ r7 V( h6 l% {3 f-A FORWARD -j nova-filter-top5 \8 K2 \0 p) u: `
-A FORWARD -j nova-compute-FORWARD
) `; j1 M, }' f# C: f" X4 ~-A OUTPUT -j nova-filter-top
* }% n, H: k: U$ K' G8 X- u-A OUTPUT -j nova-compute-OUTPUT0 G' a" \) u J+ ^, P
-A nova-compute-FORWARD -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -j ACCEPT #允许本机上的虚机发出 DHCP 广播
5 O& C5 i! i$ P$ m9 X, B \-A nova-compute-INPUT -s 0.0.0.0/32 -d 255.255.255.255/32 -p udp -m udp --sport 68 --dport 67 -j ACCEPT #允许本机接受 DHCP 广播包
/ \) \1 R; {' m' {% y. k) O3 b! B9 u! [-A nova-compute-inst-122 -m state --state INVALID -j DROP4 Q a& _/ ?( u8 K" Q% T
-A nova-compute-inst-122 -m state --state RELATED,ESTABLISHED -j ACCEPT
7 ~) D- T0 x1 h7 L: [-A nova-compute-inst-122 -j nova-compute-provider& X5 G, s- W* k; U' R+ S+ H
-A nova-compute-inst-122 -s 91.1.180.2/32 -p udp -m udp --sport 67 --dport 68 -j ACCEPT #接受该虚机所在子网的 DHCP Server 返回的包
o/ m! `6 z9 s$ L-A nova-compute-inst-122 -s 91.1.180.0/24 -j ACCEPT #在配置项 allow_same_net_traffic = true 的情况下接受同网段虚机的来访包
3 m5 ?5 W3 ]7 l b-A nova-compute-inst-122 -p tcp -m tcp --dport 22 -j ACCEPT #用户安全组规则指定的来访包# X5 H& }5 I( w: o" f( r
-A nova-compute-inst-122 -s 100.1.100.0/24 -p udp -m udp --dport 53 -j ACCEPT #用户安全组规则指定的来访包' X j+ s+ i) d8 m0 d4 \5 d
-A nova-compute-inst-122 -p icmp -j ACCEPT #用户安全组规则指定的来防爆, E) F1 ?0 H% ]& ?( f' n
-A nova-compute-inst-122 -j nova-compute-sg-fallback #没被上面规则处理的其它来访包 / F b3 [$ q h0 ~. G: l. _, U) r
-A nova-compute-local -d 91.1.180.14/32 -j nova-compute-inst-122 # “-d“ 决定了 nova 安全组只检查进入虚机的网络包
9 M& p4 C' }, w1 }) l# }- R-A nova-compute-sg-fallback -j DROP #丢弃其它包,只允许上述规则指定的网络访问! p$ ^( v& z# {- i: v q
-A nova-filter-top -j nova-compute-local" B: J% d! o8 g4 o% i* N( t# e7 w
复制代码& g& \( g: v+ {, |
2. FWaas0 _1 v2 ?( _; \4 A" M- g" W
2.1 概念" U( C2 A9 J4 f; i: _. ^7 @ a
从 Havana 版本开始,Neutron 提供一种基于 Neutron L3 Agent 的一种网络四层防火墙虚拟化参考实现 Firewall-as-a-service,简称 FWaas。本文的分析是基于 openstack Juno 版本进行的。Juno 版本中,FWaas 是分租户的,但是可以在多个租户之间共享。每个租户只允许一个防火墙。与物理的防火墙类似,FWaas 也有三个主要概念:/ D* K( w% K2 ?; a6 \3 \
(1)规则(Rule):允许用户指定所要匹配的名称,描述,针对的协议(TCP, UDP, ICMP, ANY),行为(Allow,Deny),源/目的 IP 地址/子网 和 端口号/端口号区间。" B8 y$ v5 i$ ?* _- o2 {# |; Q
8 Q4 f" [" G/ T与 neutron 安全组中的规则的区别是,这里需要指定被匹配到的数据包的处理行为是通过(ALLOW)和不通过(DENY),但是不能指定网络方向。FWaas 会将规则同时应用到进出网络的网络包上。, W+ _+ ^! j+ w5 Q, k7 d/ {3 {
(2)策略(Policy):规则的逻辑集合。Policy 可以是共享的 和 被审计的(Audited)。目前,FWaas 只是把 “audited” 保存到 DB 中,并没有对它做任何处理。
7 K% z' i( }* _1 r( U4 l. _
6 Y! i' q( `$ c; F, c: H4 T+ E; Y/ O(3)防火墙(Firewall):策略的逻辑集合。见上面右图。Juno 版本中,每个租户只能拥有最多一个 Firewall。防火墙可以是共享的。
: G, i: W8 @8 R0 E, J5 y 这里需要说明的是 FWaas 和 Security Group (安全组) 的区别。安全组规则在连接到一个实例的计算节点上的Linux桥 qbr 上实施,FWaaS 创建的防火墙规则在租户网络边缘实现的虚拟路由器上实施。 FWaaS 并不旨在取代安全组的功能,并且它提供更为补充安全组,特别是在其当前实现状态下。 FWaaS 目前缺乏安全组提供的一些功能,包括无法指定通信的方向等。与此相反,安全组,也因为他们缺乏创建特定规则拒绝所有流量的能力,因此需要 FWaas 作为补充。
2 m# d8 K! m) s) o
' i: p5 Q7 K/ D/ V# d# S( C4 b9 z3 F2 H" G/ W! `/ ~
2.2 配置
! U# m0 n2 y" j# U8 M, X节点 配置和操作0 q8 D Y. I' A
控制节点上
5 l& j& c, p4 m! x ^8 V# S修改 /etc/neutron/neutron.conf:$ g- b$ ?: t! `. `8 y6 f
[default]
& X9 z; b/ E1 l i+ l! w( @4 pservice_plugins = router,lbaas,firewall
6 g# x- p6 f8 X, }[service_providers]
% Z4 @2 ~3 o7 H5 O5 Xservice_provider = FIREWALL:Iptables:neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver:default3 h# i1 W, s' A W( R: n
. N2 D6 G0 q- ?% J% Y- @9 @
service neutron-server restart* X- S# g# y3 W- H
$ A) s# c: L' T' ]/ H: h) w修改 /usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py:'enable_firewall': True: g4 D0 ]; a' b/ D) g7 \, k) }
网络节点上
: k" g; ] r7 J+ n4 ?0 w' K修改 /etc/neutron/fwaas_driver.ini:
. B) |, S$ f/ k[fwaas]( G B$ b+ K6 M% z: s& [$ e
driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver) ~6 W' ]9 P/ i) t* ^ i& X; q
enabled = True
3 b ~( s4 d$ t9 h+ m! X
1 x' `0 k4 M6 L) s7 pservice neutron-l3-agent restart4 g! ]" i$ L+ X+ c% T/ x1 n$ `/ O
' U( c0 ?# b3 ^2.3 实现8 V$ |% D3 ^- i$ S( w \* Q
目前的实现中,FWaas 是通过在其所在 tenant 中的所有 Virtual Router 上添加 iptbales 规则来实现对进出数据网络的网络包进行控制的。
3 W% o3 `" I) |, W3 l$ i+ m" W6 T
代码实现:
8 e3 b+ V4 t" i) Z控制节点上(class FirewallPlugin):* y1 R& @3 \( s* j" ] v; D( u7 r, ^
(1)create rule:纯数据库操作,将 rule 保存到数据中。' \# g' b0 ]2 k8 P: G8 K
(2)create policy:纯数据库操作,将 policy 保存到数据中。" `& X6 O4 d' o6 d9 I
(3)如果将 rule 添加到一个已经添加到 firwall 的 policy,或者将一个 policy 加入一个存在的 firewall,在数据库操作后,通过 RPC fanout 到所有的 L3 Agent host:
u8 |& H# B; B! {% U{'args': {'firewall': {'status': 'PENDING_UPDATE', 'name': u'fw-for-tcp', 'shared': None, 'firewall_policy_id': u'd14e23a3-2ee6-411d-b678-e6db3dac45f5', 'tenant_id': u'74c8ada23a3449f888d9e19b76d13aab', 'admin_state_up': True, 'id': u'aa85bd66-dc4c-4d1b-909e-6f5736c279c7', 'firewall_rule_list': [{'protocol': u'icmp', 'description': u'', 'source_port': None, 'source_ip_address': None, 'destination_ip_address': None, 'firewall_policy_id': u'd14e23a3-2ee6-411d-b678-e6db3dac45f5', 'position': 1, 'destination_port': None, 'id': u'8658229d-6e34-4069-b091-e560f9e54dc9', 'name': u'rule-allow-icmp', 'tenant_id': u'74c8ada23a3449f888d9e19b76d13aab', 'enabled': True, 'action': u'allow', 'ip_version': 4L, 'shared': False}, {'protocol': u'tcp', 'description': u'', 'source_port': None, 'source_ip_address': None, 'destination_ip_address': None, 'firewall_policy_id': u'd14e23a3-2ee6-411d-b678-e6db3dac45f5', 'position': 2, 'destination_port': '80', 'id': u'00b5bad2-dd14-48d6-9a5c-7b65e6e8c480', 'name': u'fule-allow-tcp-80', 'tenant_id': u'74c8ada23a3449f888d9e19b76d13aab', 'enabled': True, 'action': u'allow', 'ip_version': 4L, 'shared': False}], 'description': u''}, 'host': 'controller'}, 'namespace': None, 'method': 'update_firewall'}
* c( K+ @) I( h& J/ B2 I3 M. \+ [( Jinsert_rule/remove_rule/update_firewall_rule/update_firewall_policy -> Firewall_db_mixin.insert_rule/remove_rule/update_firewall_rule/update_firewall_policy -> _rpc_update_firewall_policy -> _rpc_update_firewall -> (if policy has a firewall) FirewallAgentApi.update_firewall
1 }# s3 ^ o+ u4 [1 Qcreate_firewall -> Firewall_db_mixin.create_firewall -> FirewallAgentApi.create_firewall* M7 e/ \ o5 P4 R
update_firewall -> Firewall_db_mixin.update_firewall -> FirewallAgentApi.update_firewall9 y) A f" S3 V; Z
delete_firewall -> Firewall_db_mixin.delete_firewall -> FirewallAgentApi.delete_firewall
% L5 B( h; @' E: V) UFirewallAgentApi.create/update/delete_firewall -> fanout_cast ("create/update/delete_firewall", topics.L3_AGENT, "controller", firewall) -----> FWaaSL3AgentRpcCallback.create/update/delete_firewall -> FWaaSL3AgentRpcCallback._invoke_driver_for_plugin_api0 J" L" n6 s! Q/ b! V D; P
网络节点上(class FWaaSL3AgentRpcCallback):5 b5 T; n7 T' b
(1) 通过 RPC 获取所有的 router,在获取firewall 所在的 tenant 上的 routers( r5 B& Y8 z6 s
(2)调用 IptablesFwaasDriver.update_firewall,依次更新每个 router 的 iptables 规则
& \5 Q. i% Q% U% Y1 s: |1 b/ k(3)首先删除已有规则,然后根据配置的 rules 重新生成规则 ' N2 b5 E# Y, z
复制代码
1 t. p7 ]3 }* [* }1 Iroot@network:/var/cache# ip netns exec qrouter-e438bebe-6795-4b68-a613-ec0df38d3064 iptables -t filter -S
& Z- N- `. L% Q9 q-P INPUT ACCEPT
; e+ ~+ l1 x# }, t( y- m, R-P FORWARD ACCEPT
$ o% X6 D) w, r6 o$ n( I-P OUTPUT ACCEPT, H' u+ b9 p# W: }' B, f
-N neutron-filter-top7 r" N! q6 r* w! i' ~# S# [7 q
-N neutron-l3-agent-FORWARD' L" X* b! L, u
-N neutron-l3-agent-INPUT
! w: E* n! B+ R; V' h-N neutron-l3-agent-OUTPUT0 H# S' y& \7 ^, H5 s; r2 S: Q. F
-N neutron-l3-agent-fwaas-defau #新增的 firewall chain
, T" U6 C* R9 G$ j) Y-N neutron-l3-agent-iv4aa85bd66 #新增的 firewall chain5 }5 z4 B9 T n! m4 Y/ N& g
-N neutron-l3-agent-local
" Z4 ]5 P6 i {7 [" X; m3 Y-N neutron-l3-agent-ov4aa85bd66 #for firewall
) F6 o2 g. @& d) A-A INPUT -j neutron-l3-agent-INPUT
0 G( V+ z, ]$ ]4 ]5 O-A FORWARD -j neutron-filter-top- q1 R- [# l3 F4 G' X+ \5 O
-A FORWARD -j neutron-l3-agent-FORWARD #将 forward 转到 neutron 的chain* Z, Q' Q4 j" ~5 A& p" |
-A OUTPUT -j neutron-filter-top
% N- o2 C5 X$ h3 f2 T-A OUTPUT -j neutron-l3-agent-OUTPUT
2 w! ~8 {2 B0 G0 v" E. X-A neutron-filter-top -j neutron-l3-agent-local
$ ^: S" h& t$ y& i! ~-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa85bd66 #进数据网络的包" h9 T3 `- O% b
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa85bd66 #出数据网络的包0 v4 x. Q# m' T/ N
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau #进数据网络的包的默认处理 chain, ^6 W5 n3 _1 C( x
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau #出数据网络的包的默认处理 chain
4 J4 O* z1 N1 t+ J6 i- P-A neutron-l3-agent-INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 9697 -j ACCEPT& O) O! z. r5 _, [* Q
-A neutron-l3-agent-fwaas-defau -j DROP #默认丢弃没有被以上规则处理的所有包( ~+ B6 |8 S- [ i w Z
-A neutron-l3-agent-iv4aa85bd66 -m state --state INVALID -j DROP4 v1 l7 c& c& L9 h" D8 v
-A neutron-l3-agent-iv4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT #接受状态为 RELATED, ESTABLISHED (已建立的连接)的包
$ O2 S: l7 w$ u' K' F8 ^- U _6 r-A neutron-l3-agent-iv4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据定义的 FWaas rule,接受目的端口为 80 的 tcp 包
; x" g* ^, s- x3 W- L% U-A neutron-l3-agent-ov4aa85bd66 -m state --state INVALID -j DROP
- X- i* e5 v: z8 B4 M5 Z" }-A neutron-l3-agent-ov4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT" A4 Z$ p$ {, f9 ~6 D
-A neutron-l3-agent-ov4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据 FWaas rule,接收目的端口为 80 的 tcp 包
, ?* K" s* b6 H& l3 y- X复制代码
+ \0 M# ]; l- l4 E1 c* [ |
|