1. 程式人生 > 實用技巧 >容器網路(四)vxlan

容器網路(四)vxlan

一、 什麼是vxlan
VXLAN,即 Virtual Extensible LAN(虛擬可擴充套件區域網),是 Linux 核心本身就支援的一種網路虛似化技術。

特點:

  • 完全在核心態實現上述封裝和解封裝的工作。
  • 本質上是一種隧道技術,在源網路裝置與目的網路裝置之間的IP網路上,建立一條邏輯隧道,將使用者側報文經過特定的封裝後通過這條隧道轉發。
  • 將L2的以太幀封裝到UDP報文(即L2 over L4)中,並在L3網路中傳輸。
  • 從使用者的角度來看,接入網路的伺服器就像是連線到了一個虛擬的二層交換機的不同埠上。

二、 常見術語
1、 VTEP(VXLAN Tunnel Endpoints,VXLAN 隧道端點)
  VXLAN 網路的邊緣裝置,用來進行 VXLAN 報文的處理(封包和解包)。

  VTEP 可以是網路裝置(比如交換機),也可以是一臺機器(比如虛擬化叢集中的宿主機)。
2、 VNI(VXLAN Network Identifier,VXLAN 網路識別符號)
  VNI 是每個 VXLAN 段的標識,是個 24 位整數。
3、 Tunnel(VXLAN 隧道)
  隧道是一個邏輯上的概念,在 VXLAN 模型中並沒有具體的物理實體向對應。

  隧道可以看做是一種虛擬通道,VXLAN 通訊雙方認為自己是在直接通訊,並不知道底層網路的存在。

  從整體來說,每個 VXLAN 網路像是為通訊的虛擬機器搭建了一個單獨的通訊通道,也就是隧道。

三、在linux上實現vxlan

vxlan網路拓撲圖如下,實現不同宿主機間的容器互訪:

1、建立網橋、vxlan裝置、容器

1)宿主機10.30.20.93

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.20.93 dev eth0 nolearning
# ip addr add 10.20.10.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* - 
# ip link add br10 type bridge
# ip link set
br10 up # ip addr add 10.20.10.1/32 dev br10 # ip netns add ns0 # ip link add veth0 type veth peer name eth0 netns ns0 # ip link set veth0 master br10 # ip link set veth0 up # ip -n ns0 link set lo up # ip -n ns0 addr add 10.20.10.2/24 dev eth0 # ip -n ns0 link set eth0 up # route add -net 10.20.10.0/24 dev br10 # ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.10.1

2)宿主機10.30.20.80

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.20.80 dev eth0 nolearning
# ip addr add 10.20.11.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* 
# ip link add br11 type bridge
# ip link set br11 up
# ip addr add 10.20.11.1/32 dev br11
# ip netns add ns0
# ip link add veth0 type veth peer name eth0 netns ns0
# ip link set veth0 master br11
# ip link set veth0 up
# ip -n ns0 link set lo up
# ip -n ns0 addr add 10.20.11.2/24 dev eth0
# ip -n ns0 link set eth0 up
# route add -net 10.20.11.0/24 dev br11
# ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.11.1
# ip netns exec ns0 ping -c 3 10.20.11.1

3)宿主機10.30.8.73

# ip link add vxlan.1 type vxlan id 1 dstport 8472 local 10.30.8.73 dev eth0 nolearning
# ip addr add 10.20.12.0/32 dev vxlan.1
# ip link set vxlan.1 up
# ip -d link show vxlan.1
# netstat -tlunp|grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* 
# ip link add br12 type bridge
# ip link set br12 up
# ip addr add 10.20.12.1/32 dev br12
# ip netns add ns0
# ip link add veth0 type veth peer name eth0 netns ns0
# ip link set veth0 master br12
# ip link set veth0 up
# ip -n ns0 link set lo up
# ip -n ns0 addr add 10.20.12.2/24 dev eth0
# ip -n ns0 link set eth0 up
# route add -net 10.20.12.0/24 dev br12
# ip netns exec ns0 route add -net 0.0.0.0/0 gw 10.20.12.1
# ip netns exec ns0 ping -c 3 10.20.12.1

2、新增fdb表記錄、arp表記錄、路由資訊

1)宿主機10.30.20.93

# bridge fdb append ca:62:2b:04:a7:76 dev vxlan.1 dst 10.30.20.80 via eth0
# bridge fdb append 5a:32:eb:56:e4:7c dev vxlan.1 dst 10.30.8.73 via eth0
# ip neigh add 10.20.11.0 lladdr ca:62:2b:04:a7:76 dev vxlan.1 nud perm
# ip neigh add 10.20.12.0 lladdr 5a:32:eb:56:e4:7c dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.11.0/24 dev vxlan.1
# route add -net 10.20.11.0/24 gw 10.20.11.0 dev vxlan.1
# route add -net 10.20.12.0/24 dev vxlan.1
# route add -net 10.20.12.0/24 gw 10.20.12.0 dev vxlan.1

2)宿主機10.30.20.80

# bridge fdb append 42:cb:f8:c1:d2:8e dev vxlan.1 dst 10.30.20.93 via eth0
# bridge fdb append 5a:32:eb:56:e4:7c dev vxlan.1 dst 10.30.8.73 via eth0
# ip neigh add 10.20.10.0 lladdr 42:cb:f8:c1:d2:8e dev vxlan.1 nud perm
# ip neigh add 10.20.12.0 lladdr 5a:32:eb:56:e4:7c dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.10.0/24 dev vxlan.1
# route add -net 10.20.10.0/24 gw 10.20.10.0 dev vxlan.1
# route add -net 10.20.12.0/24 dev vxlan.1
# route add -net 10.20.12.0/24 gw 10.20.12.0 dev vxlan.1

3)宿主機10.30.8.73

# bridge fdb append 42:cb:f8:c1:d2:8e dev vxlan.1 dst 10.30.20.93 via eth0
# bridge fdb append ca:62:2b:04:a7:76 dev vxlan.1 dst 10.30.20.80 via eth0
# ip neigh add 10.20.10.0 lladdr 42:cb:f8:c1:d2:8e dev vxlan.1 nud perm
# ip neigh add 10.20.11.0 lladdr ca:62:2b:04:a7:76 dev vxlan.1 nud perm
# sysctl net.ipv4.ip_forward=1
# route add -net 10.20.10.0/24 dev vxlan.1
# route add -net 10.20.10.0/24 gw 10.20.10.0 dev vxlan.1
# route add -net 10.20.11.0/24 dev vxlan.1
# route add -net 10.20.11.0/24 gw 10.20.11.0 dev vxlan.1

四、抓包分析

容器10.20.10.2訪問容器10.20.11.2。
資料包轉發過程:
容器(10.20.10.2)->br10(10.20.10.1)->匹配路由->vxlan.1(10.20.10.0)->eth0(10.30.20.93)->eth0(10.30.20.80:8472)->vxlan.1(10.20.11.0)->匹配路由->br11(10.20.11.1)->容器(10.20.11.2)

1、 容器(10.20.10.2)->br10(10.20.10.1)
資料包從容器發出,先達到閘道器10.20.10.1

2、br10(10.20.10.1)->匹配路由
資料包達到宿主機後,進行路由匹配

凡是發往 10.20.11.0/24 網段的 IP 包,都需要經過vxlan.1裝置發出,並且,它最後被髮往的閘道器地址是:10.20.10.0

檢視arp表,10.20.11.0的mac地址為ca:62:2b:04:a7:76

3、 vxlan.1(10.20.10.0)->eth0(10.30.20.93:8472)

檢視網橋的轉發表,mac地址為ca:62:2b:04:a7:76的,下一跳是10.30.20.80,從eth0裝置發出

將原始資料包新增VNI頭部、使用udp協議,傳送到10.30.20.80:8472

4、 vxlan.1(10.20.11.0)->匹配路由->br11(10.20.11.1)->容器(10.20.11.2)

vxlan.1裝置對資料包解封后,檢視路由表,轉發到br11,最後到達目的容器