本文通过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这两个网段内的虚拟机可以跨网段通信。
整个系统的网络拓扑图如下:
这里虚拟机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网络隔离和内网路由到外网以及分布式路由的功能。