OpenStack----Neutron服務的DHCP代理、網絡名稱空間、L3代理

一、DHCP代理

OpenStack的實例在啓動過程中能夠從Neutron提供的DHCP服務自動獲取IP地址。

1.1、DHCP主要組件

  • DHCP代理( neutron-dhcp-agent) :爲項目網絡提供DHCP功能,提供元數據請求(Metadata request)服務。

  • DHCP驅動:用於管理DHCP服務器,默認爲DNSmasq,這是有1個提供DHCP和DNS服務的開源軟件,提供DNS緩存和DHCP服務功能。

  • DHCP代理調度器(Agent Scheduler) :負責DHCP代理與網絡(Network) 的調度。

1.2、DHCP代理的主要任務

Neutron DHCP提供兩類REST API接口: Agent Managerment Extension API和Agent Scheduler Extension API,這兩類API都是extension API DHCP代理是核心組件,完成以下任務。

  • 定期報告DHCP代理的網絡狀態,通過RPC報告給Neutron-server,然後通過Core Plugin報告給數據庫並進行更新網絡狀態。

  • 啓動dnsmasq進程,檢測gdhcp-xxx名稱(Namespace)中的ns-xxx端口接收到DHCP DISCOVER請求,在啓動dnsmasq進程的過程中,決定是否需要創建名稱空間中的ns-xxx端口,是否需要配置名稱空間中的iptables,是否需要刷新dnsmasq進程所需的配置文件。

  • 創建網絡(Network) 並在子網(subnet)上啓用 DHCP時,網絡節點上的DHCP代理會啓動一個dnsmasq進程爲網絡提供DHCP服務。dnsmasq 與網絡(network) 是一一對 應關係,一個dnsmasq進程可爲同一網絡中 所有啓動DHCP的子網(Subnet) 提供服務

1.3、DHCP 代理配置文件

DHCP代理配置文件是/etc/neutron/dhcp_agent.ini

其中有重要的配置選項有二個。
[root@ct ~(keystone_ admin)]# grep -vE ‘#|$’ /etc/neutron/dhcp_ agent.ini
在這裏插入圖片描述

  • 1、interface_driver:用來創建TAP設備的接口驅動,

    • 如果使用Linux Bridge連接,該值設爲neutron.agent.linux.interface.BridgelnterfaceDriver ;
    • 如果選擇Open Vswitch,該值爲neutron.agent.linux.interface.OVSInterfaceDriver
  • 2、 dhcp_driver:指定DHCP啓動,默認值爲neutron.agent.linux.dhcp.Dnsmasq 表示dnsmasq進程來實現DHCP服務
    在這裏插入圖片描述

1.4、DHCP代理工作機制

DHCP代理運行在網絡節點上,DHCP 爲項目網絡提供DHCP服務IP地址動態配,另外還會提供源數據請求服務。工作機制如下:
在這裏插入圖片描述
通過DHCP獲取IP地址過程如下。

(1)創建實例時,Neutron隨機生成MAC並從配置數據中分配一個固定的IP地址,一起保存到dnsmasq的hosts文件中,讓dnsmasq進程做好準備。

(2)與此同時,Nova-compute 會設置Mac地址。

(3)實例啓動,發出DHCPDISCOVER廣播,該廣播消息在整個網絡中都可以被收到。

(4)廣播消息到達dnsmasq監聽Tap接口。dnsmasq 收到後檢查hosts文件,發現有對應項,它以DHCPOFFER消息將IP和網關IP發回到虛擬機實例

(5)虛擬機實例發回DHCPREQUEST消息確認接收DHCPOFFER

(6)dnsmasq發回確認消息DHCPACK,整個過程結束。

二、Linux網絡名稱空間

在介紹DHCP服務時提到的linux網絡名稱空間 (Network Namespace簡稱netns ) 是linux提供的一種內核級別的網絡環境隔離方法,Namespace也可以翻譯稱爲命名空間或者叫名字空間。

當前linux支持 6種不同類型的名稱空間,網絡名稱空間是其中一種。

在二層網絡上,VLAN可以將一個物理交換機分割成幾個獨立的虛擬交換機。

類似地,在三層網絡上,Linux 網絡名稱空間可以將一個物理三層網絡分割成幾個獨立的虛擬三層網絡。作爲一種資源虛擬機隔離機制。

  • ip netns list 查看所有的網絡名稱空間

2.1、Linux 網絡名稱空間介紹

1、在Linux中,網絡空間可以被認爲是隔離的擁有單獨網絡棧 (網絡接口、路由、iptables等) 的環境,它經常用來隔離網絡資源 (設備和服務),只有擁有同樣網絡名稱空間的設備才能批次訪問。

2、它還能提供了在名稱空間內運行進程的功能,後臺進程可以運行不同名稱空間內的相同端口上,用戶還可以虛擬出一塊網卡。

3、可以創建一個完全給力的全新網絡環境,包括獨立的網絡接口、路由表、ARP表,IP地址表、iptables 或ebtables 等,與網絡有關的組件都是獨立的。

  • 名稱空間的一些命令使用:
    • ip netns add 添加新的網絡名稱空間
    • ip netns list #查看所有的網絡名稱空間。
    • ip netns exec netns 名稱 #進入指定的網絡名稱空間
    • ip netns exec net001 bash
    • //爲虛擬網路環境netns0的EthO接口增加IP地址
      ip netns exec netns0 ip address add 10.0.1.1/24 eth0

4、網絡名稱空間內部通信沒有問題,但是被隔離的網絡名稱空間之間要進行通信,就必須採用特定方法,即VETH對,VETH對是一種成對出現的網絡設備,他們像一根虛擬的網絡線,可用於連接兩個名稱空間,向VETH對一端輸入的數據將自動轉發到另外一端。

例如:創建兩個網絡名稱空間的netns1和netns2並使他們之間通信,可以執行以下步驟

  • 1、創建兩個網絡名稱空間
    ip netns add netns1
    ip netns add netns2

  • 2、創建一個 VETH對
    ip link add veth1 type veth peer name veth2
    創建的一對VETH虛擬接口類似管道 (pipe),發給veth1的數據包可以在veth2收到,發給veth2的數據包可以在veth1收到,相當於安裝兩個接口並用網線連接起來。

  • 3、將上述兩個VETH虛擬接口分別放置到兩個網絡名稱空間中
    ip link set veth1 netns netns1
    ip link set veth2 netns netns2

這樣兩個VETH虛擬接口就分別出現在兩個網絡名稱空間中,兩個空間的網絡就打通了,其中的設備可以相互訪問。

2、linux網絡名稱空間實現DHCP服務隔離

Neutron通過網絡名稱空間爲每個網絡提供獨立的DHCP和路由服務,從而允許項目創建重疊的網絡,如果沒有這種隔離機制,網絡就不能重疊,這樣就失去了很多靈活性

每個dnsmasq進程都位於獨立的網絡名稱空間,命名爲gdhcp-xxx

以創建flat網絡爲例,Neutron自動新建該網絡對應的網橋brqfxxx,以及DHCP的Tap設備tapxxx。物理主機本身也有一個網絡名稱空間,稱爲root,擁有一個迴環設備 (Loopback Device) 如果DHCP的Tap 虛擬接口放置到 gdhcp-xxx名稱空間,該Tap虛擬接口將無法直接與root名稱空間中網橋設備brgxxx連接。爲此,Neutron 使用 VETH對來解決這個問題,添加VETH對tapxxx與ns-xxx讓 gdhcp-xxx連接到 brqxxx。

3、Linux 網絡名稱空間實現路由器
Neutron允許在不同的網絡中的子網的 CIDR 和 IP地址重疊,具有相同的IP地址的2個虛擬機也不會產生衝突,這是由於Neutron的路由器通過Linux網絡名稱空間實現的,每個路由器有自己的獨立的路由表。

三、Neutron 路由器

  • Neutron路由器是一個三層的 (L3) 的,其模擬物理路由器,爲用戶提供路由、NAT等服務,在OpenStack網絡中,不同子網之間的通信需要路由器,項目網絡與外部網絡之間的通信更需要路由器。

  • Neutron提供虛擬路由器,也支持物理路由器。例如,兩個隔離的VLAN網絡之間需要實現通信,可以通過物理路由器實現,由物理路由器提供相應的IP路由表,確保兩個IP子網之間的通信,將兩個VLAN網絡中的虛擬機默認網關分別設置爲路由路由器的接口 A 和 B 的IP地址。VLAN中的虛擬機要與VLANB 中的虛擬機通信時,數據包將通過VLANA 中的物理網卡到達路由器,有物理路由器轉發到VLAN B 中的物理網卡,在到目的的虛擬機。

  • 路由器相當於默認網關
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-O4oyg7ha-1583913977259)(C:\Users\shengkai\AppData\Roaming\Typora\typora-user-images\1583372470699.png)]
    節點A和B是兩個服務器,通過接口連接路由器,進行通信。
    Neutron的虛擬路由器使用軟件模擬物理路由器,路由實現機制相同。Neutron 的路由服務由L3代理提供。

四、L3代理

  • 在Neutron中 L3代理 (neutron-l3-agent) 具有相當重要的地位。他不僅提供虛擬機路由器,而且通過iptables 提供地址轉換(SNAT、 DNAT)、浮動地址( Floating IP) 和 安全組(security group)功能,L3 代理利用LInux IP棧、路由和 iptables 來實現內部網絡中不同網絡的虛擬機實例之間的通信,以及虛擬機實例和外部網絡之間的網絡流量路由和轉發,L3代理可以部署在控制節點或者網絡節點上。
  • L3代理在生產環境中是分離出來的,放在網絡節點。

4.1、路由(Routing)

L3代理提供的虛擬機路由器通過虛擬接口連接到子網,一個子網一個接口,該接口的地址是該子網的網關地址,虛擬機的IP地址棧如果發現數據包的目的IP地址不在本網段,則會將其發到路由器上對應其子網的虛擬機接口,然後,虛擬機路由器根據配置的路由規則和目的IP地址將包轉發到目的端口發出。

L3代理會將每個路由器創建一個網絡名稱空間,通過VETH對於TAP相連,然後將網關IP配置在位於名稱空間的VETH接口上,這樣就能夠提供路由,網絡節點如果不支持linux名稱空間,則只能運行一個虛擬路由器。

4.2、通過網絡名稱空間支持網絡重疊

在雲環境下用戶可以按照自己的規劃創建網絡,不同的項目(租戶) 的網絡IP地址可能會重疊,爲實現此功能,L3 代理使用 linux 網絡名稱空間來提供隔離的轉發上下文,隔離不同的項目(租戶)的網絡,每個L3代理運行在一個名稱空間中.

每個名稱空間由: grouter- 命名

4.3、源地址轉換SNAT

L3代理通過在iptables表中增加POSTROUTING鏈來實現源地址轉換,既內網計算機訪問外網時,發起訪問的內網IP地址(源IP地址)轉換爲外網網關的IP地址。這種功能讓虛擬機實例能夠直接訪問外網。不過外網計算機還不能直接訪問虛擬機實例,因爲實例沒有外網IP地址,而目的地址轉化就能解決這一問題。

項目(租戶)網絡連接到Neutron路由器,通常將路由器作爲默認的網關,當路由器收到實例的數據包並將其轉發到外網時。路由器會將數據包的源地址修改成自己的外網地址,確保數據包轉發到外網,並能夠從外網返回,路由器修改返回的數據包,並轉發之間發起訪問的實例。

4.4、目的地址轉換DNAT與浮動IP地址。

Neutron 需要設置浮動IP地址支持從外網訪問項目(租戶)網絡中的實例。每個浮動IP唯一對應一個路由器; 浮動IP到關聯的端口,在到所在的子網,最後到包含改子網及外部子網路由器。創建浮動IP時。在Neutron分配IP地址後,通過RPC通知該浮動IP地址對應的路由器去設置該浮動IP對應的iptabels規則,從外網訪問虛擬機實例時,目的IP地址爲實例的浮動IP地址,因此必須由iptables將其轉化成固定的IP地址,然後在將其路由到實例。L3 代理通過在iptables表中增加POSTROUTING鏈來實現地址轉換。

浮動IP地址是提供靜態NAT功能,建立外網IP地址與實例所在的項目(租戶網絡) IP地址的一對一映射, 浮動IP地址配置在路由器提供網關的外網接口上,而不是在實例中,路由器會根據通信的方向修改數據包的源或者是目的地址,這是通過在路由器上應用iptables的NAT規則實現的。

一旦設置浮動IP地址後,源地址轉換就不在使用外網關的IP地址了,而是直接使用對應的浮動IP地址,雖然相關的NAT規則依然存在,但是neutron-l3-agent-float snat比neutron-l3-agent-snat更早執行。
在這裏插入圖片描述

4.5、安全組(Security Group)

安全組定義了那些進入的網絡流量能被轉發給虛擬機實例。安全組包含一些防火牆策略,稱爲安全組規則(Security Group rule) , 可以定義若干個安全組。每個安全組可以有若千調規則。可以給每個實例綁定若干個安全組。

安全組的原理是通過iptables.對是咧所在的計算機節點的網絡流量進行過濾。安全組規則作用在實例的端口上,具體是在連接實例的計算節點上的linux網橋上實施。

五、FWaas 服務

5.1、概述

FWaas(Firewall-as-a-Service) 是一種基於Neutron L3 Agent 的虛擬防火牆,是Neutron的一個高級服務。通過FWaas,OpenStack 可以將防火牆應用到項目(租戶)、路由器、路由器端口和虛擬機端口、在子網邊界上對三層和四層的流量進行過濾。

傳統的網絡中的防火牆一般在網關上,用來控制子網之間的訪問。FWaaS的原理也是一樣,在Neutron路由上應用防火牆規則,控制進出項目(租戶)網絡的數據。防火牆必須關聯某個策略(Policy)。策略是規則(rule) 的集合,防火牆會按順序因公策略中的每一條規則。規則是訪問控制的規則,由源於目的子網IP、源目的端口、協議、允許(Allow)和拒絕(Deny) 動作組成。

安全組是最早的網絡安全模塊,其應用對象是虛擬網卡,在計算機節點上通過iptables規則控制進出實例虛擬網卡的流量。FWaaS的應用對象是虛擬路由器,可以在安全組之前控制從外部傳入的流量,但是對於同一個子網內的流量不做限制。安全組保護的是實例,而FWaas保護的是子網,兩者互爲補充,通常部署FWaas和安全組來實現雙重防護。

5.2、兩個版本: FWaas V1與FWaas V2

FWaas V1是傳統方後牆方案,對路由器提供保護,將防火牆應用到路由器時,改路由器的所有內部端口受到保護,其中虛擬機2進出的數據流都會得到防火牆保護。

新的版本的FWaasV2提供了更具細粒度的安全服務,防火牆的概念防火牆組(firewall group)代替,一個防火牆 包括兩項策略:入口策略(ingress policy)和出口(egress policy),防火牆組不在用於路由器級(路由器全部端口)而是路由器端口,注意,FWaas V2的配置僅提供命令行工具,不支持dashboard圖形頁面。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章