Linux网络虚拟化

第一章 Network Namespace

一、Linux Namespace

Linux Namespace提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的 Namespace中,来实现资源隔离的目的。不同 Namespace的程序,可以享有一份独立的系统资源。目前Linux中提供了六类系统资源的隔离机制,分别是:

通过/proc文件查看已存在的Namespace

用户可以在/proc/$pid/ns文件下看到本进程所属的Namespace的文件信息。例如PID为1383进程的情况如下图所示:

通过lsns命令我们可以查看Namespace的PID

二、Network Namespace

不同的network namespace 里面有着自己的路由表,自己的设备,自己的iptables等规则。不同的network namespace里面是不能看到其他namespace里面的设备的(就相当于两台电脑如果没有线缆之类的物理介质连接,是不能相互通讯的)。

  1. 我们可以使用下面的命令来创建一个network namespace。

#创建network namespace

ip netns add nstest

创建后的现状,可以看到现在两个namespace还是不通的,那么如何让两个不同的namespace之间通讯呢?那就需要用到veth pair。

  1. veth pair 相当于虚拟网卡对,我们创建veth pair,就获得了两块虚拟的网卡。

#创建veth pair

ip link add veth-a type veth peer name veth-b

  1. 接着我们把veth-b加入到我们新创建的network namespace里面,使用如下命令。

#把veth-b加入新建的namespace

ip link set veth-b netns nstest

如下图,现在还是不能ping通两块虚拟网卡:因为我们没有加上IP

  1. 给两块虚拟网卡加IP,并且启动两块网卡。

ip addr add 10.0.0.2 dev veth-a && ip link set veth-a up

ip netns exec nstest ip addr add 10.0.0.3 dev veth-b && ip netns exec nstest ip link set veth-b up

两块网卡必须要在同一个网段里面,然而现在还是不能ping通,因为nstest namespace里面的路由表没有设置,我们需要给它添加路由。

#给nstest namespace添加路由(互相配置对端ip为网关)

#如果不加掩码它会默认32位掩码

ip netns exec nstest route add -net default gw 10.0.0.2/24 dev veth-b

route add -host 10.0.0.3/24 dev veth-a

#配置完成后,现在两张网卡就能ping通了,并且veth-b也可以ping通eth0

  1. 如果想让veth-b能够访问外网,就需要做如下配置。

#开启host的路由转发功能

cat 1 > /proc/sys/net/ipv4/ip_forward

#让eth0 转发 veth-a的包

iptables -A FORWARD -t filter --out-interface eth0 --in-interface veth-a

iptables -A FORWARD -t filter --in-interface eth0 --out-interface veth-a

#添加nat转发功能  

iptables -t nat -A POSTROUTING --source 10.0.0.0/24 --out-interface eth0 -j MASQUERADE

#让源目的IP为10.0.0.0/24的包都经过eth0这个接口nat出去,MASQUERADE是伪装的意思,意味着eth0会修改包的src IP(SNAT)。

#现在就能使用veth-b这块虚拟网卡来访问外网了

ip netns exec nstest curl www.baidu.com

Linux上的操作

第二章 Linux Bridge

概述

Linux Bridge(网桥)是在linux上用来TCP/IP两层协议交换的设备,类似于交换机的功能。

Bridge可以绑定其它Linux网络设备作为从设备,并将这些设备虚拟化为端口,类似于交换机和一个终端用户通过网线连接。当有数据到达时,Bridge会根据报文中的MAC信息进行广播、转发、丢弃处理。

Bridge的功能只在内核中实现,当一个从设备连接在Bridge上时,此时内核程序中,netdev_rx_handler_register()被调用,一个用于接收数据的回调函数被注册。之后每次从设备接收到数据时都会调用该函数将数据转发到Bridge上。在Bridge接收到该收据后,调用br_handle_frame()函数,对数据进行处理,包括:判断包的类别(广播/单播),查找内部MAC端口映射表,定位目标端口号,将数据转发到目标端口号或丢弃,自动更新内部MAC端口映射表以自我学习。

图解:

在Linux中,配置虚拟机采用桥接模式并指定br0后,数据从虚拟机的网卡vnet0发出到br0,br0会将数据转发给另一端的eth0,源mac是虚拟机的随机MAC地址,源IP是虚拟机的IP地址,桥并没有做中间修改,数据仅仅通过eth0网卡直接发到链路上,eth0只是充当一个发送的物理介质。

当应答回来的时候,物理网卡eth0会在混杂模式捕获包并交给br0处理,如果目标mac地址等于eth0或者vnet0,则进一步处理。如果是eth0的包那么直接宿主机处理,如果是vnet0的包则转发给虚拟机处理,整个过程无需对包做出修改,因为br0仅仅是一个交换机,而eth0和vnet0是连在上面的2个网卡而已。

一、使用工具brctl管理

1、添加网桥(br0)

brctl addbr br0

2、设置网桥br0可用

ifconfig br0 192.168.100.1 netmask 255.255.255.0

3、查看网桥

#显示所有的网桥信息

brctl show

#显示某个网桥的信息

brctl show br0

4、删除网桥

brctl delbr br0

5、将eth0端口加入网桥

br0 brctl addif br0 eth0

6、从网桥br0中删除eth0端口

brctl delif br0 eth0

二、网络文件配置桥接模式

 我们编辑本地网卡ens33,在最后加上BRIDGE="br0"

vi /etc/sysconfig/network-scripts/ifcfg-ens33

#ifcfg-ens33配置文件内容:

TYPE="Ethernet"

PROXY_METHOD="none"

BROWSER_ONLY="no"

BOOTPROTO="dhcp"

DEFROUTE="yes"

IPV4_FAILURE_FATAL="no"

IPV6INIT="yes"

IPV6_AUTOCONF="yes"

IPV6_DEFROUTE="yes"

IPV6_FAILURE_FATAL="no"

IPV6_ADDR_GEN_MODE="stable-privacy"

NAME="ens33"

UUID="2abd07e4-4b80-1bfc-9b21-c472d165a888"

DEVICE="ens33"

ONBOOT="yes"

BRIDGE="br0"         #在配置文件最后加上

然后创建桥接网卡br0配置文件,内容如下:

vi /etc/sysconfig/network-scripts/ifcfg-br0

#ifcfg-br0配置文件内容:

DEVICE=br0

TYPE=Bridge

BOOTPROTO=dhcp

ONBOOT=yes

然后重启网络。

第三章 虚拟网络设备

一、tun/tap概念

tap/tun 提供了一台主机内用户空间的数据传输机制。它虚拟了一套网络接口,这套接口和物理的接口无任何区别,可以配置 IP,可以路由流量,不同的是,它的流量只在主机内流通。

tap/tun 有些许的不同,tun 是一个点对点的三层设备,只操作三层的 IP 包,所以它只模拟到了网络层,没有MAC地址,而 tap 是一个二层设备操作二层的以太网帧,它和真的网卡没有什么区别,所以tap又支持与物理网卡作Bridge。

作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。tap/tun 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。

二、tun/tap用户空间与内核空间的数据传输

tap/tun 通过驱动程序和一个与之关联的字符设备,来实现用户空间和内核空间的通信接口。

在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为:

tap:/dev/tap0

tun:/dev/net/tun

设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟设备接口,一般以 tunX 或 tapX 命名。当应用程序关闭文件时,驱动也会自动删除 tunX 和 tapX 设备,还会删除已经建立起来的路由等信息。

tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时,内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。也就是说,tun/tap设备是在使用时动态创建的,当设备不再使用时,相应的设备文件会被删除。

三、tun/tap的工作流程

应用程序A(192.168.1.2)构造包发往192.168.1.0/24网段的主机192.168.1.1流程:

  • A–socket A–>dst:192.168.1.1
  • NPS查dst,出接口为tun0
  • tun0发现另一端被B打开,将数据发送给应用程序B
  • B进行一些处理之后,构造包,sip为10.1.1.11,dst是10.1.1.10/24的网关10.1.1.1,封装原来的数据包,发给NPS
  • NPS查路由,将包从eth0发出

后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机192.168.1.1。当接收回包时,也遵循同样的流程(也会经过对端的tun0设备驱动进行解封装)。

在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的。

应用例子:

tap/tun在libvirt中的应用

用作VPN

四、tun/tap的配置

#确认内核是否有tun模块

modinfo tun

#加载内核模块

modprobe tun

# 创建 tun/tap 设备

ip tuntap add dev tap0 mod tap       # 创建 tap

ip tuntap add dev tun0 mod tun       # 创建 tun

# 删除tun/tap设备

ip tuntap del dev tap0 mod tap        # 删除 tap

ip tuntap del dev tun0 mod tun        # 删除 tun

# 设置 ip 地址,up 设备

ip address add dev tap0 10.0.1.5/24 ip link set dev tap0 up

tunctl工具

#默认创建 tap 接口:

tunctl

以上等价于 tunctl -p。

#为用户 user 创建一个 tap 接口:

tunctl -u user

#创建 tun 接口:

tunctl -n

#为接口配置 IP 并启用:

ifconfig tap0 192.168.0.254 up

#为接口添加路由:

route add -host 192.168.0.1 dev tap0

#删除接口:

tunctl -d tap0

五、Veth-pair概念

Veth-pair 不是一个设备,而是一对设备,作为虚拟网线用于连接两个虚拟网络设备。veth pair 是根据数据链路层的 MAC 地址对网络数据包进行转发的过程来实现的,本质是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。

veth pair 在虚拟网络设备中是作为 “网线” 的存在,将 tap 之间,tap 与 Bridge 之间连接起来。veth pair 通常还与 Network namespace 一起配合,实现不同 Network namespace 中的网络设备传输。

六、Veth-pari工作流程

  1. 首先 ping 程序构造 ICMP echo request,通过 Socket API 发给内核网络协议栈。
  2. 由于 ping 指定了走 veth0 口,如果是第一次,则需要发 ARP 请求,否则协议栈直接将数据包交给 veth0。
  3. 由于 veth0 连着 veth1,所以 ICMP request 直接发给 veth1。
  4. veth1 收到请求后,交给另一端的协议栈。
  5. 协议栈看本地有 10.1.1.3 这个 IP,于是构造 ICMP reply 包,查看路由表,发现回给 10.1.1.0 网段的数据包应该走 lo 口,于是将 reply 包交给 lo 口(会优先查看路由表的 0 号表,ip route show table 0 查看)。
  6. lo 收到协议栈的 reply 包后,啥都没干,转手又回给协议栈。
  7. 协议栈收到 reply 包之后,发现有 Socket 在等待包,于是将包给 socket。
  8. 等待在用户态的 ping 程序发现 Socket 返回,于是就收到 ICMP 的 reply 包。

第四章 实操不同namespace通信

#创建network namespace

ip netns add nstest

#创建veth pair

ip link add veth-a type veth peer name veth-b

#把veth-b加入新建的namespace

ip link set veth-b netns nstest

#给两个veth-a和veth-b分别添加地址

ip add 10.0.0.2 dev veth-a && ip link set veth-a up

ip netns exec nstest ip addr add 10.0.0.3 dev veth-b && ip netns exec nstest ip link set veth-b up

#给两个虚拟网络设备分别添加路由

ip netns exec nstest route add -net default gw 10.0.0.2/24 dev veth-b

route add -host 10.0.0.3/24 dev veth-a

第五章 SDN

一、概念

SDN(Software-Defined Networking)是一种体系开放网络架构,它通过将网络控制平面(control plane)和数据转发平面(data plane)进行分离,以软件方式对网络进行集中管理和控制。

SDN通过将网络控制逻辑集中到一个或多个控制器(Controller)中,实现对网络的集中管理和编程。控制器与网络设备之间通过开放的接口(如OpenFlow协议)进行通信,控制器可以动态地调整网络流量的路径、配置网络策略和服务质量等。这种分离控制平面和数据转发平面的架构使得网络更加灵活、可编程和可自动化。

二、SDN网络体系架构的三层模型

  • 应用层:这一层主要是体现用户意图的各种上层应用程序,此类应用程序称为协同层应用程序,典型的应用包括OSS(Operation support system 运营支撑系统)、Openstack等。传统的IP网络同样具有转发平面、控制平面和管理平面,SDN网络架构也同样包含这3个平面,只是传统的IP网络是分布式控制的,而SDN网络架构下是集中控制的。
  • 控制层:控制层是系统的控制中心,负责网络的内部交换路径和边界业务路由的生成,并负责处理网络状态变化事件。
  • 转发层:转发层主要由转发器和连接器的线路构成基础转发网络,这一层负责执行用户数据的转发,转发过程中所需要的转发表项是由控制层生成的。
  • 北向接口:应用层和控制层通信的接口,应用层通过控制开放的API,控制设备转发功能
  • 南向接口:控制层和数据层通信的接口,控制器通过OpenFlow或其他协议下发流表。

三、控制层面与数据层面的模型图

四、SDN的四大特征

  • 基于流的转发
  • 数据层面和控制层面的分离(不在同一个设备中)
  • 位于数据层面分组交换机之外的网络控制功能
  • 可编程的网络

五、传统网络架构与SDN网络架构的对比

1、控制层面

前面提到传统的路由器根据路由算法,和相邻的路由器周期性交换路由信息才能得出路由表,由路由表得到转发表。

在SDN中,远程控制器掌握各主机和整个网络的状态,能够为每一个数据分组计算出最佳的路由并为每一个路由器生成正确的转发表(实际上是流表)。因此不需要再进行路由信息分组的转发。

2、数据层面

传统路由器的分组转发:

进行“匹配”:查找转发表中的网络前缀,并进行最长前缀匹配

执行“动作”:把分组从匹配结果指明的接口转发出去

SDN的广义转发:

进行“匹配”:能够对网络体系中各层(数据链路层,网络层,运输层)首部中的字段进行匹配

执行“动作”:不仅转发分组,还可以负载均衡,重写IP首部(类似NAT路由器中的地址转发),人为阻挡或丢弃一些分组(类似防火墙)

在SDN的广义转发中,完成“匹配+动作”的设备并不局限在网络层工作,因此不再称为路由器,而称为“OpenFlow交换机”或“分组交换机”。在交换机中,既可以处理数据链路层的帧,也可以处理网际层的IP数据报,还可以处理运输层的TCP或UDP报文。

相应的路由器中的转发表变为流表。SDN远程控制器通过一个安全信道使用OpenFlow协议来管理OpenFlow交换机中的流表。

第六章 Openflow

一、概念

OpenFlow是一种通信协议,它定义了在SDN(Software-Defined Networking)架构中,控制器(Controller)和网络设备(如交换机和路由器)之间的通信方式。

OpenFlow协议的核心思想是将网络设备的数据转发平面(data plane)与控制平面(control plane)进行分离。在OpenFlow架构中,网络设备负责数据包的转发,而控制器负责制定网络策略、配置流表和指导网络设备的行为。

在OpenFlow中,流(Flow)是一组具有相同属性的数据包。流的属性可以包括源IP地址、目标IP地址、源端口、目标端口等。流表(Flow Table)是网络设备中存储流信息和相关操作的数据结构。每个网络设备都有一个或多个流表,用于匹配和处理数据包。

当数据包到达网络设备时,设备会根据数据包的属性与流表中的条目进行匹配。如果找到匹配的流表条目,设备将执行相应的操作,如转发到指定的端口、修改数据包的头部等。如果没有找到匹配的流表条目,设备会将数据包发送到控制器进行处理。

控制器可以通过OpenFlow协议与网络设备进行通信,向设备发送流表条目,指导设备的数据转发行为。控制器可以根据网络需求动态地配置和更新流表条目,实现对网络的灵活控制和编程。

二、流表

1、流表项的组成

在传统网络设备中,交换机/路由器的数据转发需要依赖设备中保存的二层MAC地址转发表、三层IP地址路由表以及传输层的端口号等。OpenFlow交换机中使用的“流表”也是如此,不过他的表项并非是指普通的IP五元组,而是整合了网络中各个层次的网络配置信息,由一些关键字和执行动作组成的灵活规则。

OpenFlow流表的每个流表项都由匹配域(Match Fields)、处理指令(Instructions)等部分组成。流表项中最为重要的部分就是匹配域和指令,当OpenFlow交换机收到一个数据包,将包头解析后与流表中流表项的匹配域进行匹配,匹配成功则执行指令。

流表项的结构随着OpenFlow版本的演进不断丰富,不同协议版本的流表项结构如下。

每个OpenFlow交换机必须有一个或多个流表,每个流表含多个流表项。

2、多级流表与流水线处理

OpenFlow v1.0采用单流表匹配模式,这种模式虽然简单,但是当网络需求越来越复杂时,各种策略放在同一张表中显得十分臃肿。这使得控制平面的管理变得十分困难,而且随着流表长度与数目的增加,对硬件性能要求也越来越高。

从OpenFlow v1.1开始引入了多级流表和流水线处理机制,当报文进入交换机后,从序号最小的流表开始依次匹配,报文通过跳转指令跳转至后续某一流表继续进行匹配,这样就构成了一条流水线。多级流表的出现一方面能够实现对数据包的复杂处理,另一方面又能有效降低单张流表的长度,提高查表效率。

3、流表下发方式

OpenFlow流表的下发分可以是主动(Proactive)的,也可以是被动(Reactive)的:

主动模式下,控制器将自己收集的流表信息主动下发给OpenFlow交换机,随后交换机可以直接根据流表进行转发。

被动模式下,OpenFlow交换机收到一个报文而查流表失败时,会发送消息询问控制器,由控制器进行决策该如何转发,并计算、下发相应的流表。被动模式的好处是交换机无需维护全部的流表,只有当实际的流量产生时才向控制器获取流表记录并存储,当老化定时器超时后可以删除相应的流表,因此可以大大节省交换机芯片空间。

第七章 OVS(OpenvSwitch)

一、OVS介绍

Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。

Open vswitch的架构图如下所示:

数据流向:

1、内核态的 Datapath 监听接口设备流入的数据包。

2、如果 Datapath 在内核态流表缓存没有找到相应的匹配流表项则将数据包传入 (upcall)到用户态的 ovs-vswitchd 守护进程处理。

3、(可选)用户态的 ovs-vswitchd 拥有完整的流表项,通过 OpenFlow 协议与 OpenFlow 控制器或者 ovs-ofctl 命令行工具进行通信, 主要是接收 OpenFlow 控制器南向接口的流表项下发。或者根据流表项设置, ovs-vswitchd 可能会将网络包以 Packet-In 消息发送给 OpenFlow 控制器处理。

4、ovs-vswitchd 接收到来自 OpenFlow 控制器或 ovs-ofctl 命令行工具的消息后 会对内核态的 Flow Table 进行更新。或者根据局部性原理, 用户态的 ovs-vswitchd 会将刚执行过的 Datapath 没有缓存的流表项注入到Flow Table

5、ovs-vswitchd 匹配完流表项之后将数据包重新注入(reinject)到 Datapath。

6、Datapath 再次访问 Flow Table 获取流表项进行匹配。

7、最后,网络包被 Datapath 根据流表项 Actions 转发或丢弃。

二、OpenvSwitch的组成

1、OVS内核空间(包含Datapath和流表)

Datapath:主要负责实际的数据分组处理,把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。它同时与vswitchd和流表保持关联,使OVS上层可以对数据分组处理进行控制。

流表:流表中存储着分组处理的依据--流表项,每个Datapath 都和一个流表关联,当Datapath接收到数据之后,OVS会在流表中查找可以匹配的 flow(流表项),执行对应的操作,例如转发数据到另外的端口。同时还与vswitchd进程上下关联,是OVS上层对底层分组处理过程进行管理的接口。

2、OVS用户空间(vswitchd和ovsdb)

vswitchd:守护程序,实现交换功能,和Linux内核模块一起,实现基于流的交换flow-based switching,负责检索和更新数据库信息,并根据数据库中的配置信息维护和管理OVS。Vswitchd可以配置一些列特性:基于MAC地址学习的二层交换、支持IEEE 802.1Q VLAN 、端口镜像、sFlow监测、连接OpenFlow控制器等。Vswitchd也可以通过Netlink协议与内核模块Datapath直接通信。

ovsdb-server:轻量级的数据库服务,主要保存了整个OVS的配置信息和数据流信息,ovsdb-server直接管理ovsdb,与ovsdb通信进行数据库的增删改查操作。Vswitchd可以通过socket与ovsdb-server进行通信,用于查询和更新数据库信息,或者在检索数据库信息后做出首个数据包的转发策略。

3、OVS管理工具

ovs-dpctl:管理OVS Datapath的实用工具,用来配置交换机内核模块,控制数据包的转发规则。可以创建、修改和删除Datapath。

ovs-vsctl:查询和配置OVS数据库的实用工具,用于查询或修改vswitchd的配置信息,该工具会直接更新ovsdb数据库。

ovs-appctl:主要是向OVS守护进程发送命令的工具,一般用不上。

ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时的各种参数,它是OVS提供的命令行工具。在没有配置 OpenFlow控制器的模式下,用户可以使用 ovs-ofctl命令通过 OpenFlow协议去连接 OVS,创建、修改或删除 OVS中的流表项,并对 OVS的运行状况进行动态监控。

ovs-pki:OpenFlow交换机创建和管理公钥框架。

ovs-tcpundump:tcpdump的补丁,解析 OpenFlow的消息。

三、OVS常用工具

1、ovs-vsctl

ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具,高级是说其操作对用户友好,封装了对数据库的操作细节。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成。

#添加网桥br0

ovs-vsctl add-br br0

#列出所有网桥

ovs-vsctl list-br

#添加一个Port p1到网桥br0

ovs-vsctl add-port br0 p1

#查看网桥br0上所有Port

ovs-vsctl list-ports br0

#获取br0网桥的OpenFlow控制器地址,没有控制器则返回空

ovs-vsctl get-controller br0

#设置OpenFlow控制器,控制器地址为192.168.1.10,端口为6633

ovs-vsctl set-controller br0 tcp:192.168.1.10:6633

#移除controller

ovs-vsctl del-controller br0

#删除网桥br0

ovs-vsctl del-br br0

#设置端口p1的vlan tag为100

ovs-vsctl set Port p1 tag=100

#设置Port p0类型为internal

ovs-vsctl set Interface p0 type=internal

#添加vlan10端口,并设置vlan tag为10,Port类型为Internal

ovs-vsctl add-port br0 vlan10 tag=10 -- set Interface vlan10 type=internal

#添加隧道端口gre0,类型为gre,远端IP为1.2.3.4

ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre options:remote_ip=1.2.3.4

#设置VLAN mode

ovs-vsctl set port <port name> VLAN_mode=trunk|access|native-tagged|native-untagged

#设置VLAN tag

ovs-vsctl set port <port name> tag=<tag 值>

#设置VLAN trunk

ovs-vsctl set port <port name> trunk=100,200

#删除port 的配置

ovs-vsctl remove port <port name> <config item> <config value>

#例如

ovs-vsctl remove port <port name> tag 100

ovs-vsctl remove port <port name> trunk 200

#查看port 的属性

ovs-vsctl list interface <port name>

2、ovs-ofctl

ovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,我们可以用它手动配置OVS中的OpenFlow flows,注意其不能操作datapath flows和“hidden” flows。

#查看br-tun中OpenFlow flows

ovs-ofctl dump-flows br-tun

#查看br-tun端口信息

ovs-ofctl show br-tun

#添加新的flow:对于从端口p0进入交换机的数据包,如果它不包含任何VLAN tag,则自动为它添加VLAN tag 101

ovs-ofctl add-flow br0 "priority=3,in_port=100,dl_vlan=0xffff,actions=mod_vlan_vid:101,normal"

#对于从端口3进入的数据包,若其vlan tag为100,去掉其vlan tag,并从端口1发出

ovs-ofctl add-flow br0 in_port=3,dl_vlan=101,actions=strip_vlan,output:1

#添加新的flow: 修改从端口p1收到的数据包的源地址为9.181.137.1,show 查看p1端口ID为100

ovs-ofctl add-flow br0 "priority=1 idle_timeout=0,in_port=100,actions=mod_nw_src:9.181.137.1,normal"

#添加新的flow: 重定向所有的ICMP数据包到端口 p2

ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102

#删除编号为 100 的端口上的所有流表项

ovs-ofctl del-flows br0 "in_port=100"

3、ovsdb-client

ovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库相关。

#列出主机上的所有databases,默认只有一个库Open_vSwitch

ovsdb-client list-dbs

#获取指定数据库的schema信息

ovsdb-client get-schema [DATABASE]

#列出指定数据库的所有表

ovsdb-client list-tables [DATABASE]

#dump指定数据库所有数据,默认dump所有table数据,如果指定table,只dump指定table数据

ovsdb-client dump [DATABASE] [TABLE]

#监控指定数据库中的指定表记录改变

ovsdb-client monitor DATABASE TABLE

4、ovsdb-tool

ovsdb-tool是一个专门管理OVS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信。

#可以使用此工具创建并初始化database文件

ovsdb-tool create [db] [schema]

#可以使用ovsdb-client get-schema [database]获取某个数据库的schema(json格式)

#可以查看数据库更改记录,具体到操作命令,这个比较有用

ovsdb-tool show-log -m

record 48: 2017-01-07 03:34:15.147 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tapcea211ae-10"

        table Interface row "tapcea211ae-10" (151f66b6):

                delete row

        table Port row "tapcea211ae-10" (cc9898cd):

                delete row

        table Bridge row "br-int" (fddd5e27):

        table Open_vSwitch row a9fc1666 (a9fc1666):

record 49: 2017-01-07 04:18:23.671 "ovs-vsctl: ovs-vsctl --timeout=5 -- --if-exists del-port tap5b4345ea-d5 -- add-port br-int tap5b4345ea-d5 -- set Interface tap5b4345ea-d5 "external-ids:attached-mac=\"fa:16:3e:50:1b:5b\"" -- set Interface tap5b4345ea-d5 "external-ids:iface-id=\"5b4345ea-d5ea-4285-be99-0e4cadf1600a\"" -- set Interface tap5b4345ea-d5 "external-ids:vm-id=\"0aa2d71e-9b41-4c88-9038-e4d042b6502a\"" -- set Interface tap5b4345ea-d5 external-ids:iface-status=active"

        table Port insert row "tap5b4345ea-d5" (4befd532):

        table Interface insert row "tap5b4345ea-d5" (b8a5e830):

        table Bridge row "br-int" (fddd5e27):

        table Open_vSwitch row a9fc1666 (a9fc1666):

第八章 使用OVS桥实现不同NetworkNamespace之间的通信

环境结构图:

配置实现:

1、创建网桥br-int 和 namespace

ovs-vsctl add-br br-int

ip netns add ns01

ip netns add ns02

ip netns add router-ns1

2、创建veth对口,连接网桥和namespace

1)创建veth口

ip link add veth01 type veth peer name veth02

ip link add veth03 type veth peer name veth04

ip link add veth05 type veth peer name veth06

ip link add veth07 type veth peer name veth08

2)连接namespace

ip link set veth01 netns ns01

ip link set veth03 netns router-ns1

ip link set veth05 netns router-ns1

ip link set veth07 netns ns02

3)连接网桥并启用端口

ovs-vsctl add-port br-int veth02

ifconfig veth02 up

ovs-vsctl add-port br-int veth04

ifconfig veth04 up

ovs-vsctl add-port br-int veth06

ifconfig veth06 up

ovs-vsctl add-port br-int veth08

ifconfig veth08 up

3、配置namespace里的端口地址

ip netns exec ns01 ifconfig veth01 192.168.10.100/24 up

ip netns exec router-ns1 ifconfig veth03 192.168.10.1/24 up

ip netns exec router-ns1 ifconfig veth05 192.168.11.1/24 up

ip netns exec ns02 ifconfig veth07 192.168.11.110/24 up

4、配置router转发

ip netns exec router-ns1 sysctl -w net.ipv4.ip_forward=1

5、配置ns01与ns02到达对端路由

ip netns exec ns01 route add -net default gw 192.168.10.1 dev veth01

ip netns exec ns02 route add -net default gw 192.168.11.1 dev veth07

6、设置br-int网桥内部vlan隔离

ovs-vsctl set Port veth02 tag=3

ovs-vsctl set Port veth04 tag=3

ovs-vsctl set Port veth06 tag=4

ovs-vsctl set Port veth08 tag=4

实验Ping结果图:

网桥信息查看:

tag:access口,内部的vlan值,同一vlan的网口数据进行转发。

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值