什么是VXLAN? VXLAN是一种隧道封装协议,在三层网络上封装二层网络数据报文。简单来说就是可以在已经规划好网络拓扑的设备上封装出一个新的二层网络,因此VXLAN这类网络又被称之为overylay网络,底下承载VXLAN网络的就被称之为underlay网络。
VXLAN解决了什么问题? 最近几年,阿里云,腾讯云,京东云,华为云等等厂商每到节日都会打折出售大量云服务器,1核1G内存50G磁盘的服务器几十块就能买到一年的使用权,作为一个专业的羊毛党,哪个手里没有几台小破水管机器?但是这么多的云服务器是厂商如何做隔离的呢?了解过网络的同学或许会说VLAN。但是VLAN这种只能隔离4094个虚拟网络的技术别说满足不了羊毛党了,就连正常的用户估计都撑不住。那不隔离能行吗,厂商规划一个特别大的网段,让大家都在这里面耍,正常用户还好,万一这个时候进来一个大黑客,估计就会全部GG。
因此,隔离是必不可少的,其中关键的技术就是overlay网络。
那VXLAN具体解决了哪些问题呢?
突破了VLAN技术4094个隔离网络的限制,在一个管理域中创建多达1600万个VXLAN网络。 VXLAN提供了云服务厂商所需的规模的网络分段,以支持大量租户。 突破了物理网络边界的限制,传统虚拟二层网络(VLAN)是需要和物理网络做大量适配工作才能保证环境的迁移不会导致虚拟网络异常,overlay网络则不必关心底层物理网络是如何搭建的,只要能保证VXLAN端点相互之间可以联通即可。 VXLAN网络如何工作? VXLAN隧道协议将二层以太网帧封装在三层UDP数据包中,使用户能够创建跨物理三层网络的虚拟化二层子网或网段。每个二层子网使用VXLAN网络标识符(VNI)作为唯一标识。报文格式如下图:
执行数据包封装和解封装的实体称为VXLAN隧道终结点(VTEP)。VTEP主要分为两类:硬件VTEP和软件VTEP。硬件VTEP我接触较少,这里就不再介绍了。
软件VTEP如下图所示:VTEP在数据包到达虚拟机之前进行了封装和解封装,使得虚拟机完全不需要知道VXLAN隧道以及它们之间的三层网络。
简单VXLAN实验 我们参照下图完成实验。
主机A # 创建隧道网桥 ovs-vsctl add-br br-tun # 创建隧道端口并指定远端IP和VXLAN ID ovs-vsctl add-port br-tun vx01 -- set Interface vx01 type=vxlan options:remote_ip=192.168.123.232 options:key=1111 # 创建内部端口 ovs-vsctl add-port br-tun vnet0 -- set Interface vnet0 type=internal # 创建netns用于模拟虚拟网络设备 ip netns add ns0 # 将内部端口移动到netns中 ip link set vnet0 netns ns0 # 启动网卡 ip netns exec ns0 ip link set lo up ip netns exec ns0 ip link set vnet0 up # 配置IP ip netns exec ns0 ip addr add 192....
OpenvSwitch flow table 流表 OpenFlow(OF)被认为是第一个软件定义网络(SDN)标准之一。它最初在SDN环境中定义了通信协议,使SDN控制器能够与物理和虚拟的交换机和路由器等网络设备的转发平面直接进行交互,从而更好地适应不断变化的业务需求。
如果把OpenFlow控制器比作“大脑”,OVS流表就像是“大腿”一样接受来自“大脑”的指令,决定要向哪个方向前进。但OVS流表功能更加强大,在没有OpenFlow控制器时,也可以自主工作,它本身也供一些命令让我们可以直接管理流表。
操作命令 查看流表规则 # 查看br-tun上的全部流表规则 ovs-ofctl dump-flows br-tun 添加或修改流表规则 ovs-ofctl add−flow/add−flows/mod−flows “流表匹配条件,actions=[动作1][,动作2…]” 如果你有过编程的经验,流表规则其实就是一个个简单的if语句,伪代码如下。
if (流表匹配条件){ 动作1, 动作2... } if (流表匹配条件){ 动作1, 动作2... } 删除流表规则 # 删除br-tun上的全部流表规则 ovs-ofctl del-flows br-tun # 删除br-tun上匹配xx的全部流表规则 ovs-ofctl del-flows br-tun xx 流表匹配条件 OVS 流表匹配条件较多,下面我将其分成四部分来说明,分别是:
OVS匹配条件 OSI模型第二层【数据链路层】 OSI模型第三层【网络层】 OSI模型第四层【传输层】 OVS匹配条件 in_port=port 流量进入的端口编号或者名称,示例 in_port=br-int
table=number 规则保存的流表编号,范围是 0-254,默认值:0。
OSI模型第二层【数据链路层】 dl 即是 data link 的缩写。
dl_type=ethertype 匹配以太网协议类型以太类型,以10到65535之间的整数(包括0和65535)指定,以十进制或以0x前缀的十六进制数表示,示例如下。
dl_type=0x0800 匹配IPv4数据包,等同于dl_type=ip 。
dl_type=0x086dd 匹配IPv6数据包,等同于dl_type=ipv6 。
dl_type=0x0806 匹配ARP数据包,等同于dl_type=arp 。...
前言 当我们想要在不影响虚拟网络设备数据报文收发的情况下获取对应虚拟网络设备的流量时,端口镜像是一个很好的选择。端口镜像是指将经过指定端口(镜像端口)的报文复制一份到另一个指定端口(观察端口),通过观察端口接收到的数据报文,就可以有效识别虚拟网络的运行情况。
OVS提供了相关命令来配置或删除端口镜像,下面我们来实验一下。
如何使用 端口镜像类型 端口镜像分为镜像源和镜像目的两部分。
镜像源 select_all:布尔类型(true,false)。设置为 true 时,表示此网桥上的所有流量。 select_dst_port:字符串(端口名称)。表示此端口接收的所有流量。 select_src_port:字符串(端口名称)。表示此端口发送的所有流量。 select_vlan:整型(0-4095)。表示携带此VLAN标签的流量。 镜像目的 output_port:字符串(端口名称)。接收流量报文的观察端口。 output_vlan:整型(0-4095)。表示只修改VLAN标签,原VLAN标签会被剥离。 基础操作命令 新增端口镜像
ovs-vsctl -- set Bridge <bridge_name> mirrors=@m \ -- --id=@<port0> get Port <port0> \ -- --id=@<port1> get Port <port1> \ -- --id=@m create Mirror name=<mirror_name> select-dst-port=@<port0> select-src-port=@<port0> output-port=@<port1> 这行命令会输出一个镜像ID
删除端口镜像
ovs-vsctl remove Bridge <bridge-name> mirrors <mirror-id> 在原端口镜像的基础上增加一个镜像源
# 获取端口的ID ovs-vsctl get port <port_name> _uuid # 在原端口镜像的基础上增加镜像源 ovs-vsctl add Mirror <mirror-name> select_src_port <port-id> ovs-vsctl add Mirror <mirror-name> select_dst_port <port-id> 在原端口镜像的基础上删除一个镜像源...
使用OVS构建分布式隔离网络 前言 上一节我们使用OVS构建了单机隔离网络,但是随着网络规模的扩张,单节点已经不再能满足业务的需要,分布式网络成了必不可少的环节。分布式网络与单节点网络在细节实现上基本一致,只有物理环境网络连线上的一点区别。
实验1:分布式无隔离网络 网络拓扑如下图所示,我们每一台节点都有两张网卡,一张用于管理,一张用于业务。之所以使用两张网卡有两个原因:
管理网卡用于日常的维护登录,业务网卡用于传输虚拟节点的数据报文,避免相互之间影响。 我们要将业务网卡绑定到OVS网桥上,也就是Normal类型的Port。这种方式添加的Port不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。 需要注意的是,如果是使用物理环境搭建网络拓扑,需要把业务网卡对应的交换机端口配置为trunk模式。如果是使用VmWare搭建网络拓扑,业务网卡需要配置网络类型为仅主机模式。
配置 配置环境 主机A ovs-vsctl add-br br-int # 请修改eth1为当前实验环境的业务网卡名称 ovs-vsctl add-port br-int eth1 # 添加两个内部端口 ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal ovs-vsctl add-port br-int vnet1 -- set Interface vnet1 type=internal # 添加两个netns ip netns add ns0 ip netns add ns1 # 将内部端口分别移动到netns中 ip link set vnet0 netns ns0 ip link set vnet1 netns ns1 # 启动端口并配置IP ip netns exec ns0 ip link set lo up ip netns exec ns0 ip link set vnet0 up ip netns exec ns0 ip addr add 10....
前言 在前面我们已经使用Linux Bridge完成了多台网络设备的通信,但是它对于网络隔离的支持不是很好,长期以来,在Linux平台上缺少一个功能完备的虚拟交换机,直到OVS的出现。
实验 接下来我们来尝试完成两个实验,单机无隔离网络、单机隔离网络。
实验一:单机无隔离网络 使用ovs构建无隔离网络非常简单,只需要添加一个网桥,然后在这个网桥上再增加几个内部端口,最后把端口移动到netns中即可。
# 添加网桥 ovs-vsctl add-br br-int # 添加三个内部端口 ovs-vsctl add-port br-int vnet0 -- set Interface vnet0 type=internal ovs-vsctl add-port br-int vnet1 -- set Interface vnet1 type=internal ovs-vsctl add-port br-int vnet2 -- set Interface vnet2 type=internal # 添加三个netns ip netns add ns0 ip netns add ns1 ip netns add ns2 # 将内部端口分别移动到netns中 ip link set vnet0 netns ns0 ip link set vnet1 netns ns1 ip link set vnet2 netns ns2 # 启动端口并配置IP ip netns exec ns0 ip link set lo up ip netns exec ns0 ip link set vnet0 up ip netns exec ns0 ip addr add 10....