VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,用于在现有的数据中心网络基础设施上创建大规模虚拟网络。VXLAN 通过在标准的以太网和 IP 网络上建立虚拟网络隧道,使不同物理网络上的虚拟机(VM)能够像在同一个二层网络中一样进行通信。
一、VXLAN 的一些关键特性和优点
-
扩展性:VXLAN 使用24位的 VNI(VXLAN Network Identifier),可以支持多达16,777,216个不同的虚拟网络,比传统的 VLAN(最多支持4096个网络)有更大的扩展性。
-
二层网络虚拟化:VXLAN 通过在三层网络上建立二层隧道,使得虚拟机可以跨越不同的物理网络进行通信,增强了网络的灵活性和可管理性。
-
多租户支持:VXLAN 使得不同的租户可以在同一个物理网络基础设施上建立彼此隔离的虚拟网络,提高了资源利用率和安全性。
-
基于IP的隧道技术:VXLAN 在 IP 网络上封装二层帧,通过 UDP 进行传输,这使得 VXLAN 可以利用现有的路由和交换基础设施,而不需要进行大规模的网络重构。
-
兼容性:VXLAN 兼容现有的网络设备和协议,可以与传统的网络基础设施无缝集成。
二、一些组件名词说明
1. VXLAN 头部(VXLAN Header)
VXLAN 头部是 VXLAN 封装报文的一部分,包含以下关键字段:
-
VNI(VXLAN Network Identifier):一个24位的标识符,用于标识虚拟网络。VNI 可以支持多达16777216个独立的虚拟网络。
-
Reserved Bits:一些保留位,用于未来扩展或特定用途。
-
Flags:包含不同的标志位,用于指示特定功能或状态。
2. VTEP(VXLAN Tunnel End Point)
VXLAN 隧道端点(VTEP)是 VXLAN 的关键组件,负责 VXLAN 报文的封装和解封装。
-
本地 VTEP(Local VTEP):封装进入 VXLAN 隧道的本地流量。
-
远端 VTEP(Remote VTEP):解封装来自 VXLAN 隧道的远程流量。
3. VNI(VXLAN Network Identifier)
VXLAN 网络标识符(VNI)是一个24位的标识符,用于标识每个虚拟网络。VNI 允许 VXLAN 支持多达16777216个独立的虚拟网络。
4. 组播组(Multicast Group)
组播组用于处理 VXLAN 中的广播、未知单播和组播(BUM)流量。通过使用组播组地址,VXLAN 可以将 BUM 流量有效地分发给多个 VTEP。
- 组播地址(Multicast Address):用于指定一组接收者的 IP 地址,如239.0.4.46。
5. VXLAN 隧道(VXLAN Tunnel)
VXLAN 隧道用于在三层网络上传输二层以太网帧,通过 UDP 封装和解封装实现。VXLAN 隧道两端是 VTEP。
- 隧道ID:由VNI标识。
三、VXLAN 的工作流程
以下是 VXLAN 的基本工作流程,包括上述组件的交互:
1. 本地流量进入 VTEP
-
虚拟机(VM)发送数据包,数据包通过虚拟网卡进入虚拟交换机。
-
虚拟交换机将数据包转发到本地 VTEP。
2. VXLAN 封装
-
本地 VTEP 将数据包封装为 VXLAN 报文,VXLAN 报文包含外层 IP 头部、UDP 头部、VXLAN 头部和内层以太网帧。
-
外层 IP 头部的源 IP 地址为本地 VTEP 的 IP 地址,目的 IP 地址为组播组地址或远端 VTEP 的 IP 地址。
3. 通过物理网络传输
-
VXLAN 报文通过物理网络传输,物理网络设备根据组播路由协议(如 PIM-SM)将组播流量分发给所有加入该组播组的 VTEP。
-
如果使用单播地址,VXLAN 报文将直接发送到目标 VTEP。
4. VXLAN 解封装
- 目标 VTEP 接收到 VXLAN 报文后,检查 VXLAN 头部信息,确认 VNI,然后将报文解封装为原始的二层数据包。
5. 转发到目标虚拟机
- 解封装后的数据包通过虚拟交换机转发到目标虚拟机(VM),完成通信。
四、示例
两台物理机中虚拟机通过 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 |
-
流程如下
image.png
-
组件解释
- 物理机 A 和 B:分别代表两个物理机,每个物理机上都有一个虚拟机。
- VM A 和 VM B:虚拟机,通过虚拟网卡(vnet14 和 vnet15)连接到各自的网桥(Bridge br01)。
- Bridge A:桥接器,用于连接虚拟网卡和 VXLAN 接口(VXLAN 1047)。
- VXLAN 1047 (A) 和 VXLAN 1047 (B):VXLAN 接口,ID 为1047。
- VTEP A 和 VTEP B:VXLAN 隧道端点,负责封装和解封装 VXLAN 报文。
- eth0 (A) 和 eth0 (B):物理网卡,连接到外部网络,用于组播流量的分发。
- Multicast Group 239.0.4.46:组播组地址,用于处理 VXLAN 中的广播、未知单播和组播(BUM)流量。
- tunnel VNI: 1047:VXLAN 隧道,通过 VNI 1047 进行标识。
-
连接关系
- 虚拟机通过虚拟网卡连接到桥接器(Bridge A)。
- 桥接器连接到 VXLAN 接口,再连接到 VXLAN 隧道端点(VTEP)。
- VXLAN 隧道端点通过物理网卡(eth0)连接到组播组。
- 组播组中的流量通过 VXLAN 隧道(VNI 1047)在两个物理机之间传递。
以下操作在 A, B 物理机中操作
2. 创建网桥
关于 brctl 命令查看 Linux brctl 命令
- 创建网桥
# brctl addbr br01
- 设置 stp 和 setfd(网桥延迟)
# 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 命令
- 创建 vxlan
# ip link add vxlan1070 mtu 1500 numtxqueues 4 numrxqueues 4 type vxlan id 1070 group 239.0.4.46 ageing 600 dev eth0
- 启动 vxlan
# ip link set vxlan1070 up
# ifconfig vxlan1070 up
-
查看 vxlan 详情
详情中具体含义查看 Linux ip 命令
# 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
- vm-a
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
- vm-b
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
网友评论