VETH是一对网络设备,一个设备收到的数据会发送到另一个设备上去,VETH设备通常用于容器之间的通信。
下面创建两个Network Namespace,然后创建一对VETH设备,然后将两个VETH设备分别加入ns1和ns2,通过VETH实现两个Network Namespace之间的通信,示意图如下:
+---------+ +---------+
| ns1 | | ns2 |
| | | |
| +-----+ | | +-----+ |
| |veth1| | | |veth2| |
| +-----+ | | +-----+ |
| ^ | | ^ |
+----|----+ +----|----+
| |
+----------------+
首先,创建两个Network Namespace,命令如下:
yehanlin@scratchlab:~$ sudo ip netns add ns1
yehanlin@scratchlab:~$ sudo ip netns add ns2
然后,创建一对VETH设备,命令如下:
yehanlin@scratchlab:~$ sudo ip link add veth1 type veth peer name veth2
该命令创建了一对VETH设备,一个名为veth1,另一个名为veth2。查看这两个设备,命令及结果如下:
yehanlin@scratchlab:~$ ip link show
...
4: veth2@veth1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether c6:88:07:eb:05:1e brd ff:ff:ff:ff:ff:ff
5: veth1@veth2: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 3a:80:2d:c9:96:c9 brd ff:ff:ff:ff:ff:ff
然后,将veth1加入ns1,veth2加入ns2,命令如下:
yehanlin@scratchlab:~$ sudo ip link set veth1 netns ns1
yehanlin@scratchlab:~$ sudo ip link set veth2 netns ns2
该命令用于将设备加入某个Network Namespace。查看一下全局Network Namespace、ns1、ns2中的网络设备,命令及结果如下:
yehanlin@scratchlab:~$ ip link show
...
yehanlin@scratchlab:~$ sudo ip netns exec ns1 ip link show
1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: veth1@if4: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 3a:80:2d:c9:96:c9 brd ff:ff:ff:ff:ff:ff link-netnsid 1
yehanlin@scratchlab:~$ sudo ip netns exec ns2 ip link show
1: lo: mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: veth2@if5: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether c6:88:07:eb:05:1e brd ff:ff:ff:ff:ff:ff link-netnsid 0
现在,启动两个终端,分别运行以下命令以在ns1和ns2下运行Shell,命令及结果如下:
yehanlin@scratchlab:~$ sudo ip netns exec ns1 /bin/bash
root@scratchlab:~#
yehanlin@scratchlab:~$ sudo ip netns exec ns2 /bin/bash
root@scratchlab:~#
在第一个终端中设置veth1的地址,并启动该设备,然后启动一个TCP服务器,命令如下:
root@scratchlab:~# ip address add 192.168.5.101/24 dev veth1
root@scratchlab:~# ip link set dev veth1 up
root@scratchlab:~# netcat -l 192.168.5.101 10000
在第二个终端中设置veth2的地址,并启动该设备,然后启动一个TCP客户端,并连接到刚启动的TCP服务器,命令及结果如下:
root@scratchlab:~# ip address add 192.168.5.102/24 dev veth2
root@scratchlab:~# ip link set dev veth2 up
root@scratchlab:~# netcat 192.168.5.101 10000
在一个终端输入内容,另一个终端皆可收到。这样就利用VETH设备实现了两个容器之间的通信。