OVS+VxLAN

vlan和vxlan区别

  1. 用户标识能力不同
  2. 能否跨越3层进行传输
  3. 解决问题范围不同

vlan报文

vlan号(vlan id)的长度是12位,所以说vlan总共只有2的12次方,4096个,4k个
vlan信息封装在二层,无法跨三层传输
不同用户租借的网络有很大的可能会出现IP地址、MAC地址的重叠,VLAN仅仅解决了二层网络广播域隔离的问题,而并没有涉及到网络地址重叠的问题

vxlan报文

通过VXLAN中的24比特VNI字段,提供多达16M租户的标识能力
vxlan将标签封装udp里,这样就可以跨三层传输
而VXLAN技术还具有多租户支持的特性,通过VXLAN分割,各个租户可以独立组网、通信,地址分配方面和多个租户之间地址冲突的问题也得到了解决

vxlan原理

vlan:Virtual Local Area Network
vxlan:Virtual eXtensible Local Area Network

VxLAN 将虚拟机发出的原始以太报文完整的封装在UDP报文中,然后在外层使用物理网络的IP报文头和以太报文头封装,,封装后的报文就像普通IP报文一样,可以通过路由网络转发,其使得多个通过三层连接的网络可以表现的和直接通过一台物理交换机连接配置而成的网络一样处在一个 LAN 中,使虚拟机摆脱了二、三层网络的结构限制

VXLAN技术可以基于三层网络结构来构建二层虚拟网络,通过VXLAN技术可以将处于不同网段网络设备整合在同一个逻辑链路层网络中

隧道的起点和终点主要在vSwitch上,而非物理交换机上,隧道的封装在服务器内部的vSwitch上就已经打好,所以进入物理网络时, 数据包的外层IP都是物理接口上的IP,这就将原本二层帧变成了三层IP报文,直接进行路由转发即可,这样就实现了大二层透传,甚至可跨DC(数据中心)

原理是,将二层报文用三层协议进行封装
可以满足,同样的两台1.1.1.1和1.1.1.2,可以在经过3层及以上网络后,仍然处在同一个2层网络,即局域网中

vxlan和vlan最终实现的效果是相同的,都可以在2层网络中划分出3层网络中局域网的概念
但是vxlan在报文中添加了更长的字段,同时还利用了高层协议,因此可以跨网络进行传输,同时可划分出的局域网个数也更多

而报文的封装需要通过vtep,而这个vtep可以通过物理交换机或者软件交换机实现,这里就是通过虚拟交换机ovs实现的

在两台物理机中,分别安装ovs,各自虚拟出2台设备,在两台物理机中创建vxlan隧道,vtep由ovs负责实现

https://blog.csdn.net/nb_zsy/article/details/108131962
https://www.cnblogs.com/bakari/p/11131268.html

OVS术语解释

Bridge

中文名称网桥,一个Bridge代表一个以太网交换机(Switch),一台主机中可以创建一个或多个Bridge,Bridge可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或者丢弃数据报文

Port

中文名称端口,需要注意的是它和TCP里面的端口不是同样的概念,它更像是物理交换机上面的插口,可以接水晶头的那种。Port隶属于Bridge,必须先添加了Bridge才能在Bridge上添加Port。Port有以下几种类型:

  1. Normal
    用户可以把操作系统中已有的网卡添加到Open vSwitch上,Open vSwitch会自动生成一个同名的Port开处理这张网卡进和出的数据报文。
    不过需要注意的是这种方式添加的Port不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。此类型的Port常用于VLAN模式的多台物理主机相连的那个口,交换机一端属于Trunk模式。
  2. Internal
    当Port的类型是Internal时,OVS会自动创建一个虚拟网卡(Interface),此端口收到的数据报文都会转发给这块网卡,从这块网卡发出的数据报文也会通过Port交给OVS处理。当OVS创建一个新的网桥时,会自动创建一个与网桥同名的Internal Port,同时也会创建一个与网桥同名的Interface,因此可以通过ip命令在操作系统中查看到这张虚拟网卡,但是状态是down的。
  3. Patch
    Patch Port和veth pair功能相同,总是成双成对的出现,在其中一端收到的数据报文会被转发到另一个Patch Port上,就像是一根网线一样。Patch Port常用于连接两个Bridge,这样两个网桥就和一个网桥一样了。
  4. Tunnel
    OVS 支持 GRE、VXLAN、STT、Geneve和IPsec隧道协议,这些隧道协议就是overlay网络的基础协议,通过对物理网络做的一层封装和扩展,解决了二层网络数量不足的问题,最大限度的减少对底层物理网络拓扑的依赖性,同时也最大限度的增加了对网络的控制。

Interface

(iface/接口)接口是OVS与操作系统交换数据报文的组件,一个接口即是操作系统上的一块网卡,这个网卡可能是OVS生成的虚拟网卡,也有可能是挂载在OVS上的物理网卡,操作系统上的虚拟网卡(TUN/TAP)也可以被挂载在OVS上

Controller

OpenFlow控制器,OVS可以接收一个或者多个OpenFlow控制器的管理,功能主要是下发流表,控制转发规则

Flow

流表是OVS进行数据转发的核心功能,定义了端口之间转发数据报文的规则,一条流表规则主要分为匹配和动作两部分,匹配部分决定哪些数据报文需要被处理,动作决定了匹配到的数据报文该如何处理

open vswitch常用命令

点击查看代码
# 添加网桥:
ovs-vsctl add-br br0  
  
# 列出所有网桥:
ovs-vsctl list-br
  
# 判断网桥是否存在:
ovs-vsctl br-exists br0
  
# 将物理网卡挂载到网桥上:
ovs-vsctl add-port br0 eth0
  
# 列出网桥中的所有端口:
ovs-vsctl list-ports br0
  
# 列出所有挂载到网卡的网桥:
ovs-vsctl port-to-br eth0
  
# 查看ovs的网络状态:
ovs-vsctl show
  
# 删除网桥上已经挂载的网口:
ovs-vsctl del-port br0 eth0
  
# 删除网桥:
ovs-vsctl del-br br0
  
# 设置控制器:
ovs-vsctl set-controller br0 tcp:ip:6633
  
# 删除控制器:
ovs-vsctl del-controller br0
  
# 设置支持OpenFlow Version 1.3:
ovs-vsctl set bridge br0 protocols=OpenFlow13  
  
# 删除OpenFlow支持设置:
ovs-vsctl clear bridge br0 protocols 
  
# 设置vlan标签:
ovs-vsctl add-port br0 vlan3 tag=3 -- set interface vlan3 type=internal
  
# 删除vlan标签:
ovs-vsctl del-port br0 vlan3 
  
# 查询 VLAN:
ovs-vsctl show 
ifconfig vlan3 
  
# 查看网桥上所有交换机端口的状态:
ovs-ofctl dump-ports br0
  
# 查看网桥上所有的流规则:
ovs-ofctl dump-flows br0
  
# 查看ovs的版本:
ovs-ofctl -V# 给端口配置tagovs-vsctl set port br-ex tag=101

网络虚拟化部署流程

1台物理机下设2台vm,通过ovswitch负责管理

host1操作

点击查看代码
// 安装ovs
apt-get install openvswitch-switch

// 物理机操作
// 1. 物理机创建2个命名空间,等价2台vm
ip netns add nsvm1
ip netns add nsvm2

// 2. 创建接口
tap1,tap3,vxlan0用于网桥
tap2,tap4用于交换机
ip link add tap1 type veth peer name tap2 (veth - Virtual ethernet interface) (vm1接口:tap1;与vm1通信的ovswitch接口:tap2)
ip link add tap3 type veth peer name tap4 (vm2接口:tap3;与vm2通信的ovswitch接口:tap3)
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 172.16.56.4 local 172.16.56.3 dev ens33 (vxlan0这个interface的数据要从ens33这个interface传输)

// 3. 设置接口属性
ip link set tap1 netns nsvm1 (设置tap1作为vm1的接口)
ip link set tap3 netns nsvm2 (设置tap3作为vm2的接口)
ip addr add 20.0.0.1/24 dev vxlan0(我没有效果问题出在这里,执行sudo ip addr发现vxlan0没有20.0.0.1的地址)
ip link set tap2 up
ip link set tap4 up
ip link set vxlan0 up

// 4. 命名空间设置接口属性
ip netns exec nsvm1 ip addr add 192.168.0.11/24 dev tap1 (设置vm1,ip 192.168.0.11,端口tap1)
ip netns exec nsvm2 ip addr add 192.168.0.12/24 dev tap3 (设置vm2,ip192.168.0.12,端口tap3)
ip netns exec nsvm1 ip link set tap1 up
ip netns exec nsvm2 ip link set tap3 up

// 虚拟交换机操作
// 1. 交换机创建网桥
ovs-vsctl add-br br0

// 2. 向交换机网桥添加端口tap2,tap4和vxlan0
ovs-vsctl add-port br0 tap2
ovs-vsctl add-port br0 tap4
ovs-vsctl add-port br0 vxlan0

host2操作

点击查看代码
// 安装ovs
apt-get install openvswitch-switch

// 物理机操作
// 1. 物理机创建2个命名空间,等价2台vm
ip netns add nsvm1
ip netns add nsvm2

// 2. 创建接口
tap1,tap3,vxlan0用于网桥
tap2,tap4用于交换机
ip link add tap1 type veth peer name tap2 (veth - Virtual ethernet interface) (vm1接口:tap1;与vm1通信的ovswitch接口:tap2)
ip link add tap3 type veth peer name tap4 (vm2接口:tap3;与vm2通信的ovswitch接口:tap3)
ip link add vxlan0 type vxlan id 42 dstport 4789 remote 172.16.56.3 local 172.16.56.4 dev ens32 (vxlan0这个interface的数据要从ens33这个interface传输)

// 3. 设置接口属性
ip link set tap1 netns nsvm1 (设置tap1作为vm1的接口)
ip link set tap3 netns nsvm2 (设置tap3作为vm2的接口)
ip addr add 20.0.0.2/24 dev vxlan0(我没有效果问题出在这里,执行sudo ip addr发现vxlan0没有20.0.0.2的地址)
ip link set tap2 up
ip link set tap4 up
ip link set vxlan0 up

// 4. 命名空间设置接口属性
ip netns exec nsvm1 ip addr add 192.168.0.13/24 dev tap1 (设置vm1,ip 192.168.0.11,端口tap1)
ip netns exec nsvm2 ip addr add 192.168.0.14/24 dev tap3 (设置vm2,ip192.168.0.12,端口tap3)
ip netns exec nsvm1 ip link set tap1 up
ip netns exec nsvm2 ip link set tap3 up

// 虚拟交换机操作
// 1. 交换机创建网桥
ovs-vsctl add-br br0

// 2. 向交换机网桥添加端口tap2,tap4和vxlan0
ovs-vsctl add-port br0 tap2
ovs-vsctl add-port br0 tap4
ovs-vsctl add-port br0 vxlan0

疑问

  1. vxlan数据包到底是谁封装的
    看网上的说法是ovs交换机负责的,但是ovs交换机如果去掉vxlan的接口,就是一个普通的交换机啊,这些工作应当是vxlan接口负责的吧
    但是vxlan感觉上应该算一个vxlan隧道,既然是隧道不应该仅起到传输的作用吗

  2. vxlan接口的ip作用
    vxlan数据包到底是谁封装的里面的图,突然意识到网络中是会存在多条vxlan隧道的, 而且两个host之间是间隔着互联网的,所以这个隧道应当是有ip的,不然怎么可以经过互联网进行传输,只不过在这个例子中没有模拟两个host之间间隔互联网的情况,反而是处在同一个局域网里面了,和真实应用场景差距较大

反思

  1. 本以为过程没什么问题了,但是忘记了之前把网络模式改成了桥接,结果抓包过程中出现了很多其他包,本来出现了vxlan,但是却着急没有找到,也忘记了grep去筛选一下
    要么应当在检查之前把所有流程测试好,要么就是自己掌握足够多的知识以应对突发情况。考研准备阶段一定是去尽可能准备充足,到后期或许不需要再去纠结哪些东西还没掌握,是不是要考虑已经看过的东西有哪些没有掌握牢靠(这里的策略要斟酌一下)

参考文档

VXLAN原理
ip link 命令文档
ip netns 命令文档
ovs vsctl命令文档
本次实验通俗解释
在 Linux 上配置 VXLAN 网络-掘金
ovs系列文章
华为文章
vxlan数据包到底是谁封装的

posted @   0x7F  阅读(1647)  评论(3编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示