1. 程式人生 > >Neutron 理解 (9): OpenStack 是如何實現 Neutron 網路 和 Nova虛機 防火牆的 [How Nova Implements Security Group and How Neutron Implements Virtua

Neutron 理解 (9): OpenStack 是如何實現 Neutron 網路 和 Nova虛機 防火牆的 [How Nova Implements Security Group and How Neutron Implements Virtua

學習 Neutron 系列文章:

1. Nova 安全組

1.1 配置

節點 配置檔案 配置項 說明
controller  /etc/nova/nova.conf security_group_api = nova  是的 nova secgroup* 命令使用的是 nova 安全組的 API
/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全組
nova-compute

/etc/nova/nova.conf

/etc/nova/nova-compute.conf

firewall_driver = nova.virt.firewall.IptablesFirewallDriver 指定 Nova 安全組的驅動,可以是IptablesFirewallDriver 或者 NWFilterFirewall。預設是 IptablesFirewallDriver。見下面的說明。
/etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全組
network /etc/neutron/plugins/ml2/ml2_conf.ini enable_security_group = False 禁止 Neutron 安全組

 nova 提供兩種實現方式:使用 libvirt's nwfilter 的實現以及使用 linux iptables 的實現,預設的方式是使用 linux iptables。可以通過設定配置項  firewall_driver 的值指定。需要注意的是,即使使用 iptables,依然使用了部分 nwfilter 功能。參見 https://ask.openstack.org/en/question/19456/how-security-group-is-implemented/

  • firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
  • firewall_driver=nova.virt.libvirt.firewall.NWFilterFirewall

1.2 CLI

列表安全組:
[email protected]:~$ nova secgroup-list-rules novasg1 +-------------+-----------+---------+-----------+--------------+ | IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-----------+--------------+ | tcp | 22 | 22 | 0.0.0.0/0 | | +-------------+-----------+---------+-----------+--------------+
建立一個安全組規則:

[email protected]:~$ nova secgroup-add-rule novasg1 udp 53 53 100.1.100.0/24
+-------------+-----------+---------+----------------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+----------------+--------------+
| udp | 53 | 53 | 100.1.100.0/24 | |
+-------------+-----------+---------+----------------+--------------+

刪除虛機的安全組:

[email protected]:~$ nova remove-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg1

新增安全組到虛機:

[email protected]:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg1

建立第二個安全組:

[email protected]:~$ nova secgroup-add-rule novasg2

新增規則:

[email protected]:~$ nova secgroup-add-rule novasg2 icmp -1 -1 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp | -1 | -1 | 0.0.0.0/0 | |
+-------------+-----------+---------+-----------+--------------+

再新增安全組到虛機:

[email protected]:~$ nova add-secgroup 2c59a875-bc23-4605-ad70-5315d7a3f8e2 novasg2

1.3 iptables 鏈

Nova-compute 增加了 filter 表的 INPUT,OUTPUT 和 FORWARD 鏈:

-N nova-compute-FORWARD
-N nova-compute-INPUT
-N nova-compute-OUTPUT
-N nova-compute-inst-122 #每個虛機一個鏈,命名規則是 ”inst“-<instance 在資料庫中的 id>
-N nova-compute-local
-N nova-compute-provider
-N nova-compute-sg-fallback
-N nova-filter-top
-A INPUT -j nova-compute-INPUT
-A FORWARD -j nova-filter-top
-A FORWARD -j nova-compute-FORWARD
-A OUTPUT -j nova-filter-top
-A OUTPUT -j nova-compute-OUTPUT
-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 廣播
-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 廣播包
-A nova-compute-inst-122 -m state --state INVALID -j DROP
-A nova-compute-inst-122 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A nova-compute-inst-122 -j nova-compute-provider
-A nova-compute-inst-122 -s 91.1.180.2/32 -p udp -m udp --sport 67 --dport 68 -j ACCEPT #接受該虛機所在子網的 DHCP Server 返回的包
-A nova-compute-inst-122 -s 91.1.180.0/24 -j ACCEPT                                     #在配置項 allow_same_net_traffic = true 的情況下接受同網段虛機的來訪包
-A nova-compute-inst-122 -p tcp -m tcp --dport 22 -j ACCEPT                             #使用者安全組規則指定的來訪包
-A nova-compute-inst-122 -s 100.1.100.0/24 -p udp -m udp --dport 53 -j ACCEPT           #使用者安全組規則指定的來訪包
-A nova-compute-inst-122 -p icmp -j ACCEPT                                              #使用者安全組規則指定的來防爆
-A nova-compute-inst-122 -j nova-compute-sg-fallback                                    #沒被上面規則處理的其它來訪包 
-A nova-compute-local -d 91.1.180.14/32 -j nova-compute-inst-122                        # “-d“ 決定了 nova 安全組只檢查進入虛機的網路包
-A nova-compute-sg-fallback -j DROP                                                     #丟棄其它包,只允許上述規則指定的網路訪問
-A nova-filter-top -j nova-compute-local

2. FWaas

2.1 概念

    從 Havana 版本開始,Neutron 提供一種基於 Neutron L3 Agent 的一種網路四層防火牆虛擬化參考實現 Firewall-as-a-service,簡稱 FWaas。本文的分析是基於 OpenStack Juno 版本進行的。Juno 版本中,FWaas 是分租戶的,但是可以在多個租戶之間共享。每個租戶只允許一個防火牆。與物理的防火牆類似,FWaas 也有三個主要概念:

 (1)規則(Rule):允許使用者指定所要匹配的名稱,描述,針對的協議(TCP, UDP, ICMP, ANY),行為(Allow,Deny),源/目的 IP 地址/子網 和 埠號/埠號區間。

 

與 neutron 安全組中的規則的區別是,這裡需要指定被匹配到的資料包的處理行為是通過(ALLOW)和不通過(DENY),但是不能指定網路方向。FWaas 會將規則同時應用到進出網路的網路包上。

(2)策略(Policy):規則的邏輯集合。Policy 可以是共享的 和 被審計的(Audited)。目前,FWaas 只是把 “audited” 儲存到 DB 中,並沒有對它做任何處理。

(3)防火牆(Firewall):策略的邏輯集合。見上面右圖。Juno 版本中,每個租戶只能擁有最多一個 Firewall。防火牆可以是共享的。 

    這裡需要說明的是 FWaas 和 Security Group (安全組) 的區別。安全組規則在連線到一個例項的計算節點上的Linux橋 qbr 上實施,FWaaS 建立的防火牆規則在租戶網路邊緣實現的虛擬路由器上實施。 FWaaS 並不旨在取代安全組的功能,並且它提供更為補充安全組,特別是在其當前實現狀態下。 FWaaS 目前缺乏安全組提供的一些功能,包括無法指定通訊的方向等。與此相反,安全組,也因為他們缺乏建立特定規則拒絕所有流量的能力,因此需要 FWaas 作為補充。

2.2 配置

節點 配置和操作
控制節點上 修改 /etc/neutron/neutron.conf: [default] service_plugins = router,lbaas,firewall [service_providers] service_provider = FIREWALL:Iptables:neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver:default service neutron-server restart 修改 /usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py:'enable_firewall': True
網路節點上 修改 /etc/neutron/fwaas_driver.ini: [fwaas]
driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
enabled = True service neutron-l3-agent restart

2.3 實現

目前的實現中,FWaas 是通過在其所在 tenant 中的所有 Virtual Router 上新增 iptbales 規則來實現對進出資料網路的網路包進行控制的。

程式碼實現:

控制節點上(class FirewallPlugin):

(1)create rule:純資料庫操作,將 rule 儲存到資料中。

(2)create policy:純資料庫操作,將 policy 儲存到資料中。

(3)如果將 rule 新增到一個已經新增到 firwall 的 policy,或者將一個 policy 加入一個存在的 firewall,在資料庫操作後,通過 RPC fanout 到所有的 L3 Agent host:

{'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'}

  • 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_firewall
  • create_firewall -> Firewall_db_mixin.create_firewall -> FirewallAgentApi.create_firewall
  • update_firewall -> Firewall_db_mixin.update_firewall -> FirewallAgentApi.update_firewall
  • delete_firewall -> Firewall_db_mixin.delete_firewall -> FirewallAgentApi.delete_firewall
  • 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

 網路節點上(class FWaaSL3AgentRpcCallback):

(1) 通過 RPC 獲取所有的 router,在獲取firewall 所在的 tenant 上的 routers

(2)呼叫 IptablesFwaasDriver.update_firewall,依次更新每個 router 的 iptables 規則

(3)首先刪除已有規則,然後根據配置的 rules 重新生成規則 

[email protected]:/var/cache# ip netns exec qrouter-e438bebe-6795-4b68-a613-ec0df38d3064 iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N neutron-filter-top
-N neutron-l3-agent-FORWARD
-N neutron-l3-agent-INPUT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-fwaas-defau #新增的 firewall chain
-N neutron-l3-agent-iv4aa85bd66 #新增的 firewall chain
-N neutron-l3-agent-local
-N neutron-l3-agent-ov4aa85bd66 #for firewall
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-l3-agent-FORWARD #將 forward 轉到 neutron 的chain
-A OUTPUT -j neutron-filter-top
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A neutron-filter-top -j neutron-l3-agent-local
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa85bd66 #進資料網路的包
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa85bd66 #出資料網路的包
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau #進資料網路的包的預設處理 chain -A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau #出資料網路的包的預設處理 chain -A neutron-l3-agent-INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 9697 -j ACCEPT -A neutron-l3-agent-fwaas-defau -j DROP #預設丟棄沒有被以上規則處理的所有包
-A neutron-l3-agent-iv4aa85bd66 -m state --state INVALID -j DROP -A neutron-l3-agent-iv4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT #接受狀態為 RELATED, ESTABLISHED (已建立的連線)的包 -A neutron-l3-agent-iv4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根據定義的 FWaas rule,接受目的埠為 80 的 tcp 包
-A neutron-l3-agent-ov4aa85bd66 -m state --state INVALID -j DROP -A neutron-l3-agent-ov4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT -A neutron-l3-agent-ov4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根據 FWaas rule,接收目的埠為 80 的 tcp 包

歡迎大家關注我的個人公眾號:

相關推薦

Neutron 理解 (9): OpenStack 是如何實現 Neutron 網路 Nova 防火牆的 [How Nova Implements Security Group and How Neutron Implements Virtua

學習 Neutron 系列文章: 1. Nova 安全組 1.1 配置 節點 配置檔案 配置項 說明 controller  /etc/nova/nova.conf security_group_api =

Openstack中用keypair生成訪問的方法

IE jca SM h+ cow IV -i wkt tro Openstack中用鏡像文件生成的image來創建虛機(VM或Instance)時, 通常不支持用戶名加密碼的ssh方式登錄訪問該VM,而是key file方式. 這裏以Centos的鏡像為例, 介紹用keyp

深度學習Caffe實戰(9)Windows 平臺caffe用MATLAB介面實現訓練網路測試

上一篇介紹了網路協議中各個引數的作用,知道了各個引數的作用,想必應該可以嘗試修改網路結構了。前幾篇部落格介紹的都是用命令列訓練和測試網路,這篇部落格介紹如何用MATLAB介面實現訓練和測試網路,window平臺下caffe使用者本來就少,這方面的資料更少了,下一

Neutron 理解 (8): Neutron 是如何實現機防火牆的 [How Neutron Implements Security Group]

學習 Neutron 系列文章: 1. 基礎知識 1.1 防火牆(firewall)     防火牆是依照特定的規則來控制進出它的網路流量的網路安全系統。一個典型的場景是在一個受信任的內網和不受信任的外網比如 Internet 之間建立一個屏障。防火牆

OpenStack社群元件-網路內容釋出

    OpenStack發展到今天,從最開始的A版開始,到2017年8月份剛釋出的P版,已經發布了很多個版本。    OpenStack社群把OpenStack各個元件進行了歸類,一共分成了9大類。 

SurfaceViewMediaplayer實現播放網路本地視訊 一

程式碼是最好的老師!!直接上程式碼 package com.example.yaoan.surfaceviewtest; import android.media.MediaPlayer; import android.net.Uri; import a

CentOS6 在VirtualBox中實現全屏根據視窗大小自動調整解析度 | Install Guest additions and run fullscreen mode on VirtualB

前一篇文章《CentOS6 Minimal 安裝桌面(GNOME)》寫了如何給CentOS安裝圖形桌面系統,這篇文章說明通過安裝增強包來實現VirtualBox中的CentOS6.x實現全屏和解析度自動調整。 環境 | Enviroment CentOS 6.6VirtualBox 4.3.28 安裝

KVM(八)使用 libvirt 遷移 QEMU/KVM Nova

1. QEMU/KVM 遷移的概念      遷移(migration)包括系統整體的遷移和某個工作負載的遷移。系統整理遷移,是將系統上所有軟體包括作業系統完全複製到另一個物理機硬體機器上。虛擬化環境中的遷移,可分為靜態遷移(static migration,或者 冷遷移 co

玩轉OpenStack--4>啟動第一個 KVM

玩轉OpenStack--4>啟動第一個 KVM 虛機 本節演示如何使用 virt-manager 啟動 KVM 虛機。 首先通過命令 virt-manager 啟動圖形介面 # virt-manager 點上面的圖示建立虛機 給虛機命名為 kvm1

理解OpenShift(1):網路之 Router Route Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的

 理解OpenShift(1):網路之Router 和 Route   1. OpenShift 為什麼需要 Router 和 Route? 顧名思義,Router 是路由器,Route 是路由器中配置的路由。OpenShift 中的這兩個概念是為了解決從叢集外部(就是從除了叢集節點

Neutron 理解 (6): Neutron 是怎麼實現虛擬三層網路的 [How Neutron implements virtual L3 network]

學習 Neutron 系列文章:     Neutron 對虛擬三層網路的實現是通過其 L3 Agent (neutron-l3-agent)。該 Agent 利用 Linux IP 棧、route 和 iptables 來實現內網內不同網路內的虛機之間的網路流量

Neutron 理解 (1): Neutron實現網路虛擬化 [How Neutron Virtualizes Network]

學習 Neutron 系列文章:  1. 為什麼要網路虛擬化? 個人認為,這裡主要有兩個需求:一個是資料中心的現有網路不能滿足雲端計算的物理需求;另一個是資料中心的現有網路不能滿足雲端計算的軟體化即SDN要求。 1.1 現有物理網路不能

Neutron 理解 (1): Neutron實現的虛擬化網路 [How Netruon Virtualizes Network]

1. 為什麼要網路虛擬化? 個人認為,這裡主要有兩個需求:一個是資料中心的現有網路不能滿足雲端計算的物理需求;另一個是資料中心的現有網路不能滿足雲端計算的軟體化即SDN要求。 1.1 現有物理網路不能滿足雲端計算的需求     網際網路行業資料中心的基本特徵就是伺服

Neutron 理解 (4): Neutron OVS OpenFlow 流表 L2 Population [Netruon OVS OpenFlow tables + L2 Population]

學習 Neutron 系列文章:       OVS bridge 有兩種模式:“normal” 和 “flow”。“normal” 模式的 bridge 同普通的 Linux 橋,而 “flow” 模式的 bridge 是根據其流表(flow tab

理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虛擬網路

學習 Neutron 系列文章: 雖然大部分的OpenStack 部署環境中,都會使用 Open vSwitch 來作為虛擬交換機來實現二層網路功能,但是Neutron 仍然支援使用 Linux bridge 作為虛擬交換機來實現二層網路。

Neutron 理解 (7): Neutron 是如何實現負載均衡器虛擬化的 [LBaaS V1 in Juno]

學習 Neutron 系列文章: 1. 基礎知識 1.1 負載均衡的概念   負載均衡(Load Balancing)是將來訪的網路流量在執行相同應用的多個伺服器之間進行分發的一種核心網路服務。它的功能由負載均衡器(load balancer)提供。負

Openstack neutron l3 HA的實現

記錄學習neutron l3 HA實現的過程。 1.  router所在的所有節點的namespace中都會啟動keepalived服務,通過keepalived服務來控制節點的選舉: keepalived的程序: keepalived -P -f /var/lib/ne

玩轉OpenStack網路Neutron(3)--配置多種不同型別網路

Neutron 網路型別介紹 計算節點配置 Load Balance 網路節點配置 Load Balance 配置Neutron 使用 Load Balance Mechanism Driver 配置Neutron 使用 Flat (扁平)網路

OpenStack Neutron裡如何改變預設租戶網路的型別

OpenStack Neutron支援的租戶網路型別有flat, local, VLAN, VXLAN和GRE。通常用的比較多的是VLAN, VXLAN和GRE。在使用租戶網路的時候,有時侯會面臨一個問題,如何改變預設的租戶網路型別,比如從VLAN改為VXLAN。要實現這一

asp.net -mvc框架復習(9)-實現用戶登錄控制器視圖的編寫並調試

分享圖片 null admin img pac http tro .com sum 1.編寫控制器 三個步驟: 【1】獲取數據 【2】業務處理 【3】返回數據 using System;using System.Collections.Generic;using Syst