本文通过linux网络虚拟化的基础功能NameSpace、veth pair、bridge、tap实现一个路由器的最小模型,从而实现云计算环境下处于不同网段的虚拟机可以跨网段互通。

虚拟网卡Tun/tap驱动是一个开源项目,tap表示虚拟的是以太网设备,在 Linux 中通常使用 tap设备来实现虚拟网卡,使用 Linux Bridge 来实现虚拟交换机。

Network NameSpace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,每个 Network Namespace 有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。

一个网络设备只能位于一个Network NameSpace中,而位于不同NameSpace中的设备可以通过veth pair进行通讯,veth pair 就是一对的虚拟设备,从一 端进入的数据包都将从另一端出来,通常在两个NameSpace 之间充当桥梁作用。

在实践之前先基于物理网卡创建一个网桥,这里取网桥名为br_mgmt。

创建一个Namespace

# ip netns add ns_router

创建一对veth pair的tap设备,并把一端放入ns_router中,把另一端加入网桥br_mgmt

创建tap0_router和tap0_peer
# ip link add tap0_router type veth peer name tap0_peer
把tap0_router放入ns_router
# ip link set tap0_router netns ns_router
把tap0_peer加入网桥
# brctl addif br_mgmt tap0_peer

创建另一对veth pair的tap设备,并把一端放入ns_router中,把另一端加入网桥br_mgmt

建tap1_router和tap1_peer
# ip link add tap1_router type veth peer name tap1_peer
把tap1_router放入ns_router
# ip link set tap1_router netns ns_router
把tap1_peer加入网桥
# brctl addif br_mgmt tap1_peer

将四个tap设备UP

# ifconfig tap0_peer up
# ifconfig tap1_peer up
# ip netns exec ns_router ifconfig tap0_router up
# ip netns exec ns_router ifconfig tap1_router up

在ns_router中设置ip作为两个网段的网关

# ip netns exec ns_router ip addr add local 192.168.0.1/24 dev tap0_router
# ip netns exec ns_router ip addr add local 192.168.1.1/24 dev tap1_router

后面虚拟机使用192.168.0.1/24这个网段和192.168.1.1/24这个网段,并把192.168.0.1和192.168.1.1作为各自网段的网关。在网桥br_mgmt上创建虚拟机,在上面192.168.0.1/24和192.168.1.1/24这两个网段内的虚拟机可以跨网段通信。

整个系统的网络拓扑图如下:

namespace 虚拟路由器 虚拟路由器技术_linux

这里虚拟机192.168.0.88和虚拟机192.168.1.88之间是可以相互通讯的。

查看ns_router内部的路由表:

# ip netns exec ns_router route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 tap0_router
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 tap1_router

可以看到NameSpace ns_router充当了两个网段的路由角色。但是这个架构还不能实现VLAN网络隔离和内网路由到外网以及分布式路由的功能。