OpenStack虚拟化网络实现中大量应用了多种虚拟网络设备,了解这些设备是理解OpenStack虚拟网络实现的基础,本文来简单介绍这些虚拟网络设备。
TUN/TAP设备
TUN/TAP设备是linux内核中实现的虚拟网卡。物理网卡是从物理线路上收发数据包,而TUN/TAP设备是从用户态应用程序上收发以太网帧或IP包。用户态进程对 /dev/net/tun 文件调用 open() 获取一个文件描述符,并调用 ioctl() 挂接到该设备上,接着通过读写该文件描述符从TUN/TAP设备的收发数据包。收发的数据包由用户态进程构造好。TUN和TAP设备的区别在于TUN设备收发的是IP包,而TAP设备收发的是以太网帧。
在进程中创建及使用TUN/TAP设备可以参考官方文档: https://www.kernel.org/doc/Documentation/networking/tuntap.txt
可以使用iproute2工具包中的ip命令创建TUN/TAP设备, 如:
ip tuntap add dev tap0 mode tap ip tuntap add dev tun0 mode tun
通过 ip link 命令可以看到设备已经创建:
[root@compute1 ~]# ip link show tap0 23: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500 link/ether a6:73:4e:90:f9:3e brd ff:ff:ff:ff:ff:ff [root@compute1 ~]# ip link show tun0 24: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500 link/none
设备创建完成后可以和物理设备一样对TAP进行配置IP地址等操作,如:
[root@compute1 ~]# ip addr add 192.168.1.2/24 dev tap0 [root@compute1 ~]# ip link set dev tap0 up [root@compute1 ~]# ip addr list dev tap0 23: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 500 link/ether 36:f2:68:6a:fd:6d brd ff:ff:ff:ff:ff:ff inet 192.168.1.2/24 scope global tap0 valid_lft forever preferred_lft forever
删除已创建的设备:
ip tuntap del dev tap0 mode tap ip tuntap del dev tun0 mode tun
Linux bridge
Linux bridge是虚拟二层交换设备, 它基于MAC地址对数据包在bridge的port间进行转发。物理网卡和TAP等虚拟网络设备都可以连接到Linux bridge上。
可以使用 brctl 工具或 iproute2 工具包中的ip命令操作Linux bridge
创建bridge
brctl addbr br0
添加设备到bridge
brctl addif br0 eth0
显示bridge
brctl show
启动bridge
ip link set dev br0 up
停止bridge
ip link set dev br0 down
删除bridge
brctl delbr br0
使用IP命令操作bridge:
创建bridge并启动
ip link add name br0 type bridge ip link set dev br0 up
先将该端口设置为混杂模式并启动该接口
ip link set dev eth0 promisc on ip link set dev eth0 up
将接口添加到bridge
ip link set dev eth0 master br0
若要删除网桥,应首先移除它所关联的所有接口,同时关闭接口的混杂模式并关闭接口以将其恢复至原始状态。
ip link set dev eth0 promisc off ip link set dev eth0 down ip link set dev eth0 nomaster
删除bridge
ip link delete br0 type bridge
OVS: Open vSwitch
官网: http://openvswitch.org
OVS是一个产品级别的开源虚拟交换机。相较于Linux bridge, 它提供了各多的功能特性和自动化的编程支持。OVS使用OPENFLOW协议的流表来控制转发逻辑。
一些简单的操作:
创建bridge
ovs-vsctl add-br ovsbr0
查看bridge
ovs-vsctl show
添加Port, 并设置VLAN ID为2:
ovs-vsctl add-port ovsbr0 tap1 tag=2
删除Port
ovs-vsctl del-port ovsbr0 tap1
删除bridge
ovs-vsctl del-br ovsbr0
network namespace
一般情况下,Linux的网络接口,路由表、协议栈、iptables规则等资源由操作系统的全部进程共享。通过使用netowrk namespace, 可以将这些网络资源隔离开,只由namespace内的进程共享。
namespace示例:
创建namespace
ip netns add ns1
查看namespace
ip netns list
将设备添加进namespace,这样在全局的环境下,该设备不再可见
ip link set dev tap1 netns ns1
查看namespace内设备
ip netns exec ns1 ip link list
可以直接在namespace中执行bash, 再统一对namespace内的设备进行处理
ip netns exec ns1 bash
删除namespace
ip netns del ns1
veth pair
Virtual Ethernet Pair简称veth pair, 是一对逻辑相连的端口或网络接口。从其中一个端口进入的数据包将从另一端口流出。可以使用veth pair设备来连接Linux bridge或者OVS的bridge,也可以通过veth pair将两个network namespace连接起来。
创建veth pair:
ip link add dev veth0 type veth peer name veth1
查看创建的veth pair:
[root@compute1 ~]# ip link list ... 29: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether f6:eb:23:3b:f1:5b brd ff:ff:ff:ff:ff:ff 30: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ba:8d:1c:cf:04:a0 brd ff:ff:ff:ff:ff:ff
从输出可以看到对应的接口设备的名称。
以下示例将veth pair的两个接口分别添加到两个namespace中,从而将两个namespace连接起来。
ip netns add ns1 ip netns add ns2 ip link set veth0 netns ns1 ip link set veth1 netns ns2 ip netns exec ns1 ip link set dev veth0 up ip netns exec ns2 ip likn set dev veth1 up