1. 程式人生 > >網絡虛擬化 SDN

網絡虛擬化 SDN

app tenant 軟件 png wall stack 安全性 con convert

一.Linux Bridge :Linux中的網橋

假設宿主機有 1 塊與外網連接的物理網卡 eth0,上面跑了 1 個虛機 VM1,現在有個問題是: 如何讓 VM1 能夠訪問外網?

至少有兩種方案

  1. 將物理網卡eth0直接分配給VM1,但隨之帶來的問題很多: 宿主機就沒有網卡,無法訪問了; 新的虛機,比如 VM2 也沒有網卡。 下面看推薦的方案

  2. 給 VM1 分配一個虛擬網卡 vnet0,通過 Linux Bridge br0 將 eth0 和 vnet0 連接起來,如下圖所示

    技術分享

Linux Bridge 是 Linux 上用來做 TCP/IP 二層協議交換的設備,其功能大家可以簡單的理解為是一個二層交換機。多個網絡設備可以連接到同一個 Linux Bridge,當某個設備收到數據包時,Linux Bridge 會將數據轉發給其他設備。

在上面這個例子中,當有數據到達 eth0 時,br0 會將數據轉發給 vnet0,這樣 VM1 就能接收到來自外網的數據; 反過來,VM1 發送數據給 vnet0,br0 也會將數據轉發到 eth0,從而實現了 VM1 與外網的通信。

現在我們增加一個虛機 VM2,如下圖所示

技術分享

VM2 的虛擬網卡 vnet1 也連接到了 br0 上。 現在 VM1 和 VM2 之間可以通信,同時 VM1 和 VM2 也都可以與外網通信。

網橋實際上相當於一個物理路由器(交換機)。

brctl show 查看網橋信息,br100就是我們在這裏搭建的網橋,後面掛接的虛擬機網卡和物理機網卡

技術分享

virbr0 是 KVM 默認創建的一個 Bridge,其作用是為連接其上的虛機網卡提供 NAT 訪問外網的功能。virbr0 默認分配了一個IP 192.168.122.1,並為連接其上的其他虛擬網卡提供 DHCP 服務。(NAT)

需要說明的是,使用 NAT 的虛機 VM1 可以訪問外網,但外網無法直接訪問 VM1。 因為 VM1 發出的網絡包源地址並不是 192.168.122.6,而是被 NAT 替換為宿主機的 IP 地址了。

每張網卡都有唯一的MAC地址。

二.VLAN

首先搞清楚這幾個概念:

LAN:Local Area Network 局域網

技術分享

我們一般在公司組網,都是組建的LAN網絡,用戶在局域網裏通信、傳輸文件。

其獲取到的是內部IP,LAN 信息交換使用的是交換機。我們可以不連接 WAN 口,把路由器當做普通交換機來使用。

一個 LAN 表示一個廣播域:LAN 中的所有成員都會收到任意一個成員發出的廣播包。

WAN:Wide Area Network 廣域網

WLAN:Wireless LAN 無線局域網。WLAN 利用電磁波在空氣中發送和接受數據,而無需線纜介質。

WAN口是對外的接口,和運營商、上級網絡打交道。

LAN和WLAN是對內的接口,內部的電腦、手機、PAD,都是接入到LAN或者WLAN。

一般的無線路由器,包含了完整的LAN、WAN、WLAN功能對LAN、WAN、WLAN,要放在一起理解,理解其在網絡通信中扮演的角色。

技術分享

那什麽是VLAN呢?

VLAN 表示 Virtual LAN。一個帶有 VLAN 功能的物理交換機能夠將自己的端口劃分出多個 LAN。計算機發出的廣播包可以被同一個 LAN 中其他計算機收到,但位於其他 LAN 的計算機則無法收到。簡單地說,VLAN 將一個交換機分成了多個交換機,限制了廣播的範圍,在二層將計算機隔離到不同的 VLAN 中。現在的交換機幾乎都是支持 VLAN 的。通常交換機的端口有兩種配置模式: Access 和 Trunk。

看下圖,實際上是兩臺交換機,上面是一臺,下面是一臺。

技術分享

Access 口:這些端口被打上了 VLAN 的標簽,表明該端口屬於哪個 VLAN。 Access 口都是直接與計算機網卡相連的,這樣從該網卡出來的數據包流入 Access 口後就被打上了所在 VLAN 的標簽。

Trunk 口:有兩個交換機 A 和 B。 如何讓 AB 上相同 VLAN 之間能夠通信呢?辦法是將 A 和 B 連起來。這樣的端口就是Trunk口了。 VLAN1、2、3 的數據包在通過 Trunk 口到達對方交換機的過程中始終帶著自己的 VLAN 標簽。

物理交換機有VLAN的功能,那麽Linux Bridge中又是如何實現VLAN的呢?

技術分享

該圖實際上就是在物理服務器中實現了一個虛擬交換機,該交換機具有VLAN的功能 。凡是連接在brvlan10(網橋)上的虛擬機,共同組建成一個局域網,id為10;凡是連接在brvlan20上的虛擬機,共同組建成一個局域網,id為20。eth0相當於是Trunk口,與外界交換信息。這樣,

VM1發出的數據包,會打上tag為10的標簽,並且只會在id為10的局域網中產生廣播風暴,而不會轉發到id為20的局域網中,它們之間是相互隔離開來的。如果現在有多臺物理服務器,那麽它們之間就通過trunk口相連接,裏面的虛擬機,就可以在id相同的局域網中通信了。

Linux Bridge + VLAN = 虛擬交換機

三.Neutron

“軟件定義網絡(software-defined networking, SDN)”具有的靈活性和自動化優勢使其成為雲時代網絡管理的主流。Neutron 的設計目標是實現“網絡即服務(Networking as a Service)”。Neutron 為 OpenStack 的整個環境提供網絡支持,包括二層交換,三層路由,負載均衡,防火墻和 VPN 等,Neutron 提供了一個靈活的框架。Neutron有如下幾個重要功能:

1.二層交換(Switching):Nova 的 Instance 是通過虛擬交換機構建局域網的。Neutron 支持多種虛擬交換機,包括 Linux 原生的 Linux Bridge 和 OpenvSwitch。 OpenvSwitch(OVS)是一個開源的虛擬交換機,利用 Linux Bridge 和 OVS,Neutron 除了可以創建傳統的 VLAN 網絡,還可以創建基於隧道技術的 Overlay 網絡,比如 VxLAN 和 GRE。

2.三層路由(routing):Instance 可以配置不同網段的 IP,即不同網段的虛擬機實現互相通信。Neutron 的 router(虛擬路由器)實現 instance 跨網段通信。router 通過 IP forwarding,iptables 等技術來實現路由和 NAT。

3.負載均衡:Load-Balancing-as-a-Service(LBaaS),提供了將負載分發到多個 instance 的能力。LBaaS 支持多種負載均衡產品和方案,不同的實現以 Plugin 的形式集成到 Neutron,目前默認的 Plugin 是 HAProxy。

4.要保證物理服務器的安全性,可以配一臺防火墻。那麽如何保證虛擬機的安全呢?

Neutron 通過下面兩種方式來保障 instance 和網絡的安全性。

Security Group 安全組:通過 iptables 限制進出 instance 的網絡包。

Firewall-as-a-Service:FWaaS,限制進出虛擬路由器的網絡包,也是通過 iptables 實現。

Neutron 管理的網絡資源包括 Network,subnet 和 port

一個網絡可以包含多個子網,一個子網會存在多個端口。port 可以看做虛擬交換機上的一個端口。port 上定義了 MAC 地址和 IP 地址,當 instance 的虛擬網卡 VIF(Virtual Interface) 綁定到 port 時,port 會將 MAC 和 IP 分配給該虛擬網卡。

network 是一個隔離的二層廣播域。Neutron 支持多種類型的 network,包括 local, flat, VLAN, VxLAN 和 GRE。

flat:flat 網絡是無 vlan tagging 的網絡。flat 網絡中的 instance 能與位於同一網絡的 instance 通信,並且可以跨多個節點。

vlan:vlan 網絡是具有 802.1q tagging 的網絡。vlan 是一個二層的廣播域,同一 vlan 中的 instance 可以通信,不同 vlan 只能通過 router 通信。

subnet 是一個 IPv4 或者 IPv6 地址段。instance 的 IP 從 subnet 中分配。每個 subnet 需要定義 IP 地址的範圍和掩碼

Neutron的架構:

與 OpenStack 的其他服務的設計思路一樣,Neutron 也是采用分布式架構,由多個組件(子服務)共同對外提供網絡服務。

技術分享

Neutron 由如下組件構成:

Neutron Server:對外提供 OpenStack 網絡 API,接收請求,並調用 Plugin 處理請求。

Plugin:處理 Neutron Server 發來的請求, 並調用 Agent 去處理請求。plugin 解決的是 What 的問題,即網絡要配置成什麽樣子?而至於如何配置 How 的工作則交由 agent 完成。

Agent:真正的處理 Plugin 的請求,負責在 network provider 上真正實現各種網絡功能。

network provider:提供網絡服務的虛擬或物理網絡設備,例如 Linux Bridge,Open vSwitch

Queue:Neutron Server,Plugin 和 Agent 之間通過 Messaging Queue 通信和調用(解耦)

Database:存放 OpenStack 的網絡狀態信息,包括 Network, Subnet, Port, Router 等。

以創建一個 VLAN100 的 network 為例,假設 network provider 是 linux bridge, 流程如下:

  1. Neutron Server 接收到創建 network 的請求,通過 Message Queue(RabbitMQ)通知已註冊的 Linux Bridge Plugin。

  2. Plugin 將要創建的 network 的信息(例如名稱、VLAN ID等)保存到數據庫中,並通過 Message Queue 通知運行在各節點上的 Agent。

  3. Agent 收到消息後會在物理節點的網卡(比如 eth0)上創建 VLAN 設備(比如 eth2.100),並創建 bridge (比如 brqXXX) 橋接 VLAN 設備。

plugin,agent 和 network provider 是配套使用的,比如上例中 network provider 是 linux bridge,那麽就得使用 linux bridge 的 plugin 和 agent;如果 network provider 換成了 OVS ,plugin 和 agent 也得替換。

plugin 的一個主要的職責是在數據庫中維護 Neutron 網絡的狀態信息,這就造成一個問題:所有 network provider 的 plugin 都要編寫一套非常類似的數據庫訪問代碼。為了解決這個問題,Neutron 實現了一個 ML2(Modular Layer 2)plugin,對 plugin 的功能進行抽象和封裝。有了 ML2 plugin,各種 network provider 無需開發自己的 plugin,只需要針對 ML2 開發相應的 driver 就可以了,工作量和難度都大大減少。

plugin 按照功能分為兩類: core plugin 和 service plugin。core plugin 維護 Neutron 的 netowrk, subnet 和 port 相關資源的信息,與 core plugin 對應的 agent 包括 linux bridge, OVS 等; service plugin 提供 routing, firewall, load balance 等服務。

Management 網絡:用於節點之間 message queue 內部通信以及訪問 database 服務,所有的節點都需要連接到 management 網絡。API 網絡:OpenStack 各組件通過該網絡向用戶暴露 API 服務。Keystone, Nova, Neutron, Glance, Cinder, Horizon 的 endpoints 均配置在 API 網絡上。

VM 網絡:VM 網絡也叫 tenant 網絡(租戶網絡),用於 instance 之間通信。VM 網絡可以選擇的類型包括 local, flat, vlan, vxlan 和 gre。VM 網絡由 Neutron 配置和管理。

External 網絡:External 網絡指的是 VM 網絡之外的網絡,該網絡不由 Neutron 管理。 Neutron 可以將 router attach 到 External 網絡,為 instance 提供訪問外部網絡的能力。

網絡拓撲

技術分享

網絡虛擬化 SDN