您现在的位置是:首页 >学无止境 >Linux虚拟网络设备---之使用Veth pair连接linux网桥bridge网站首页学无止境
Linux虚拟网络设备---之使用Veth pair连接linux网桥bridge
本文目录
如下图所示,在上一篇文章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网桥。
1、我们可以用以下命令来创建veth pair: veth0----veth1
创建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
2、创建五个命名空间namespaces后,可以用以下命令将veth设备对的一端移入namespaces命名空间,并开启veth
创建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
2、将veth设备对的另外一端连接到linux网桥,并将所有namespaces命名空间和Linux bridge网桥连接起来,并开启veth
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
3、查看五个命名空间内的veth
使用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
4、配置五个命名空间内的网络
使用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
5、查看ns0和ns1的ip地址和路由
我们可以看到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
6、验证ns3和ns4之间的网络连通性
使用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
7、验证ns3和外部物理主机之间的网络连通性
使用ip netns exec ns3 + 要执行的命令的形式,在ns3内执行指定的命令,如下是执行ping命令,来检查ns3和连接到enps20网卡的外部主机192.168.3.1之间ip网络的联通性。
- 先添加默认路由
sudo ip netns exec ns3 ip route add default dev veth3
- 查看ns3的路由配置,可见到发往192.168.3.1的报文会通过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
- 检查连接性:
我们在对端通过enp2s0连接到网桥br0的主机上配置将发往192.168.0.5(ns3)的路由后,在用以下命令在ns3里发起ping测试。
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