精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

VXLAN原理介紹以及Linux和OvS的實現分析

Linux愛好者 ? 來源:ust4coding.com ? 2023-06-19 15:23 ? 次閱讀

云計算環境的一個典型屬性是多租戶共享物理資源。其中每個租戶可以構建自己專屬的虛擬邏輯網絡,而每個邏輯網絡都需要由唯一的標識符來標識。不同的邏輯網絡默認情況下相互隔離。傳統上,網絡工程師一般使用VLAN來隔離不同二層網絡,但VLAN的標識符命名空間只有12位,只能提供4096個標識符,這無法滿足大型云計算環境的需求。

另外,使用VLAN隔離虛擬邏輯網絡,往往需要對底層物理網絡設備進行手動配置,這無法滿足云計算環境的自動化需求。為了解決VLAN在網絡虛擬化環境中應用存在的種種問題,Cisco,VMware等廠商提出了新的網絡協議VXLAN來隔離虛擬邏輯網絡。

VxLAN基本原理

VXLAN的全稱為Virtual eXtensible LAN,從名稱看,它的目標就是擴展VLAN協議。802.1Q的VLAN TAG只占12位,只能提供4096個網絡標識符。而在VXLAN中,標識符擴展到24位,能提供16777216個邏輯網絡標識符,VXLAN的標識符稱為VNI(VXLAN Network Identifier)。另外,VLAN只能應用在一個二層網絡中,而VXLAN通過將原始二層以太網幀封裝在IP協議包中,在IP基礎網絡之上構建overlay的邏輯大二層網絡。

我們來看具體協議包結構。VXLAN將二層數據幀封裝在UDP數據包中,構建隧道在不同節點間通信。包結構如圖:

d5f88ad2-0e71-11ee-962d-dac502259ad0.png

從包結構上可以看到,VXLAN會額外消耗50字節的空間。為了防止因數據包大小超過網絡設備的MTU值而被丟棄,需要將VM的MTU減少50甚至更多,或者調整中間網絡設備的MTU。

VXLAN協議中將對原始數據包進行封裝和解封裝的設備稱為VTEP(VXLAN Tunnel End Point),它可以由硬件設備實現,也可以由軟件實現。

VXLAN的整體應用示意拓樸結構如圖:

d6128fae-0e71-11ee-962d-dac502259ad0.png

我們來看VXLAN的通信過程。在上圖的虛擬機VM1和VM2處于邏輯二層網絡中。VM1發出的二層以太網幀由VTEP封裝進IP數據包,之后發送到VM2所在主機。VM2所在主機接收到IP報文后,解封裝出原始的以太網幀再轉發給VM2。

然而,VM1所在主機的VTEP做完數據封裝后,如何知道要將封裝后的數據包發到哪個VTEP呢?實際上,VTEP通過查詢轉發表來確定目標VTEP地址,而轉發表通過泛洪和學習機制來構建。目標MAC地址在轉發表中不存在的流量稱為未知單播(Unknown unicast)。廣播(broadcast)、未知單播(unknown unicast)和組播(multicast)一般統稱為BUM流量。VXLAN規范要求BUM流量使用IP組播進行洪泛,將數據包發送到除源VTEP外的所有VTEP。目標VTEP發送回響應數據包時,源VTEP從中學習MAC地址、VNI和VTEP的映射關系,并添加到轉發表中。后續VTEP再次發送數據包給該MAC地址時,VTEP會從轉發表中直接確定目標VTEP,從而只發送單播數據到目標VTEP。

OpenvSwitch沒有實現IP組播,而是使用多個單播來實現洪泛。洪泛流量本身對性能有一定影響,可以通過由controller收集相應信息來填充轉發表而避免洪泛。

Linux環境中常用的VXLAN實現有兩種:

Linux內核實現

OpenvSwitch實現接下來分別以實例來說明。

Linux 的實現

首先看Linux內核實現實例。我們的測試環境有三臺主機,物理網卡IP分別為192.168.33.12/24, 192.168.33.13/24和192.168.33.14/24。我們在每臺機器上創建一個Linux Bridge, 三臺主機上的Linux Bridge默認接口的IP分別設置為10.1.1.2/24, 10.1.1.3/24和10.1.1.4/24。此時三臺主機的Linux網橋處于同一虛擬二層網絡,但由于沒有相互連接,所以無法互相訪問。我們通過建立VXLAN隧道使其可互相訪問實現虛擬二層網絡10.1.1.0/24。網絡結構如圖:

d6379934-0e71-11ee-962d-dac502259ad0.png

首先在主機1上創建Linux網橋:

brctladdbrbr0

給網橋接口設置IP并啟動:

ipaddradd10.1.1.2/24devbr0
iplinksetupbr0

我們從主機1訪問主機2上的虛擬二層網絡IP, 訪問失敗:

[root@localhostvagrant]#ping10.1.1.3
PING10.1.1.3(10.1.1.3):56databytes
^C
---10.1.1.3pingstatistics---
1packetstransmitted,0packetsreceived,100.0%packetloss

接下來,我們添加VTEP虛擬接口vxlan0, 并加入組播IP:239.1.1.1, 后續發送到該組播IP的數據包,該VTEP都可以接收到:

iplinkaddvxlan0typevxlanid1group239.1.1.1deveth1dstport4789

將虛擬接口vxlan0連接到網橋:

brctladdifbr0vxlan0

在另外兩臺主機上也完成相似配置后,我們開始測試。

首先在主機1查看VTEP的轉發表,可以看到此時只有一條組播條目,所有發出流量都將發送給該組播IP:

[root@localhostvagrant]#bridgefdbshowdevvxlan0
000000:00dst239.1.1.1viaeth1selfpermanent

我們再次從主機1上訪問主機2上的網橋IP, 此時訪問成功:

[root@localhostvagrant]#ping10.1.1.3
PING10.1.1.3(10.1.1.3)56(84)bytesofdata.
64bytesfrom10.1.1.3:icmp_seq=1ttl=64time=1.58ms
64bytesfrom10.1.1.3:icmp_seq=2ttl=64time=0.610ms
^C
---10.1.1.3pingstatistics---
2packetstransmitted,2received,0%packetloss,time1001ms
rttmin/avg/max/mdev=0.610/1.096/1.582/0.486ms

此時再次在主機1上查看VTEP轉發表,可以看到轉發表中已經學習到10.1.1.3所在主機的VTEP地址:192.168.33.13,下次再發送數據給10.1.13所對應的MAC該直接發送到192.168.33.13:

[root@localhostvagrant]#bridgefdbshowdevvxlan0
000000:00dst239.1.1.1viaeth1selfpermanent
2ea27b:31dst192.168.33.13self

我們根據主機2上tcpdump的抓包結果來分析具體過程:

1454.330846IP192.168.33.12.38538>239.1.1.1.4789:VXLAN,flags[I](0x08),vni1
ARP,Requestwho-has10.1.1.3tell10.1.1.2,length28

10.1.1.2所在主機不知道10.1.1.3對應的MAC地址,因而發送ARP廣播,ARP數據包發送至VTEP,VTEP進行封裝并洪泛給組播IP:239.1.1.1。

1454.330975IP192.168.33.13.58823>192.168.33.12.4789:VXLAN,flags[I](0x08),vni1
ARP,Reply10.1.1.3is-at2ea27b:31,length28

主機2收到數據包之后解封裝,VTEP會學習數據包的MAC及VTEP地址,將其添加到轉發表,并將解封后的數據幀發送到網橋接口10.1.1.3。10.1.1.3的接口發送ARP響應。

1454.332055IP192.168.33.12.48980>192.168.33.13.4789:VXLAN,flags[I](0x08),vni1
IP10.1.1.2>10.1.1.3:ICMPechorequest,id4478,seq1,length64

主機1之后開始發送ICMP數據包,從這里可以看出外層IP地址不再為組播IP,而是學習到的192.168.33.13。

1454.332225IP192.168.33.13.55921>192.168.33.12.4789:VXLAN,flags[I](0x08),vni1
IP10.1.1.3>10.1.1.2:ICMPechoreply,id4478,seq1,length64

接著,10.1.1.3發送回ICMP響應包。

OvS 的實現

下面再來說明OpenvSwitch實現實例。

OVS不支持組播,需要為任意兩個主機之間建立VXLAN單播隧道。與上邊示例的拓樸結構相比,我們使用了兩個OVS網橋,將虛擬邏輯網絡的接口接入網橋br-int,將所有VXLAN接口接入br-tun。兩個網橋使用PATCH類型接口進行連接。由于網橋br-tun上有多個VTEP,當BUM數據包從其中某個VTEP流入時,數據包會從其他VTEP接口再流出,這會導致數據包在主機之間無限循環。因而我們需要添加流表使VTEP流入的數據包不再轉發至其他VTEP。若邏輯網絡接口與VTEP連接同一網橋,配置流表將比較繁瑣。單獨將邏輯網絡接口放到獨立的網橋上,可以使流表配置非常簡單,只需要設置VTEP流入的數據包從PATCH接口流出。

拓樸結構如圖:

d640cbee-0e71-11ee-962d-dac502259ad0.png

首先在主機1上創建網橋br-int和br-tun:

ovs-vsctladd-brbr-int
ovs-vsctladd-brbr-tun

創建PATCH接口連接br-int和br-tun:

ovs-vsctladd-portbr-intpatch-int--setinterfacepatch-inttype=patchoptions:peer=patch-tun
ovs-vsctladd-portbr-tunpatch-tun--setinterfacepatch-tuntype=patchoptions:peer=patch-int

創建單播VTEP連接主機2:

ovs-vsctladd-portbr-tunvxlan0--setinterfacevxlan0type=vxlanoptions:remote_ip=192.168.33.13

創建單播VTEP連接主機3:

ovs-vsctladd-portbr-tunvxlan1--setinterfacevxlan1type=vxlanoptions:remote_ip=192.168.33.14

接下來,我們給br-tun添加流表來處理流量。

首先查看br-tun上各接口的PORT ID,從結果看到Patch Port為1,VTEP分別為5和6:

[root@localhostvagrant]#ovs-ofctlshowbr-tun
OFPT_FEATURES_REPLY(xid=0x2):dpid:00006e12f4fd6949
n_tables:254,n_buffers:256
capabilities:FLOW_STATSTABLE_STATSPORT_STATSQUEUE_STATSARP_MATCH_IP
actions:outputenqueueset_vlan_vidset_vlan_pcpstrip_vlanmod_dl_srcmod_dl_dstmod_nw_srcmod_nw_dstmod_nw_tosmod_tp_srcmod_tp_dst
1(patch-tun):addrfafbbf
config:0
state:0
speed:0Mbpsnow,0Mbpsmax
5(vxlan0):addr6585ea
config:0
state:0
speed:0Mbpsnow,0Mbpsmax
6(vxlan1):addr38fa98
config:0
state:0
speed:0Mbpsnow,0Mbpsmax
LOCAL(br-tun):addr12fd49
config:PORT_DOWN
state:LINK_DOWN
speed:0Mbpsnow,0Mbpsmax
OFPT_GET_CONFIG_REPLY(xid=0x4):frags=normalmiss_send_len=0

清空br-tun流表:

ovs-ofctldel-flowsbr-tun

數據包進入br-tun后開始匹配table 0的流。我們使用table 0區分流量來源。來源于br-int的數據包由table 1處理,VTEP流入的數據交由table 2處理, 并丟棄其他PORT進入的數據包:

ovs-ofctladd-flowbr-tun"table=0,priority=1,in_port=1actions=resubmit(,1)”
ovs-ofctladd-flowbr-tun"table=0,priority=1,in_port=5actions=resubmit(,2)"
ovs-ofctladd-flowbr-tun"table=0,priority=1,in_port=6actions=resubmit(,2)”
ovs-ofctladd-flowbr-tun"table=0,priority=0,actions=drop”

接著添加table 1的流, table 1用于處理來自br-int的流量,單播數據包交由table 20處理,多播或廣播數據包交由table 21處理:

ovs-ofctladd-flowbr-tun"table=1,priority=0,dl_dst=000000:00/010000:00,actions=resubmit(,20)”
ovs-ofctladd-flowbr-tun"table=1,priority=0,dl_dst=010000:00/010000:00,actions=resubmit(,21)”

table 21處理廣播流量,將數據包從所有VTEP的PORT口發出:

ovs-ofctladd-flowbr-tun"table=21,priority=0,actions=output:5,output:6”

table 2處理VTEP流入的數據包,在這里我們實現學習機制。來自VTEP的數據包到達后,table 2從中學習MAC地址,VNI、PORT信息,并將學習到的流寫入table 20中,并將流量由PATCH口發送到br-int上, 并將學習到的流優先級設為1:

ovs-ofctladd-flowbr-tun"table=2,priority=0,actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1”

table 20處理單播流量,我們將默認流優先級設置為0。因為學習到的流優先級設置為1,因而只有匹配不到目標MAC的未知單播交由table 21處理,table 21將流量廣播到所有VTEP:

ovs-ofctladd-flowbr-tun"table=20,priority=0,actions=resubmit(,21)"

整體處理邏輯如圖:

我們查看流表, 發現table 20中只有一條默認添加的流:

[root@localhostvagrant]#ovs-ofctldump-flowsbr-tuntable=20
NXST_FLOWreply(xid=0x4):
cookie=0x0,duration=1.832s,table=20,n_packets=0,n_bytes=0,idle_age=1,priority=0actions=resubmit(,21)

我們從主機1訪問主機3上的虛擬網絡IP,訪問成功:

[root@localhostvagrant]#ping10.1.1.4-c2
PING10.1.1.4(10.1.1.4)56(84)bytesofdata.
64bytesfrom10.1.1.4:icmp_seq=1ttl=64time=1.45ms
64bytesfrom10.1.1.4:icmp_seq=2ttl=64time=0.538ms

---10.1.1.4pingstatistics---
2packetstransmitted,2received,0%packetloss,time1002ms
rttmin/avg/max/mdev=0.538/0.994/1.451/0.457ms

我們再次查看流表, 發現table 20中已經多了一條學習到的流,下次再向該MAC發送數據包,數據將直接從PORT 6中發出:

[root@localhostvagrant]#ovs-ofctldump-flowsbr-tuntable=20
NXST_FLOWreply(xid=0x4):
cookie=0x0,duration=164.902s,table=20,n_packets=36,n_bytes=3360,hard_timeout=300,idle_age=19,hard_age=19,priority=1,dl_dst=ee090e:46actions=load:0->NXM_NX_TUN_ID[],output:6
cookie=0x0,duration=223.811s,table=20,n_packets=1,n_bytes=98,idle_age=164,priority=0actions=resubmit(,21)

本文簡要介紹了VXLAN的原理和實例,具體細節可以閱讀VXLAN的RFC。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 云計算
    +關注

    關注

    39

    文章

    7744

    瀏覽量

    137211
  • Linux
    +關注

    關注

    87

    文章

    11232

    瀏覽量

    208949
  • VLAN
    +關注

    關注

    1

    文章

    273

    瀏覽量

    35582
  • 數據包
    +關注

    關注

    0

    文章

    253

    瀏覽量

    24367

原文標題:VXLAN原理介紹以及Linux和OvS的實現分析

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux環境中常用的VXLAN實現實例

    VXLAN的全稱為Virtual eXtensible LAN,從名稱看,它的目標就是擴展VLAN協議。802.1Q的VLAN TAG只占12位,只能提供4096個網絡標識符。
    發表于 06-30 09:52 ?611次閱讀
    <b class='flag-5'>Linux</b>環境中常用的<b class='flag-5'>VXLAN</b><b class='flag-5'>實現</b>實例

    詳解Linux內核搶占實現機制

    本文詳解了Linux內核搶占實現機制。首先介紹了內核搶占和用戶搶占的概念和區別,接著分析了不可搶占內核的特點及實時系統中實現內核搶占的必要性
    發表于 08-06 06:16

    ovs-dpdk sgmii口不能正常轉發是為什么

    測試了2個rgmii,2個xfi也正常,按照手冊配置的ovs-dpdk,默認流程。1046-c2 ovs-dpdk sgmii口不能正常轉發是為什么?如何去解決呢?
    發表于 01-05 06:41

    如何使用DPDK設置OvS從而在Arm平臺上運行PHY-PHY流量測試

    測試的設置已全部完成,現在要做的就是配置流量發射器給DUT發送流量。結束語本文提供了有關如何為PHY-PHY測試使用DPDK設置OvS的分步教程。本文介紹的設置方法主要來自OvS官方文檔,但著重
    發表于 04-12 11:38

    Linux MTD 源代碼分析

    Linux MTD 源代碼分析 Linux MTD介紹:設備層和原始設備層的函數調用關系(紅色部分需要我們實現):NOR型Flash芯片驅
    發表于 02-08 16:43 ?9次下載

    OVS視頻服務器系統的組成

    OVS視頻服務器系統的組成 1 、Oracle Video Server簡介   OVS(Oracle Video Server)是能適合較大規模視頻點播系
    發表于 02-01 12:36 ?997次閱讀

    一文分析VLAN和VxLAN網絡虛擬技術

    本文將對VLAN(VirtualLocalAreaNetwork,虛擬局域網)和VxLAN(VirtualeXtentialLAN,虛擬可拓展局域網)進行探究。值得一提的是,雖然VLAN和VxLAN這兩個名字非常接近,不過其解決的問題范疇是不同。
    的頭像 發表于 03-21 10:42 ?3615次閱讀
    一文<b class='flag-5'>分析</b>VLAN和<b class='flag-5'>VxLAN</b>網絡虛擬技術

    IP百科知識之VXLAN

    支持多達16M的VXLAN段的網絡隔離,可滿足海量租戶。 提升設備性能 除網絡邊緣設備,其他設備無需識別虛擬機的MAC地址,減輕了設備的MAC地址學習壓力,提升了設備性能。 物理和虛擬網絡解耦采用MACin UDP封裝來延伸二層網絡,實現物理網絡和虛擬網絡解耦,租戶可以無
    的頭像 發表于 09-13 09:29 ?2959次閱讀

    VXLAN是什么,VXLAN 解決了??什么問題

    VXLAN 是一種封裝協議,它使用隧道技術在底層第 3 層網絡上擴展第 2 層連接,從而提供數據中心連接。在數據中心,VXLAN 是最常用的協議,用于創建位于物理網絡之上的覆蓋網絡,從而可以使用虛擬
    發表于 03-05 10:47 ?1555次閱讀

    k8s-ovs一款基于ovs的k8s網絡插件

    ./oschina_soft/k8s-ovs.zip
    發表于 05-13 11:28 ?0次下載
    k8s-<b class='flag-5'>ovs</b>一款基于<b class='flag-5'>ovs</b>的k8s網絡插件

    VXLAN和GENEVE:隧道協議之爭

    隨著IT環境的不斷變化以及新技術的快速發展,新的客戶需求下,新的隧道協議也隨之被引入進來。從GRE到VXLAN、GENEVE,網絡虛擬化技術得到了迅猛發展,VXLAN 已成為目前網絡虛擬化Overlay的事實標準,那么,它與Ge
    的頭像 發表于 12-02 15:24 ?3536次閱讀

    什么是VXLAN?為什么需要VXLAN?

    什么是VXLAN?為什么需要VXLANVXLAN(Virtual Extensible LAN)是一種網絡虛擬化技術,用于擴展虛擬局域網(VLAN)的規模。它是一種將虛擬機和虛擬網絡擴展到物理
    的頭像 發表于 12-07 09:23 ?941次閱讀

    VXLAN如何滿足虛擬機動態遷移時對網絡的要求?VXLAN和VLAN有何不同?

    (VM)動態遷移時對網絡的要求。下面將詳細介紹VXLAN與VLAN之間的區別,并解釋VXLAN如何滿足虛擬機動態遷移時對網絡的要求。 一、VLAN和VXLAN的區別 1. 標識符數量:
    的頭像 發表于 12-07 09:23 ?765次閱讀

    什么是VXLAN中的VTEP和VNI?VXLAN隧道是如何建立的?

    什么是VXLAN中的VTEP和VNI?VXLAN隧道是如何建立的? VXLAN(Virtual Extensible LAN)是一種虛擬化擴展局域網的技術,用于在數據中心網絡中實現跨子
    的頭像 發表于 12-07 09:32 ?2294次閱讀

    VXLAN網關有哪些種類?VXLAN網絡中報文是如何轉發的?

    和軟件VXLAN網關。 1. 物理交換機VXLAN網關: 物理交換機VXLAN網關是利用物理交換機的硬件實現VXLAN報文的轉發。它具有
    的頭像 發表于 12-07 09:32 ?686次閱讀