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

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 封装报文的一部分,包含以下关键字段:

  • 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
  • 流程如下

  • 组件解释

    • 物理机 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 命令

  • 创建网桥
shell 复制代码
# brctl addbr br01
  • 设置 stp 和 setfd(网桥延迟)
shell 复制代码
# brctl stp br01 on
# brctl setfd br01 10
  • 查看网桥
shell 复制代码
# brctl show
bridge name	bridge id		STP enabled	interfaces
br01		8000.000000000000	yes
  • 启动网桥
shell 复制代码
# 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
shell 复制代码
# ip link add vxlan1070 mtu 1500 numtxqueues 4 numrxqueues 4 type vxlan id 1070 group 239.0.4.46 ageing 600 dev eth0
  • 启动 vxlan
shell 复制代码
# ip link set vxlan1070 up
# ifconfig vxlan1070 up
shell 复制代码
# 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 加入网桥
shell 复制代码
# brctl addif br01 vxlan1070
  • 再次查看网桥
shell 复制代码
# brctl show
bridge name	bridge id		STP enabled	interfaces
br01		8000.5e9735b4aa96	yes		vxlan1070
5. 配置路由

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

  • 添加组播路由
shell 复制代码
# ip route add 239.0.4.46/32 dev eth0
  • 查看路由
shell 复制代码
# 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

  • 查看虚拟机在物理机中的网卡信息
shell 复制代码
# virsh domiflist i-uwstgzco
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet15     bridge     br01 virtio      fa:52:00:08:e7:51
  • 查看网桥信息
shell 复制代码
# brctl show
br01		8000.d2a03dbdbf3d	yes		vnet15
							             vxlan1070
7. 虚拟机之间互 ping
  • vm-a
shell 复制代码
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
shell 复制代码
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
相关推荐
minji...2 分钟前
Linux 多线程(三)线程控制,线程终止,线程中的异常问题
linux·运维·服务器·开发语言·网络·算法
Benszen6 分钟前
一些存储类型
网络·网络协议·rpc
vortex57 分钟前
一文厘清DDoS与CC攻击
网络·网络安全·渗透测试·ddos
开开心心_Every14 分钟前
实用PDF擦除隐藏信息工具,空白处理需留意
运维·服务器·网络·pdf·电脑·excel·依赖倒置原则
YYYing.29 分钟前
【Linux/C++网络篇(二) 】TCP并发服务器演进史:从多进程到Epoll的进化指南
linux·服务器·网络·c++·tcp/ip
电磁脑机35 分钟前
人类分布式大脑架构与文明、技术、安全的底层逻辑——原创大脑架构理论研究
网络·分布式·神经网络·安全·架构
七夜zippoe41 分钟前
应用安全实践(一):常见Web漏洞(OWASP Top 10)与防护
java·前端·网络·安全·owasp
CDN36042 分钟前
游戏盾不生效、攻击防不住?策略校验与节点切换教程
网络·游戏
数智化管理手记9 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
末日汐11 小时前
传输层协议UDP
linux·网络·udp