Linux虚拟网络之veth设备

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设备实现了两个容器之间的通信。

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