如下图所示,在上一篇文章Linux虚拟网络设备—之Veth pair详解中,我们介绍了如何通过veth pair连接二个namespaces。
但在通常的配置中,一般来说一个物理主机上会存在很多个namespaces,如果要用veth pair直接连接的话,每二个需要相互通信的namespaces之间都需要一对veth pair连接,会连接成蜘蛛网。和物理网络中的多台主机连接的解决方案(交换机+网线构成星形连接)一样,我们会用linux bridge + veth pair的方式来构建一个星形连接的网络解决问题多点通信问题(如下图所示)。如下所示,我们会在Linux主机里建立一个网桥br0,并将主机的enp2s0网卡加入这个网桥,做为网桥的一个端口,另外一台Linnux主机通过enp2s0连接到主机,然后ns0通过veth0-vethbr0连接到br0,ns1通过veth1-vethbr1连接到br0。
在开始连接namespaces之前,我们可参照文章Linux网桥简介、入门与配置在物理主机中创建好Linux bridge网桥。
创建veth0—vethbr0,veth1—vethbr1,veth2—vethbr2,veth3—vethbr3,veth4—vethbr4的五对虚拟以太网设备对。
sudo ip link add veth0 type veth peer name vethbr0
sudo ip link add veth1 type veth peer name vethbr1
sudo ip link add veth2 type veth peer name vethbr2
sudo ip link add veth3 type veth peer name vethbr3
sudo ip link add veth4 type veth peer name vethbr4
创建ns0、ns1、ns2、ns3、ns4五个namespaces命名空间,并将veth0设置为ns0的网卡,将veth1设置为ns1的网卡,依据此类推。
sudo ip netns add ns0
sudo ip netns add ns1
sudo ip netns add ns2
sudo ip netns add ns3
sudo ip netns add ns4
sudo ip link set veth0 netns ns0
sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2
sudo ip link set veth3 netns ns3
sudo ip link set veth4 netns ns4
sudo ip netns exec ns0 ip link set veth0 up
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns2 ip link set veth2 up
sudo ip netns exec ns3 ip link set veth3 up
sudo ip netns exec ns4 ip link set veth4 up
sudo ip link set vethbr0 up
sudo ip link set vethbr1 up
sudo ip link set vethbr2 up
sudo ip link set vethbr3 up
sudo ip link set vethbr4 up
sudo brctl addif br0 vethbr0
sudo brctl addif br0 vethbr1
sudo brctl addif br0 vethbr2
sudo brctl addif br0 vethbr3
sudo brctl addif br0 vethbr4
使用ip netns exec ns0 + 要执行的命令的形式,在ns0内执行指定的命令,如下是执行ip link show命令,来查看ns0里的网络链路情况。
sudo ip netns exec ns0 ip link show
sudo ip netns exec ns1 ip link show
sudo ip netns exec ns2 ip link show
sudo ip netns exec ns3 ip link show
sudo ip netns exec ns4 ip link show
使用ip netns exec ns0 + 要执行的命令的形式,在ns0内执行指定的命令,如下是执行ip addr add命令,来给ns0里的veth0配置IP地址。同时相应的操作ns1。配置完成后,ns0和ns1下会自动产生默认路由。
sudo ip netns exec ns0 ip addr add 192.168.0.2/24 dev veth0
sudo ip netns exec ns1 ip addr add 192.168.0.3/24 dev veth1
sudo ip netns exec ns2 ip addr add 192.168.0.4/24 dev veth2
sudo ip netns exec ns3 ip addr add 192.168.0.5/24 dev veth3
sudo ip netns exec ns4 ip addr add 192.168.0.6/24 dev veth4
我们可以看到ns0里的veth0网卡的ip地址是192.168.0.2, ns1里的veth1网卡的ip地址是192.168.0.3,ns0和ns1二个命名空间里都产生了默认的路由。
sudo ip netns exec ns0 ip addr show
sudo ip netns exec ns1 ip addr show
sudo ip netns exec ns2 ip addr show
sudo ip netns exec ns3 ip addr show
sudo ip netns exec ns4 ip addr show
sudo ip netns exec ns0 ip route show
sudo ip netns exec ns1 ip route show
sudo ip netns exec ns2 ip route show
sudo ip netns exec ns3 ip route show
sudo ip netns exec ns4 ip route show
使用ip netns exec ns3 + 要执行的命令的形式,在ns3内执行指定的命令,如下是执行ping命令,来检查ns3和ns4之间ip网络的联通性。
xxx@xx-PC:~$ sudo ip netns exec ns3 ping 192.168.0.6
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.030 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.050 ms
使用ip netns exec ns3 + 要执行的命令的形式,在ns3内执行指定的命令,如下是执行ping命令,来检查ns3和连接到enps20网卡的外部主机192.168.3.1之间ip网络的联通性。
sudo ip netns exec ns3 ip route add default dev veth3
xxx@xx-PC:~$ sudo ip netns exec ns3 ip route show
default dev veth3 scope link
192.168.0.0/24 dev veth3 proto kernel scope link src 192.168.0.5
xxx@xx-PC:~$ sudo ip netns exec ns3 ping 192.168.3.1
PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data.
64 bytes from 192.168.3.1: icmp_seq=1 ttl=64 time=2.22 ms
64 bytes from 192.168.3.1: icmp_seq=2 ttl=64 time=2.33 ms
64 bytes from 192.168.3.1: icmp_seq=3 ttl=64 time=2.01 ms