簡單談談OpenStack中的網路隔離

2022-09-25 12:21:11 字數 2012 閱讀 8936

前言

最近,關於xx公有雲的使用者網路,由於隔離問題引發安全討論,大家頓時對啥「經典網路」、「vpc」等概念興趣大增,大家的熱議中多次提到aws的vpc,亞馬遜的aws怎麼搞的,我們不得而知,但是我們可以聊聊openstack的,畢竟它一直在模仿aws嘛;

「隔離」啥

首先,我們先搞清楚,所謂「隔離」,到底是在「隔」什麼;

我們知道,計算機網路,是分層實現的,不同協議工作在不同層,這些層的設計、制定都有國際標準,按著osi的分層模型,共有七個層,大家在討論的隔離,通常指的是第2層,也叫「資料鏈路層」;

資料鏈路層的網路包,也叫「幀」,我們常說的網絡卡的mac位址,就是幀的位址,mac,其實是「**訪問控制」(media access control)的簡稱,這是程式設計客棧資料鏈路層的乙個子層;

那為什麼要在這個二層上搞隔離呢?

因為二層的幀,其中一些幀的位址是廣播位址,在同乙個二層的裝置都可以、也必須接收這些幀,交換機一般認為工作在二層,對這些廣播包,也都要**,所以二層通常被稱為乙個「廣播域」,這就好比大家在乙個教室裡,都能互相看到,除非分隔到不同的教室;

openstack的玩法

openstack的neutron負責為虛擬機器提供網路,而且openstack是假設多租戶的,那多租戶之間的隔離問題,它當然要提供支援,下面我們就看一下neutron是怎麼實現的;

平坦網路

neutron中建立的網路是有「type」的,其中最基礎的一種type就是「flat」,顧名思義,「平坦」就是指都在乙個空間下,也就是沒有做二層上的隔離,虛擬機器都在同乙個二層,同乙個廣播域;

從網上找了個示意圖:

這種」平坦「的大二層網路,雖然實現、管理相對簡單,但也會有諸多問題,除了安全方面,還有廣播風暴等問題;

單個大二層網路,就好比整個學校程式設計客棧的人都在乙個大禮堂,大家都能看到,而且萬一誰得了傳染病,大家都被傳染,要想隔離,可以把人分散到各個教室;

vlan隔離網路

neutron中建立」vlan「這種型別的網路,就是主要使用的二層隔離方案,vlan(虛擬區域網)本身就是交換機廣泛使用的二層隔離技術;

示意圖大概這樣:

這就好比把整個學校的人,從大禮堂,分隔到了不同的教室,同乙個教室的人互相可見,不同教室的人不可見;

但這種方案也有一定的侷限性,首先管理相對麻煩,需要配合設定物理交換機,另外vlan的可用數量有限制,vlan的id號僅有四千多個,我們假設每個租戶分配1個vlan,那最多也就能支援四千多個租戶;

overlay網路

overlay(覆蓋)網路,所謂」覆蓋「,大體上指」在一層上面覆蓋另一層,也可以說是用一層載著另一層移動「,vxlan是最常見的協議,它是把虛擬機器的二層的幀,在宿主機上用udp包裹起來,然後以宿主機的ip,必要的話,經過3層的路由,到達目的宿主機,然後再解封,把內包裹的二層幀,輸送給目的虛擬機器;

有點抽象?我們先看看vxlan的包結構,就知道」包裹「是啥意思了:

那個」inner frame「就是被包裹的虛擬機器的二層的包;

最終封裝完的包www.cppcns.com,外層的源ip、目的ip位址,都是宿主機的,所以只要宿主機之間互通(3層可達),被封裝的內層幀就可以被運輸:

那這種方案有什麼優點呢?

主要的:

vxlan的範圍足夠大,一千六百多萬,租戶隨便用 因為是完全隔離的,租戶可以隨意定義自己的網路,哪怕和其他租戶的ip段重疊都沒有關係,比如上圖中,租戶a的網路,與租戶b的網路 如果通過一定技術實現支援3層路由器,租戶可以將自己的網路,隨意組織自己的網路拓撲,比如上圖中,租戶a的兩個網路,連線到乙個路由器(可以是虛擬的)上

關於上面提的第三點,在neutron中大概是這樣的:

vpc最後,那到底啥是vpc呢?

很明確的告訴你,上面這個圖就是vpc!

vpc(virtual private cloud),不是個技術專有名詞,而是亞馬遜aws創造的乙個產品層面的名詞;

租戶網路徹底隔離、ip段都能重疊、路由器、網路拓撲都能由自己定義,這還不是」虛擬私有雲「嗎!

本文標題: 簡單談談openstack中的網路隔離

本文位址: /jiqiao/fuwuqi/181417.html

簡單談談python中的多程序

程序是由系統自己管理的。1 最基本的寫法 from multiprocessing import pool def f x return x x if name main p pool 5 print p.map f,1,2,3 1,4,9 2 實際上是通過os.fork的方法產生程序的 unix中...

簡單談談 merge

var arr1 1,2,3 var arr2 1,2,3 console.log merge arr1,arr2 1,2,3,1,2,3 可見陣列間只是合併,不會發生相同元素覆蓋 var arr1 1,2,3 var obj2 console.log merge arr1,obj2 返回的是陣列,...

簡單談談php中ob flush和flush的區別

ob flush flush在手冊中的描述,都是重新整理輸出緩衝區,並且還需要配套使用,所以會導致很多人迷惑 其實,他們倆的操作物件不同,有些情況下,flush根本不做什麼事情.ob 系列函式,是操作php本身的輸出緩衝區.所以,ob flush是重新整理php自身的程式設計客棧緩衝區.而flush...