Vxlan 原理


openstack understand neutron 

https://www.gitbook.com/book/yeasy/openstack_understand_neutron/details

linux 上實現 vxlan 網絡 (英文版

自己總結一下:

分析 VTEP的情況, 即Vxlan跟VXLAN通信的情況(非SDN的情況下)。

 

VXLAN 在linux下可以使用 ovs支持,也可以使用linux-bridge支持。


張華的博客 http://blog.csdn.net/quqi99/article/details/9170109, 好像也是IBMer, 寫了很多網絡相關的博客。 

 

基本原理: L2 in L4的原理。

先做個實驗(組播方式):

host1:

創建vtep(vxlan的tunnel)及其bridge

NIC=ens3
sudo brctl addbr br1  # sudo ifconfig br1 192.169.0.6/24
sudo ip link set br1 up
sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC
# sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.28 dstport 4789 dev $NIC   # 單播 
sudo ip link set vxlan100 up
sudo brctl addif br1 vxlan100

 

模擬一個VM的nic

1 sudo ip link add type veth
2 sudo ifconfig veth0 192.167.0.6/24 up
3 sudo ifconfig veth0 mtu 1450
4 sudo ifconfig veth1 up
5 sudo ifconfig veth1 mtu 1450
6 sudo brctl addif br1 veth1

 

$ sudo ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether fa:16:3e:05:aa:28 brd ff:ff:ff:ff:ff:ff
3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff
4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether aa:e6:2e:9b:62:0c brd ff:ff:ff:ff:ff:ff
6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000
    link/ether 8e:a5:ec:e4:7f:0d brd ff:ff:ff:ff:ff:ff

 

$ ip add show ens3  |grep inet
    inet 10.0.0.32/24 brd 10.0.0.255 scope global ens3

 

$ route
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         localhost       0.0.0.0         UG    0      0        0 ens3
10.0.0.0        *               255.255.255.0   U     0      0        0 ens3
169.254.169.254 localhost       255.255.255.255 UGH   0      0        0 ens3
192.167.0.0     *               255.255.255.0   U     0      0        0 veth0
192.169.0.0     *               255.255.255.0   U     0      0        0 br1

 

sudo netstat -ulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 *:bootpc                *:*                                 923/dhclient
udp        0      0 *:8472                  *:*                                 -

 

host2:

創建vtep(vxlan的tunnel)及其bridge

NIC=ens3
sudo brctl addbr br1  # sudo ifconfig br1 192.169.0.7/24
sudo ip link set br1 up
sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC \
# sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.32 dstport 4789 dev $NIC
sudo ip link set vxlan100 up
sudo brctl addif br1 vxlan100

模擬一個VM的nic

1 sudo ip link add type veth
2 sudo ifconfig veth0 192.167.0.7/24 up
3 sudo ifconfig veth0 mtu 1450
4 sudo ifconfig veth1 up
5 sudo ifconfig veth1 mtu 1450
6 sudo brctl addif br1 veth1

 

$ sudo ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether fa:16:3e:72:0e:58 brd ff:ff:ff:ff:ff:ff
3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff
4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 2a:b4:c1:16:6e:47 brd ff:ff:ff:ff:ff:ff
6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000
    link/ether e2:21:11:b3:9d:73 brd ff:ff:ff:ff:ff:ff

 

$  ip add show ens3  |grep inet
    inet 10.0.0.28/24 brd 10.0.0.255 scope global ens3

 

網絡測試:

host2 $ ping 192.167.0.6

host1 $ sudo tcpdump -i veth0 -vvv

tcpdump: listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:33:55.276520 IP (tos 0x0, ttl 64, id 27270, offset 0, flags [DF], proto ICMP (1), length 84)
192.167.0.7 > 192.167.0.6: ICMP echo request, id 12626, seq 1, length 64
17:33:55.276633 IP (tos 0x0, ttl 64, id 56736, offset 0, flags [none], proto ICMP (1), length 84)
192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12626, seq 1, length 64

host1 $ sudo tcpdump -i vxlan100 -vvv
tcpdump: listening on vxlan100, link-type EN10MB (Ethernet), capture size 262144 bytes
17:48:32.437673 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.167.0.7 tell 192.167.0.6, length 28
17:48:32.439064 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.167.0. is-at 2a:b4:c1:16:6e:47 (oui Unknown), length 28

 

host1 $ sudo tcpdump -i ens3 -vvv -p udp -w eth0_vxlan.cap

 

$ sudo tcpdump host 10.0.0.28 -i ens3 -vv
15:35:30.857397 IP (tos 0x0, ttl 64, id 19875, offset 0, flags [none], proto UDP (17), length 134)
    localhost.55482 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100
IP (tos 0x0, ttl 64, id 14017, offset 0, flags [DF], proto ICMP (1), length 84)
    192.167.0.7 > 192.167.0.6: ICMP echo request, id 12933, seq 187, length 64
15:35:30.857589 IP (tos 0x0, ttl 64, id 23656, offset 0, flags [none], proto UDP (17), length 134)
    localhost.58224 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100
IP (tos 0x0, ttl 64, id 1851, offset 0, flags [none], proto ICMP (1), length 84)
    192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12933, seq 187, length 64

 刪除創建的接口

sudo ip link set veth1 down
sudo ip link delete veth1 type veth
sudo ip link set vxlan100 down
sudo ip link delete vxlan100
sudo ip link set br1 down
sudo ip link delete br1

 

原理

在不同host上的VM 通信, ARP通過所在的host的VTEP(用來封包解包記錄流表)封包(UDP)完之后, 進行IP組播, 整個網絡中,在同一IP組播內的VTEP收到廣播后,解包。

然后發給VM,VM 進行ARP響應。

流表格式 【(VNI,內層MAC1,外層vtep_ip),(VNI,內層MAC2,外層vtep_ip)】。

 

以后的通信,通過流表,根據 目地VM的MAC地址,源VETP找到對應目的VTEP的IP地址 行封包, 目的VTEP進行解包。

 

具體查看。

http://network.51cto.com/art/201312/425388.htm

 

 

VTEP負責原始以太報文的VXLAN封裝和解封裝,可以是虛擬交換機,也可以是物理交換機. 在openstack中, 通常是ovs提供該功能。

VXLAN GW除了具備VTEP的功能外,還負責VLAN報文與VXLAN報文之間的映射和轉發,主要以物理交換機為主。

VXLAN IP GW具有VXLAN GW的所有功能,此外,還負責處理不同VXLAN之間的報文通信,同時也是數據中心內部服務向往發布業務的出口,主要以高性能物理交換機為主。

 

 

 VxlanARP請求

(1) vxlan初始化

 

VM1和VM2連接到VXLAN網絡(VNI)100,兩個VXLAN主機加入IP多播組239.119.1.1

(2) ARP請求

 

1) VM1以廣播的形式發送ARP請求;

2) VTEP1封裝報文。打上VXLAN標識為100,外層IP頭DA為IP多播組(239.119.1.1),SA為IP_VTEP1.

3) VTEP1在多播組內進行多播;

4) VTEP2解析接收到多播報文。填寫流表(VNI, 內層mac地址,外層Ip地址),並在本地VXLAN標識為100的范圍內

廣播(是VXLAN的用武之地)。

5) VM2對接收到的ARP請求進行響應;

(3) ARP應答

 

1) VM2准備ARP響應報文后向VM1發送響應報文

2)VTEP2接收到VM2的響應報文后把它封裝在ip單播報文中(VXLAN標識依然為100),然 后向VM1發送單播

3)VTEP1接收到單播報文后,學習內層MAC到外層ip地址的映射,解封裝並根據被封裝內容的目的MAC地址轉發給VM1

4)VM1接收到ARP應答報文,ARP交互結束

四:數據傳輸

(1) ARP請求應答之后,VM1知道了VM2的Mac地址,並且要向VM2通信(注意,VM1是以TCP的方法向VM2發送數據的)。

VTEP1 收到VM1發送數據包,用MAC地址從流表中檢查VM1與VM2是否屬於用一個VNI。兩個VM不但位於同一個VNI中(不在同一個VNI中出網關),並且VTEP1已經知道了VM2的所有地址信息(MAC和VTEP2_IP)。VTEP1封裝新的數據包。然后交給上聯交換機。

(2) 上聯交換機收到服務器發來的UDP包,對比目的IP地址和自己的路由表,然后將數據報轉發給相應的端口。

(3) 目的VTEP收到數據包后檢查器VNI,如果UDP報中VNI與VM2的VNI一致,則將數據包解封裝后交給VM2進一步處理。至此一個數據包傳輸完成。整個Vxlan相關的行為(可能穿越多個網關)對虛擬機來說是透明的,虛擬機不會感受傳輸的過程。雖然VM1與VM2之間啟動了TCP來傳輸數據,但數據包一路上實際是以UDP的形式被轉發,兩端的VTEP並不會檢查數據是否正確或者順序是否完整,所有的這些工作都是在VM1和VM2在接收到解封裝的TCP包后完成的。也就是說如果說如果被UDP封裝的是TCP連接,那么UDP和TCP將做為兩個獨立的協議棧各自工作,相互之間沒有交互。

 

五:Vxlan網關

如果需要VXLAN網絡和非VXLAN網絡連接,必須使用VXLAN網關才能把VXLAN網絡和外部網絡進行橋接和完成VXLAN ID和VLAN ID之間的映射和路由,和VLAN一樣,VXLAN網絡之間的通信也需要三層設備的支持,即VXLAN路由的支持。同樣VXLAN網關可由硬件和軟件來實現。從封裝的結構上來看,VXLAN提供了將二層網絡overlay在三層網絡上的能力,VXLAN Header中的VNI有24個bit,數量遠遠大於4096,並且UDP的封裝可以穿越三層網絡,比VLAN有更好的擴展性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM