VXLAN 简介、实现虚拟机跨物理机通信和网络隔离

2024-07-23  本文已影响0人  河码匠

VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,用于在现有的数据中心网络基础设施上创建大规模虚拟网络。VXLAN 通过在标准的以太网和 IP 网络上建立虚拟网络隧道,使不同物理网络上的虚拟机(VM)能够像在同一个二层网络中一样进行通信。

一、VXLAN 的一些关键特性和优点

  1. 扩展性:VXLAN 使用24位的 VNI(VXLAN Network Identifier),可以支持多达16,777,216个不同的虚拟网络,比传统的 VLAN(最多支持4096个网络)有更大的扩展性。

  2. 二层网络虚拟化:VXLAN 通过在三层网络上建立二层隧道,使得虚拟机可以跨越不同的物理网络进行通信,增强了网络的灵活性和可管理性。

  3. 多租户支持:VXLAN 使得不同的租户可以在同一个物理网络基础设施上建立彼此隔离的虚拟网络,提高了资源利用率和安全性。

  4. 基于IP的隧道技术:VXLAN 在 IP 网络上封装二层帧,通过 UDP 进行传输,这使得 VXLAN 可以利用现有的路由和交换基础设施,而不需要进行大规模的网络重构。

  5. 兼容性:VXLAN 兼容现有的网络设备和协议,可以与传统的网络基础设施无缝集成。

二、一些组件名词说明

1. VXLAN 头部(VXLAN Header)

VXLAN 头部是 VXLAN 封装报文的一部分,包含以下关键字段:

2. VTEP(VXLAN Tunnel End Point)

VXLAN 隧道端点(VTEP)是 VXLAN 的关键组件,负责 VXLAN 报文的封装和解封装。

3. VNI(VXLAN Network Identifier)

VXLAN 网络标识符(VNI)是一个24位的标识符,用于标识每个虚拟网络。VNI 允许 VXLAN 支持多达16777216个独立的虚拟网络。

4. 组播组(Multicast Group)

组播组用于处理 VXLAN 中的广播、未知单播和组播(BUM)流量。通过使用组播组地址,VXLAN 可以将 BUM 流量有效地分发给多个 VTEP。

5. VXLAN 隧道(VXLAN Tunnel)

VXLAN 隧道用于在三层网络上传输二层以太网帧,通过 UDP 封装和解封装实现。VXLAN 隧道两端是 VTEP。

三、VXLAN 的工作流程

以下是 VXLAN 的基本工作流程,包括上述组件的交互:

1. 本地流量进入 VTEP

2. VXLAN 封装

3. 通过物理网络传输

4. VXLAN 解封装

5. 转发到目标虚拟机

四、示例

两台物理机中虚拟机通过 VXLAN 实现跨物理机通信和网络隔离

1. 环境
物理机 系统 网卡 网桥名 vxlan 虚拟机 虚拟机 ip
物理机 A ubuntu 1804 eth0 br01 vxlan1070 vm-a 192.168.100.10
物理机 B ubuntu 1804 eth0 br01 vxlan1070 vm-b 192.168.100.20

以下操作在 A, B 物理机中操作

2. 创建网桥

关于 brctl 命令查看 Linux brctl 命令

# brctl addbr br01
# brctl stp br01 on
# brctl setfd br01 10
# brctl show
bridge name bridge id       STP enabled interfaces
br01        8000.000000000000   yes
# ip link set br01 up
# ifconfig br01
br01: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 3a:05:ca:29:4e:78  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
3. 创建 VXLAN

具体参数查看 Linux ip 命令

# ip link add vxlan1070 mtu 1500 numtxqueues 4 numrxqueues 4 type vxlan id 1070 group 239.0.4.46 ageing 600 dev eth0
# ip link set vxlan1070 up
# ifconfig vxlan1070 up
# ip -d link show vxlan1070
861: vxlan1070: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master net-huyawnso state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether e6:9b:76:2d:ad:ed brd ff:ff:ff:ff:ff:ff promiscuity 1
    vxlan id 1070 group 239.0.4.46 dev eth0 srcport 0 0 dstport 8472 ttl inherit ageing 600 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on port_id 0x8001 port_no 0x1 designated_port 32769 designated_cost 0 designated_bridge 8000.1a:7f:d6:9a:ad:d4 designated_root 8000.1a:7f:d6:9a:ad:d4 hold_timer    0.00 message_age_timer   18.40 forward_delay_timer    0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on neigh_suppress off group_fwd_mask 0x0 group_fwd_mask_str 0x0 vlan_tunnel off addrgenmode eui64 numtxqueues 4 numrxqueues 4 gso_max_size 65536 gso_max_segs 65535
4. 将 vxlan 加入网桥
# brctl addif br01 vxlan1070
# brctl show
bridge name bridge id       STP enabled interfaces
br01        8000.5e9735b4aa96   yes     vxlan1070
5. 配置路由

上面 vxlan 设置 group(组播地址)。添加组播路由

# ip route add 239.0.4.46/32 dev eth0
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
239.0.4.46      0.0.0.0         255.255.255.255 UH    0      0        0 eth0
6. 将虚拟机网卡加入网桥

在虚拟机的 config.xml 中配置了虚拟机网卡加入网桥。虚拟机创建后会自动加入。手动加入 brctl addif br01 vnet15

# virsh domiflist i-uwstgzco
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet15     bridge     br01 virtio      fa:52:00:08:e7:51
# brctl show
br01        8000.d2a03dbdbf3d   yes     vnet15
                                         vxlan1070
7. 虚拟机之间互 ping
root@vm-a:~# ping 192.168.100.20
PING 192.168.100.20 (192.168.100.20) 56(84) bytes of data.
64 bytes from 192.168.100.20: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.100.20: icmp_seq=2 ttl=64 time=0.035 ms
root@vm-b:~# ping 192.168.100.10
PING 192.168.100.10 (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.100.10: icmp_seq=2 ttl=64 time=0.035 ms
上一篇下一篇

猜你喜欢

热点阅读