namespace
前言
namespace是Linux虚拟网络的一个重要概念,传统的Linux的许多资源是全局的,如果进程id资源。而namespace的目的首先就是讲这些资源做资源隔离。Linux可以在一个Host内创建许多namespace,于是那些原本是linux的全局资源,就变成了namespace范围内的“全局”资源,而且不同namespace的资源相互不可见,彼此透明。
Linux namespace 可以隔离的资源有:uts_ns(内存、版本等底层信息)、ipc_ns(所有与进程通信的信息)、 mnt_ns(当前装载的文件系统)、 pid_ns(有关进程id的信息)、 user_ns(资源配额的信息)、 net_ns(网络信息)。
一个设备(Linux Device)只能位于一个namespace中,不同namespace中的设备可以利用veth pair进行桥接。
命令实操
Linux 操作namespace的命令是ip netns。
# ip netns help
首先创建一个namespace:
# ip netns list
# ip netns add ns_test
当创建一个namespace后,就可以将一些虚拟设备迁移到这个namespace中去了,比如上一篇中介绍的tap。
# tunctl -t tap_test
# ip addr add local 10.0.0.190/24 dev tap_test
# ip a show
创建namespace后,将前面创建的tap_test迁移到这个namespace中。
迁移之后,在外直接 ip a s 已经看不到这个虚拟设备了
# ip link set tap_test netns ns_test
# ip netns exec ns_test ip a s
veth pair
前言
veth pair 不是一个设备,而是一对设备,以连接两个虚拟以太端口。操作veth pair,需要跟namespace一起配合,不然就没有意义。
简单的拓扑图:
两个namespace ns1/ns2 中各有一个tap组成veth pair,两个tap 上配置的ip进行互ping。
命令实操
创建 veth pair:
# ip link add tap1 type veth peer name tap2
# ip a s
创建namespace,并将tap迁移至namespace中:
# ip netns add ns1
# ip netns add ns2
# ip link set tap1 netns ns1
# ip link set tap2 netns ns2
# ip netns exec ns1 ip addr add local 192.168.10.200/24 dev tap1
# ip netns exec ns2 ip addr add local 192.168.10.201/24 dev tap2
# ip netns exec ns1 ifconfig tap1 up
# ip netns exec ns2 ifconfig tap2 up
根据ip进行ping操作,验证连通性:
# ip netns exec ns1 ping 192.168.10.201
通过以上的测试用例,可以了解通过veth pair连接两个namespace的方法。
下面就要依靠Bridge/Switch 实现三个或多个namespace进行互通。
Bridge
前言
在Linux的语境中,Bridge和Switch是一个概念。Bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;Bridge是一个虚拟交换机,和物理交换机有类似的功能。对于普通的网络设备来说,只有两端,从一端进来的数据会从另一端出去,如物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。 而Bridge不同,Bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多,要看mac地址。
命令实操
Linux实现Bridge功能是brctl模块。可以直接在命令行上查看,如果没有回显的话,可直接使用yum进行安装。
# yum -y install bridge-utils
根据如下拓扑图,我们模拟创建相应的虚拟网络设备,进行实现:
命令操作:
# ip link add tap1 type veth peer name tap1_peer
# ip link add tap2 type veth peer name tap2_peer
# ip link add tap3 type veth peer name tap3_peer
# ip link add tap4 type veth peer name tap4_peer
创建namespace:
将设备迁移至namespace:
创建 Bridge,并tap 添加到 Bridge中:
# brctl addbr br1
# ip a s | grep br1
# brctl addif br1 tap1_peer
配置 tap 对应的ip地址:
# ip netns exec ns1 ip addr add local 192.168.10.200/24 dev tap1
将 Bridge 以及所有 tap 状态设置为 up:
# ip link set br1 up
# ip link set tap1_peer up
# ip netns exec ns1 ip link set tap1 up
相互进行ip 互ping ,验证网络连通: