Linux虚拟网络之BRIDGE设备

Bridge是工作在二层的虚拟网络设备,功能类似于物理交换机。
下面创建三个Network Namespace,然后创建三对VETH设备,VETH设备的一端在Network Namespace中,另一端连接到Bridge上。通过Bridge实现任意两个容器之间的通信,示意图如下:

+-----------+      +-----------+      +-----------+
|   ns1     |      |   ns2     |      |   ns3     |
|           |      |           |      |           |
| +-------+ |      | +-------+ |      | +-------+ |
| |veth1-1| |      | |veth2-1| |      | |veth3-1| |
| +-------+ |      | +-------+ |      | +-------+ |
|     ^     |      |     ^     |      |     ^     |
+-----|-----+      +-----|-----+      +-----|-----+
      |                  |                  |
+-----|------------------|------------------|-----+
|     v                  v                  v     |
| +-------+          +-------+          +-------+ |
| |veth1-2|          |veth2-2|          |veth3-2| |
| +-------+          +-------+          +-------+ |
|     ^                  ^                  ^     |
|     |                  |                  |     |
|     +------------------+------------------+     |
+-------------------------------------------------+

首先,创建并启动brctl设备,命令如下:

yehanlin@scratchlab$ sudo ip link add name br1 type bridge
yehanlin@scratchlab$ sudo ip link set br1 up

然后,创建3个Network Namespace,命令如下:

yehanlin@scratchlab$ sudo ip netns add ns1
yehanlin@scratchlab$ sudo ip netns add ns2
yehanlin@scratchlab$ sudo ip netns add ns3

然后,创建3对VETH设备,命令如下:

yehanlin@scratchlab$ sudo ip link add veth1-1 type veth peer name veth1-2
yehanlin@scratchlab$ sudo ip link add veth2-1 type veth peer name veth2-2
yehanlin@scratchlab$ sudo ip link add veth3-1 type veth peer name veth3-2

然后,将名为vethN-1的设备分别放入对应的Network Namespace nsN中,命令如下:

yehanlin@scratchlab$ sudo ip link set veth1-1 netns ns1
yehanlin@scratchlab$ sudo ip link set veth2-1 netns ns2
yehanlin@scratchlab$ sudo ip link set veth3-1 netns ns3

然后,启动名为vethN-2的设备,并将其连接到br1上,命令如下:

 yehanlin@scratchlab$ sudo ip link set dev veth1-2 master br1
 yehanlin@scratchlab$ sudo ip link set dev veth2-2 master br1
 yehanlin@scratchlab$ sudo ip link set dev veth3-2 master br1
 yehanlin@scratchlab$ sudo ip link set dev veth1-2 up
 yehanlin@scratchlab$ sudo ip link set dev veth2-2 up
 yehanlin@scratchlab$ sudo ip link set dev veth3-2 up

现在,启动三个终端,分别运行以下命令以在ns1、ns2、ns3下运行Shell,命令及结果如下:

yehanlin@scratchlab:~$ sudo ip netns exec ns1 /bin/bash
root@scratchlab:~# 

yehanlin@scratchlab:~$ sudo ip netns exec ns2 /bin/bash
root@scratchlab:~#

yehanlin@scratchlab:~$ sudo ip netns exec ns3 /bin/bash
root@scratchlab:~#

在第一个终端中设置veth1的地址,并启动该设备,命令如下:

root@scratchlab:~# ip address add 192.168.5.101/24 dev veth1-1
root@scratchlab:~# ip link set dev veth1-1 up

在第二个终端中设置veth2的地址,并启动该设备,命令如下:

root@scratchlab:~# ip address add 192.168.5.102/24 dev veth2-1
root@scratchlab:~# ip link set dev veth2-1 up

在第三个终端中设置veth3的地址,并启动该设备,命令如下:

root@scratchlab:~# ip address add 192.168.5.103/24 dev veth3-1
root@scratchlab:~# ip link set dev veth3-1 up

现在,三个容器就可以互相ping通了。如果无法ping通,请在Host上执行以下指令,然后再试。

yehanlin@scratchlab$ sudo sh -c "echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables"

你可能感兴趣的:(网络)