• 什么是虚拟网络设备呢?


    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

  • 相关阅读:
    C# 中的var关键字
    sql中去掉换行符和回车符
    Linq之旅:Linq入门详解(Linq to Objects)
    c# for 和 foreach
    c# Dictionary
    ASP.NET Web.config学习
    c# 装箱与拆箱的概念
    c# List集合学习
    Index was out of range
    C# double保留四位小数
  • 原文地址:https://www.cnblogs.com/2881064178dinfeng/p/6165492.html
Copyright © 2020-2023  润新知