- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
1. Nova 安全组
0 C! Z/ r: y/ n3 X0 Y! C1.1 配置9 p3 G: B1 q1 ~% ? X9 z5 c
节点 配置文件 配置项 说明
( a/ T- x% p( J( |1 Pcontroller /etc/nova/nova.conf security_group_api = nova 是的 nova secgroup* 命令使用的是 nova 安全组的 API2 N+ E" v1 @2 j+ D
/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组3 ]8 q% y: Q' \" R0 a
nova-compute
! ?, W! [0 d! n |; W/ r. b/etc/nova/nova.conf
3 m3 \ P2 {9 _% _6 `( r7 Z" w) z/etc/nova/nova-compute.conf
% j( I0 ~6 ~9 Ffirewall_driver = nova.virt.firewall.IptablesFirewallDriver 指定 Nova 安全组的驱动,可以是IptablesFirewallDriver 或者 NWFilterFirewall。默认是 IptablesFirewallDriver。见下面的说明。4 \; B. S$ t4 V& \4 ^
/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组
: w. n) N6 U( ynetwork /etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全组: `3 P. G7 t2 v2 V( `& ^
nova 提供两种实现方式:使用 libvirt's nwfilter 的实现以及使用 linux iptables 的实现,默认的方式是使用 linux iptables。可以通过设置配置项 firewall_driver 的值指定。需要注意的是,即使使用 iptables,依然使用了部分 nwfilter 功能。参见 https://ask.openstack.org/en/question/19456/how-security-group-is-implemented/
/ h. w' X. [( \1 nfirewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver1 h& s) Z: F+ g. a& i6 @
firewall_driver=nova.virt.libvirt.firewall.NWFilterFirewall
7 ^( M* D% R* f1 Q! X! K1 L, t1.2 CLI
9 c7 A+ ]+ k- h& Z% i3 b1 A复制代码6 A4 c }& T1 y. q3 a
列表安全组:
7 ?. d5 d8 K* Es1@controller:~$ nova secgroup-list-rules novasg1
5 X" G- u' K# r2 f+-------------+-----------+---------+-----------+--------------+
. s% H1 u# \* W s* [| IP Protocol | From Port | To Port | IP Range | Source Group | D" R0 C, T: [6 T/ f, h/ ]$ f7 e
+-------------+-----------+---------+-----------+--------------+
% C2 r( O" V7 B% K8 S4 Z" M| tcp | 22 | 22 | 0.0.0.0/0 | |$ @* e/ @1 Y8 R# u" v# h: Z
+-------------+-----------+---------+-----------+--------------+
2 Z! M$ l, C7 ]创建一个安全组规则:
P y: D2 b" ^$ y* R( H+ As1@controller:~$ nova secgroup-add-rule novasg1 udp 53 53 100.1.100.0/24& W: [8 a1 |' P" f: _! q
+-------------+-----------+---------+----------------+--------------+
8 e# V+ j4 W r3 [' |- E| IP Protocol | From Port | To Port | IP Range | Source Group |
' o5 N2 _: M: [! u. G4 v+-------------+-----------+---------+----------------+--------------+5 E& z8 }& ~, m9 t4 d) t
| udp | 53 | 53 | 100.1.100.0/24 | |: V9 A' L% P' h8 D3 U0 ?( h+ E/ X
+-------------+-----------+---------+----------------+--------------+8 d1 a2 R9 l" l+ g1 G
删除虚机的安全组:7 D% E/ C6 W7 x+ G, e
s1@controller:~$ nova remove-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg10 t. C' |: T5 x* S' G1 n% x1 E
添加安全组到虚机:
: E* n1 f4 [2 F- K% |& is1@controller:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg1' I. f" R' a! j' Y+ W) l- M
创建第二个安全组:+ z3 o& Y8 U" x! `0 G1 {
s1@controller:~$ nova secgroup-add-rule novasg2+ p' Z0 |8 \9 I0 T0 n- J6 W
添加规则:" W# u/ Q2 A) I) R6 Z: }
s1@controller:~$ nova secgroup-add-rule novasg2 icmp -1 -1 0.0.0.0/0
( u }% l1 r, O+-------------+-----------+---------+-----------+--------------+$ P8 `4 f( I% w l' t0 [3 p, h
| IP Protocol | From Port | To Port | IP Range | Source Group |
2 E/ f' B2 n7 m* k+ s" W" T+-------------+-----------+---------+-----------+--------------+3 e \# f% ]8 ~& x" ?
| icmp | -1 | -1 | 0.0.0.0/0 | |
, `& C. g0 T( l! t4 F+-------------+-----------+---------+-----------+--------------+
1 F/ I- K9 u- V, a再添加安全组到虚机:
7 V' Q8 {# s; c* X8 K) a* Qs1@controller:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg2
9 o; \: ^8 `2 }7 C1 w/ {复制代码
4 f- g- P5 f2 R" M- j/ M6 R1.3 iptables 链
6 h7 |) M; m0 l3 a( Q1 i% E, gNova-compute 增加了 filter 表的 INPUT,OUTPUT 和 FORWARD 链:
( {8 _# P2 z. v) i7 t! _$ N( |
( s3 d: o2 }5 Z* d% k) z4 m8 ^' P复制代码
% p" S- B( h( `, l# q$ w3 Q/ a-N nova-compute-FORWARD
+ M @2 H3 b0 C( t; l% V) k-N nova-compute-INPUT: i5 b* i$ ?1 U' b
-N nova-compute-OUTPUT" B' a; |4 a9 g6 C Q3 y" N
-N nova-compute-inst-122 #每个虚机一个链,命名规则是 ”inst“-<instance 在数据库中的 id>3 ^$ W, B2 N9 E) {: N# c" Q, E
-N nova-compute-local
( Z* D) [. V6 e9 q% ~- R+ @-N nova-compute-provider
, J, T8 y, G0 |* ?7 W4 ]-N nova-compute-sg-fallback4 R: J8 H$ Y" |% F1 x$ z
-N nova-filter-top
& M- b, Q" ^3 ]9 O-A INPUT -j nova-compute-INPUT' D. ], y* y6 [1 `4 \2 c- P; Y' ~
-A FORWARD -j nova-filter-top
9 ]3 B: S* F& g0 _- a4 x-A FORWARD -j nova-compute-FORWARD
& P% M# R) K5 M7 W1 k' ~/ X-A OUTPUT -j nova-filter-top
3 I" `, l* b0 x; J-A OUTPUT -j nova-compute-OUTPUT
8 D4 S- v7 \+ q0 V6 _) L-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 广播
4 A* n3 q2 c P8 S* y# d% W-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 广播包) ?. h$ H0 |; G0 F8 x8 m) a
-A nova-compute-inst-122 -m state --state INVALID -j DROP
# b1 g2 X/ g2 u) q6 [-A nova-compute-inst-122 -m state --state RELATED,ESTABLISHED -j ACCEPT+ L1 G: O+ ?1 h
-A nova-compute-inst-122 -j nova-compute-provider
, E1 C/ {$ e) T-A nova-compute-inst-122 -s 91.1.180.2/32 -p udp -m udp --sport 67 --dport 68 -j ACCEPT #接受该虚机所在子网的 DHCP Server 返回的包
$ Z" A E5 o9 ]& s-A nova-compute-inst-122 -s 91.1.180.0/24 -j ACCEPT #在配置项 allow_same_net_traffic = true 的情况下接受同网段虚机的来访包& |5 }- }7 e* q7 P# c% M
-A nova-compute-inst-122 -p tcp -m tcp --dport 22 -j ACCEPT #用户安全组规则指定的来访包: J: j1 a7 W* [, W8 i7 _/ |
-A nova-compute-inst-122 -s 100.1.100.0/24 -p udp -m udp --dport 53 -j ACCEPT #用户安全组规则指定的来访包
4 z; h0 l$ R. m% j+ ?-A nova-compute-inst-122 -p icmp -j ACCEPT #用户安全组规则指定的来防爆
6 t& ^* B) ~/ \5 ~) p" s-A nova-compute-inst-122 -j nova-compute-sg-fallback #没被上面规则处理的其它来访包 3 A/ m2 V$ W( e/ Z
-A nova-compute-local -d 91.1.180.14/32 -j nova-compute-inst-122 # “-d“ 决定了 nova 安全组只检查进入虚机的网络包1 o& I/ k/ p2 i. C! Y
-A nova-compute-sg-fallback -j DROP #丢弃其它包,只允许上述规则指定的网络访问# W2 o. \& t, C/ r% \. _
-A nova-filter-top -j nova-compute-local
9 s' ?6 ^0 p! k: _, l _复制代码' d; e# Y3 T3 Y7 o
2. FWaas2 J2 u w( [8 \) V* V) K0 T- E: x6 _
2.1 概念
1 ^. B$ \/ ~& f( }0 E 从 Havana 版本开始,Neutron 提供一种基于 Neutron L3 Agent 的一种网络四层防火墙虚拟化参考实现 Firewall-as-a-service,简称 FWaas。本文的分析是基于 openstack Juno 版本进行的。Juno 版本中,FWaas 是分租户的,但是可以在多个租户之间共享。每个租户只允许一个防火墙。与物理的防火墙类似,FWaas 也有三个主要概念:
) q/ T8 ~* n7 i# s0 E8 `$ Q (1)规则(Rule):允许用户指定所要匹配的名称,描述,针对的协议(TCP, UDP, ICMP, ANY),行为(Allow,Deny),源/目的 IP 地址/子网 和 端口号/端口号区间。
2 g" W- ~+ M5 V9 b2 C
3 n% ^3 O- }0 o* s$ @' q" F与 neutron 安全组中的规则的区别是,这里需要指定被匹配到的数据包的处理行为是通过(ALLOW)和不通过(DENY),但是不能指定网络方向。FWaas 会将规则同时应用到进出网络的网络包上。# I' Z$ c# O" k( f1 b! j
(2)策略(Policy):规则的逻辑集合。Policy 可以是共享的 和 被审计的(Audited)。目前,FWaas 只是把 “audited” 保存到 DB 中,并没有对它做任何处理。& V# W+ H1 f( i
. Z/ V+ a# n5 n(3)防火墙(Firewall):策略的逻辑集合。见上面右图。Juno 版本中,每个租户只能拥有最多一个 Firewall。防火墙可以是共享的。
& a) N4 ~% l& S 这里需要说明的是 FWaas 和 Security Group (安全组) 的区别。安全组规则在连接到一个实例的计算节点上的Linux桥 qbr 上实施,FWaaS 创建的防火墙规则在租户网络边缘实现的虚拟路由器上实施。 FWaaS 并不旨在取代安全组的功能,并且它提供更为补充安全组,特别是在其当前实现状态下。 FWaaS 目前缺乏安全组提供的一些功能,包括无法指定通信的方向等。与此相反,安全组,也因为他们缺乏创建特定规则拒绝所有流量的能力,因此需要 FWaas 作为补充。7 m2 R$ R/ f8 E$ d% h9 `
% M+ p5 J5 u* S1 h
; ?/ p/ S/ u/ H2 }' d- ~; E& w4 P2.2 配置: P" c7 w2 ] C! H& _# M
节点 配置和操作( b h' z! ~& A2 t
控制节点上
- d b2 Q2 j2 }# L修改 /etc/neutron/neutron.conf:4 z( B. L% X. @. K
[default]6 R/ a# i; R6 F( z" j& E
service_plugins = router,lbaas,firewall
! U2 H4 {" u" i }& w9 U+ E[service_providers]0 G4 x6 j* z6 `/ I3 P
service_provider = FIREWALL:Iptables:neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver:default! O3 H2 U. v, B) T3 f6 n4 {
9 R! f" x" f2 H8 A9 ~( C( Yservice neutron-server restart
/ b9 j; S& h2 o$ C) S% f8 O5 H% l0 a + Q) ^) y3 @1 u+ ]8 }7 r
修改 /usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py:'enable_firewall': True
8 X9 Z# {: b- y3 Q! [! G网络节点上
/ X& Y+ m& t6 M- E修改 /etc/neutron/fwaas_driver.ini:
6 ?# U- E% N/ l4 h. Z8 a, B2 F2 k[fwaas]
6 m! T' e; X# |* l" R* f/ I5 Edriver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver6 k5 o9 o- t3 T; I
enabled = True
: ^* `- o9 E9 G) g, w: ~3 @8 A- T$ u- K
' [. o5 I$ T' nservice neutron-l3-agent restart" W# ? J6 H0 _8 d! \# X" _
1 g: D" R8 I6 s' E J2.3 实现0 _. o8 q, K1 O& C! M7 l- M
目前的实现中,FWaas 是通过在其所在 tenant 中的所有 Virtual Router 上添加 iptbales 规则来实现对进出数据网络的网络包进行控制的。4 g! x) j2 E! O( q
8 M0 n: ?$ I' M/ f: w代码实现:% R! c2 P6 y4 }; P
控制节点上(class FirewallPlugin):
& G, Q2 w* C+ n" s9 j# P(1)create rule:纯数据库操作,将 rule 保存到数据中。& j O* @5 p1 N) H. O c, v& g3 I/ P
(2)create policy:纯数据库操作,将 policy 保存到数据中。0 @( C5 I2 v8 E j) {; ]) q( @
(3)如果将 rule 添加到一个已经添加到 firwall 的 policy,或者将一个 policy 加入一个存在的 firewall,在数据库操作后,通过 RPC fanout 到所有的 L3 Agent host:9 s* [2 B' L. B" T; g+ t5 w' `
{'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'}3 [6 d, G% u; _* Y
insert_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_firewall4 a% n4 q: d; h( [9 l8 y8 ?( q) Q
create_firewall -> Firewall_db_mixin.create_firewall -> FirewallAgentApi.create_firewall
' B! a" ^( a9 E7 ~update_firewall -> Firewall_db_mixin.update_firewall -> FirewallAgentApi.update_firewall
3 b4 {4 q' G- }1 S- fdelete_firewall -> Firewall_db_mixin.delete_firewall -> FirewallAgentApi.delete_firewall! Q2 T, P$ g) }$ y
FirewallAgentApi.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_api
l" A. B- V. @/ f/ x# z' m 网络节点上(class FWaaSL3AgentRpcCallback):
% K/ p7 q. N% t& h$ a(1) 通过 RPC 获取所有的 router,在获取firewall 所在的 tenant 上的 routers
! w6 g$ S) J A" y+ B(2)调用 IptablesFwaasDriver.update_firewall,依次更新每个 router 的 iptables 规则
3 p7 G& |/ q# [, H7 _3 [) L(3)首先删除已有规则,然后根据配置的 rules 重新生成规则 $ Q5 b! {2 W. x/ Y8 J4 |
复制代码- J/ [6 V9 X0 P g# U
root@network:/var/cache# ip netns exec qrouter-e438bebe-6795-4b68-a613-ec0df38d3064 iptables -t filter -S* \* e7 c" l3 H7 \$ n' a# T; {
-P INPUT ACCEPT
+ S/ o7 h/ x% a- X$ |9 z-P FORWARD ACCEPT- S% T, d3 J! x) u+ O$ x3 q
-P OUTPUT ACCEPT
$ ?. p3 r9 Z: @. T1 r-N neutron-filter-top
! N9 H5 v# X# X+ t t* L+ X-N neutron-l3-agent-FORWARD/ y" V# Q* k$ a- f) a
-N neutron-l3-agent-INPUT6 T' F6 u. E7 ]" g
-N neutron-l3-agent-OUTPUT7 \8 }& X+ W0 i" n% J
-N neutron-l3-agent-fwaas-defau #新增的 firewall chain
4 G9 C9 J; L# D+ P-N neutron-l3-agent-iv4aa85bd66 #新增的 firewall chain
* q& k3 ?6 O( ^ E$ ^-N neutron-l3-agent-local
3 ]9 L4 l! t' @+ L9 e/ w) w-N neutron-l3-agent-ov4aa85bd66 #for firewall
0 D! l! _: `( ~1 A) D: O-A INPUT -j neutron-l3-agent-INPUT
, \' y2 z8 J+ l0 @5 H-A FORWARD -j neutron-filter-top5 d# c& }. Q% \( r$ Z. z
-A FORWARD -j neutron-l3-agent-FORWARD #将 forward 转到 neutron 的chain) E( T4 _) F- d. E3 g2 L
-A OUTPUT -j neutron-filter-top8 E7 | B# D' k. v: ]4 J6 J% H- A+ h
-A OUTPUT -j neutron-l3-agent-OUTPUT" u6 V! T! w5 B6 O5 r
-A neutron-filter-top -j neutron-l3-agent-local$ L; O4 y3 U+ D& h x8 |! ^) O6 b
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa85bd66 #进数据网络的包+ \" [; Y$ [; d
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa85bd66 #出数据网络的包
5 M$ g* ^/ x$ N+ z-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau #进数据网络的包的默认处理 chain, g3 ^9 A% A9 W( P+ h; m
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau #出数据网络的包的默认处理 chain, F* v9 k2 S) s& V) f7 L: e) |3 Z
-A neutron-l3-agent-INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 9697 -j ACCEPT) l* N7 d) W' T2 Z2 X9 }1 C* V
-A neutron-l3-agent-fwaas-defau -j DROP #默认丢弃没有被以上规则处理的所有包; Y R6 R+ Y/ d7 b$ M. h! @8 ~
-A neutron-l3-agent-iv4aa85bd66 -m state --state INVALID -j DROP: Z9 ^# ?1 {# {5 W
-A neutron-l3-agent-iv4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT #接受状态为 RELATED, ESTABLISHED (已建立的连接)的包
$ K8 M( ]' Y! T; K" E9 V' |) G7 f-A neutron-l3-agent-iv4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据定义的 FWaas rule,接受目的端口为 80 的 tcp 包3 J: J2 v! j( R$ e/ w; {+ D
-A neutron-l3-agent-ov4aa85bd66 -m state --state INVALID -j DROP8 t6 S2 x1 ]/ V. I, N
-A neutron-l3-agent-ov4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT! @& L; h: E! i7 n
-A neutron-l3-agent-ov4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据 FWaas rule,接收目的端口为 80 的 tcp 包
) y# ~! p6 X) N4 q3 F$ @复制代码
' K1 d7 R \% @2 [ |
|