压缩qcow2 镜像文件
压缩qcow2 首先,需要对虚拟机剩余空间进行写零操作: dd if=/dev/zero of=/zero.dat 删除 zero.dat: rm /zero.dat 关闭虚拟机,执行qemu-img的convert命令进行转换: qemu-img convert -c -O qcow2 /path/old.img.qcow2 /path/new.img.qcow2
压缩qcow2 首先,需要对虚拟机剩余空间进行写零操作: dd if=/dev/zero of=/zero.dat 删除 zero.dat: rm /zero.dat 关闭虚拟机,执行qemu-img的convert命令进行转换: qemu-img convert -c -O qcow2 /path/old.img.qcow2 /path/new.img.qcow2
什么是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.168.0.1/24 dev vnet0 主机B # 创建隧道网桥 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.231 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.168.0.2/24 dev vnet0 测试 在主机A上测试网络连通性 ip netns exec ns0 ping 192.168.0.2 ...
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 。 dl_type=0x8035 匹配RARP数据包,等同于 dl_type=rarp。 ...
前言 当我们想要在不影响虚拟网络设备数据报文收发的情况下获取对应虚拟网络设备的流量时,端口镜像是一个很好的选择。端口镜像是指将经过指定端口(镜像端口)的报文复制一份到另一个指定端口(观察端口),通过观察端口接收到的数据报文,就可以有效识别虚拟网络的运行情况。 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.0.0.1/24 dev vnet0 ip netns exec ns1 ip link set lo up ip netns exec ns1 ip link set vnet1 up ip netns exec ns1 ip addr add 10.0.0.2/24 dev vnet1 配置环境 主机B 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.0.0.3/24 dev vnet0 ip netns exec ns1 ip link set lo up ip netns exec ns1 ip link set vnet1 up ip netns exec ns1 ip addr add 10.0.0.4/24 dev vnet1 测试 测试 主机A ip netns exec ns0 ping 10.0.0.3 ip netns exec ns0 ping 10.0.0.4 ip netns exec ns1 ping 10.0.0.3 ip netns exec ns1 ping 10.0.0.4 测试 主机B ip netns exec ns0 ping 10.0.0.1 ip netns exec ns0 ping 10.0.0.2 ip netns exec ns1 ping 10.0.0.1 ip netns exec ns1 ping 10.0.0.2 测试结果 主机A 主机B ping 结果 ns0 ns0 可通信 ✅ ns0 ns1 可通信 ✅ ns1 ns0 可通信 ✅ ns1 ns1 可通信 ✅ 根据测试结果可以看到我们使用OVS成功的联通了分布在不同主机上的虚拟网络设备。 ...
前言 在前面我们已经使用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.0.0.1/24 dev vnet0 ip netns exec ns1 ip link set lo up ip netns exec ns1 ip link set vnet1 up ip netns exec ns1 ip addr add 10.0.0.2/24 dev vnet1 ip netns exec ns2 ip link set lo up ip netns exec ns2 ip link set vnet2 up ip netns exec ns2 ip addr add 10.0.0.3/24 dev vnet2 测试 ...
OVS简介 Open vSwitch 是什么? Open vSwitch(以下简称OVS)是一个用C语言开发的多层虚拟交换机,使用Apcahe 2开源许可证,现如今基本上已经成为了开源SDN(软件定义网络)基础设施层的事实标准。 OVS支持哪些功能? 支持NetFlow、sFlow(R)、IPFIX、SPAN、RSPAN和GRE隧道镜像等多种流量监控协议 支持LACP (IEEE 802.1AX-2008) 支持标准802.1Q VLAN协议,允许端口配置trunk模式 支持组播 支持BFD和802.1ag链路监控 支持STP(IEEE 802.1D-1998)和RSTP(IEEE 802.1D-2004) 支持细粒度的QoS(服务质量)配置 支持HFSC qdisc 支持接管每一个虚拟机的流量 支持基于源MAC的负载均衡、主备模式和L4哈希的端口绑带 支持OpenFlow协议(包含了很多对虚拟化的扩展) 支持IPv6 支持多种隧道协议(GRE、VXLAN、STT、Geneve和IPsec) 支持C和Python的远程配置协议 支持内核和用户空间的转发引擎选项 具有流缓存引擎的多表转发管道 转发层抽象以简化向新软件和硬件平台的移植 OVS的术语解释 Bridge 中文名称网桥,一个Bridge代表一个以太网交换机(Switch),一台主机中可以创建一个或多个Bridge,Bridge可以根据一定的规则,把某一个端口接收到的数据报文转发到另一个或多个端口上,也可以修改或者丢弃数据报文。 Port 中文名称端口,需要注意的是它和TCP里面的端口不是同样的概念,它更像是物理交换机上面的插口,可以接水晶头的那种。Port隶属于Bridge,必须先添加了Bridge才能在Bridge上添加Port。Port有以下几种类型: Normal 用户可以把操作系统中已有的网卡添加到Open vSwicth上,Open vSwitct会自动生成一个同名的Port开处理这张网卡进和出的数据报文。 不过需要注意的是这种方式添加的Port不支持分配IP地址,如果之前网卡上配置的有IP,挂载到OVS上面之后将不可访问。此类型的Port常用于VLAN模式的多台物理主机相连的那个口,交换机一端属于Trunk模式。 Internal 当Port的类型是Internal时,OVS会自动创建一个虚拟网卡(Interface),此端口收到的数据报文都会转发给这块网卡,从这块网卡发出的数据报文也会通过Port交给OVS处理。当OVS创建一个新的网桥时,会自动创建一个与网桥同名的Internal Port,同时也会创建一个与网桥同名的Interface,因此可以通过ip命令在操作系统中查看到这张虚拟网卡,但是状态是down的。 Patch Patch Port和veth pair功能相同,总是成双成对的出现,在其中一端收到的数据报文会被转发到另一个Patch Port上,就像是一根网线一样。Patch Port常用于连接两个Bridge,这样两个网桥就和一个网桥一样了。 Tunnel OVS 支持 GRE、VXLAN、STT、Geneve和IPsec隧道协议,这些隧道协议就是overlay网络的基础协议,通过对物理网络做的一层封装和扩展,解决了二层网络数量不足的问题,最大限度的减少对底层物理网络拓扑的依赖性,同时也最大限度的增加了对网络的控制。 Interface (iface/接口)接口是OVS与操作系统交换数据报文的组件,一个接口即是操作系统上的一块网卡,这个网卡可能是OVS生成的虚拟网卡,也有可能是挂载在OVS上的物理网卡,操作系统上的虚拟网卡(TUN/TAP)也可以被挂载在OVS上。 Controller OpenFlow控制器,OVS可以接收一个或者多个OpenFlow控制器的管理,功能主要是下发流表,控制转发规则。 Flow 流表是OVS进行数据转发的核心功能,定义了端口之间转发数据报文的规则,一条流表规则主要分为匹配和动作两部分,匹配部分决定哪些数据报文需要被处理,动作决定了匹配到的数据报文该如何处理。 OVS常用操作 安装 yum install openvswitch systemctl enable openvswitch systemctl start openvswitch 如果当前软件源中没有openvswitch,可以通过阿里云官方镜像站下载和操作系统版本对应的rpm包到本地再安装。 示例命令: yum localinstall openvswitch-2.9.0-3.el7.x86_64.rpm ...
前言 你是否遇到过这样的场景,服务器不能上网,但是又需要安装某个软件,面对如蛛网般杂乱的rpm包依赖关系,放弃或许是最好的选择,这样你就不必再为无法完成工作而痛苦又懊恼。 但是今天,你有了一个更好的选择。 4DNAT 4DNAT取名源自4和DNAT。这个工具工作在OSI模型的第四层传输层,同时4和for谐音,意为专门为目标地址转换而服务的工具。4DNAT使用go语言开发,具有天然的跨平台性,并且完全使用go标准库开发,没有任何的第三方依赖,编译之后只有一个二进制可执行文件。它有4种工作模式: 转发模式 接受两个参数,监听端口和目标地址,在监听端口接收到请求后会主动连接目标地址,示例: ./4dnat -forward 2222 192.168.1.100:22 监听模式 接受两个参数,监听端口1和监听端口2,并交换两个端口接收到的数据,示例: ./4dnat -listen 10000 10001 代理人模式 接受两个参数,目标地址1和目标地址2,启动后会主动连接这两个目标地址,并交换两个端口接收到的数据,示例: ./4dnat -agent 127.0.0.1:10000 127.0.0.1:22 http/https代理模式 接受两个参数或四个参数,代理类型、监听端口、证书路径和私钥路径,示例: http代理 ./4dnat -proxy http 1080 https代理 ./4dnat -proxy https 1080 server.crt server.key 使用场景 场景一 期望可以在用户电脑上直接访问目标服务器上的3306端口,跳板机器是一台Windows机器,没办法做ssh端口转发。 单向虚线箭头表示可以单向访问,反之不行。 使用4DNAT在跳板机器上执行如下命令做端口转发 # 本地监听3307端口,接收到请求后主动连接10.1.0.40的3306端口 ./4dnat -forward 3307 10.1.0.40:3306 在用户电脑上访问172.16.0.30:3307即等同于访问10.1.0.40:3306,于是就可以在用户电脑愉快的访问目标机器上的服务啦。 场景二 期望目标目标机器可以上网,如使用yum安装软件。 在用户电脑上开启一个http代理 ./4dnat -proxy http 1080 在跳板机器上使用监听模式监听两个端口,用于交换数据 ./4dnat -listen 10000 10001 在目标机器上使用监听模式监听两个端口,用于交换数据 ./4dnat -listen 20000 20001 在用户电脑上使用代理人模式主动连接两个目标地址,用于交换数据 ./4dnat -agent 127.0.0.1:1080 172.16.0.30:10000 在跳板机器上使用代理人模式主动连接两个目标地址,用于交换数据 ./4dnat -agent 127.0.0.1:10001 10.1.0.40:20000 在目标机器上修改代理 cat <<EOF >> /etc/profile http_proxy=http://127.0.0.1:20001 https_proxy=http://127.0.0.1:20001 export http_proxy https_proxy EOF source /etc/profile 在目标机器上测试访问互联网 curl https://typesafe.cn 最后奉上项目地址 https://github.com/dushixiang/4dnat ...
前言 作为一个称职的打工人,电脑上常备一个Vmware不是什么新鲜事了,但是它和Docker for Windows不兼容往往很让人头大。通过查找资料,发现提供的解决方案大致有三种 先使用Vmware创建一台Linux虚拟机,在这台Linux虚拟机上再安装docker。 配置Vmware作为Docker for Windows的运行平台。 使用微软的Hyper-v来创建虚拟机。 对我而言,第一种不太优雅,第二种配置繁琐,第三种不会用。 直到我发现了vctl这个好东西。 vctl 是什么? vctl 是一款捆绑在Vmware Workstation Pro 应用程序中的命令行实用程序,仅在 Windows 10 1809 或更高版本上受支持。如果 Workstation Pro 所在主机上的 Windows 操作系统低于 Windows 10 1809,则它不支持 vctl CLI。 简单来说它就是Vmware上的一个工具,可以用它来管理容器,使用命令基本上和docker一致,只需要把docker <cmd>换成vctl <cmd>就足够了。Docker for Windows?不需要。现在容器都交给vctl来管理了。 在使用vctl命令前,和启动docker一样,需要先启动vctl的守护进程。 vctl system start 当需要关闭守护进程时执行 vctl system stop 接下来就是和普通的docker命令一样了。 # 拉取镜像 vctl pull nginx # 查看镜像 vctl images # 启动容器 vctl --name some-nginx -d -p 8080:80 nginx # 查看容器 vctl ps # 进入容器 vctl exec -it <cid> bash 更多使用信息可参考Vmware的官方文档 使用vctl命令管理容器 ...
Linux Bridge 详解 Linux Bridge(网桥)是用纯软件实现的虚拟交换机,有着和物理交换机相同的功能,例如二层交换,MAC地址学习等。因此我们可以把tun/tap,veth pair等设备绑定到网桥上,就像是把设备连接到物理交换机上一样。此外它和veth pair、tun/tap一样,也是一种虚拟网络设备,具有虚拟设备的所有特性,例如配置IP,MAC地址等。 Linux Bridge通常是搭配KVM、docker等虚拟化技术一起使用的,用于构建虚拟网络,因为此教程不涉及虚拟化技术,我们就使用前面学习过的netns来模拟虚拟设备。 如何使用Linux Bridge? 操作网桥有多种方式,在这里我们介绍一下通过bridge-utils来操作,由于它不是Linux系统自带的工具,因此需要我们手动来安装它。 # centos yum install -y bridge-utils # ubuntu apt-get install -y bridge-utils 使用brctl help查看使用帮助 never heard of command [help] Usage: brctl [commands] commands: addbr <bridge> add bridge delbr <bridge> delete bridge addif <bridge> <device> add interface to bridge delif <bridge> <device> delete interface from bridge hairpin <bridge> <port> {on|off} turn hairpin on/off setageing <bridge> <time> set ageing time setbridgeprio <bridge> <prio> set bridge priority setfd <bridge> <time> set bridge forward delay sethello <bridge> <time> set hello time setmaxage <bridge> <time> set max message age setpathcost <bridge> <port> <cost> set path cost setportprio <bridge> <port> <prio> set port priority show [ <bridge> ] show a list of bridges showmacs <bridge> show a list of mac addrs showstp <bridge> show bridge stp info stp <bridge> {on|off} turn stp on/off 常用命令如 ...