【摘要】 学习Veth-pair的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。

1      什么是Veth-Pair

Veth是Linux中一种虚拟出来的网络设备,veth设备总是成对出现,所以一般也叫veth-pair。其作用是反转数据流方向。

image.png

例如:如果v-a和v-b是一对veth设备,v-a收到的数据会从v-b发出。相反,v-b收到的数据会从v-a发出。其实说白了,Veth就是一根“网线”,你从一头发数据,当然就从另一头收到数据了。网线的作用不就是这个么,veth也一样,把数据通过一头“复制”到另一头。

image.png

由于veth的“网线”特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。常见用途是连接两个netwok namespace,或者连接Linux-Bridge、OVS 之类的。

image.png

Ps:veth的2头都直接连着网络协议栈,所以你创建一个veth对,主机上就会多2个网卡。

2      实战演练

现在用我们之前学过的 ip netns 命令来操作 一下我们创建的网络空间。

操作ns相关的输入格式为:

ip netns exec 【哪个命名空间】 【具体要执行的命令】

2.1      首先创造新空间

ip netns add tsj

这样就创造了一个新的“网络空间”,可以通过

ip netns list

命令查看,确实有了一个新的ns空间了:

tsj

image.png

但是这个时候,咱们还缺少与这个空间进行交互的通道,光有空间,没有入口。

2.2      然后创造网线

接着让我们来创造一根Veth牌网线:

命令格式是:ip link add 【网线一头名字】 type veth peer name 【网线另一头名字】

所以如下:

ip link add tsj-0 type veth peer name tsj-1

image.png

2.3      网线生效

ifconfig tsj-0 up

ifconfig tsj-1 up

(或者:ip link set tsj-0 up,看过以前的ip命令课程的,就知道这2种命令效果是一样的)

这个时候可以通过ifconfig看到这2个网卡了。

image.png

2.4      网线一头伸入到新建的空间

使用以下命令:

ip link set tsj-1 netns tsj

将“tsj-1”的网线头子,放入“tsj”这个虚拟空间中。

注意,网线还有一头“tsj-0”仍然在Host主机空间中的。

image.png

2.5      把网卡命名为 eth0

重命名网卡:

ip netns exec tsj ip link set tsj-1 name eth0

然后把这个网线头子生效一下:

ip netns exec tsj ip link set eth0 up

ip netns exec tsj ip link set lo up(顺便把local网卡也生效了)

查询结果,可以看到新建的虚拟网络空间里面,有一种比较熟悉的感觉。

image.png

image.png

2.6      给网卡设置IP地址

tsj空间里面的IP设置为:

ip netns exec tsj ip addr add 10.254.1.1/24 dev eth0

Host主机上面的IP设置为:

ip addr add 10.254.1.2/24 dev tsj-0

OK,当前大家IP都配置好了。现在我们来测试一下连通性。从网络空间,ping 主机空间。

2.7      验证连通性

Host主机这边先监听(新开一个窗口):

tcpdump -i tsj-0 -n icmp

新建空间里面,发起ping:

ip netns exec tsj ping 10.254.1.2

image.png

可以看到两边的效果,新建空间里面:(发出ping报文)

image.png

主机空间里面:(对Host主机来说,是收到新报文)

image.png

好啦,到这里,完整的网络空间基本长成了。

魔法师同志,恭喜学成网络虚拟化第一步。

(ps:Docker创建容器网络,过程原理跟上面是一样的,只是把cli改为使用系统调用,并且做了自动化)

3      高阶

3.1      在新空间中启动软件

这里我们在新创建的tsj空间中,启动一个nc服务器。

ip netns exec tsj nc -lp 1234

上面表示启动一个nc的web服务器,监听在1234端口。

这个时候,咱们给它发请求:

curl -v 10.254.1.1:1234

可以正常的访问

image.png

3.2      查找Veth对的另一端

如果ns非常多,veth也非常多(比如在OpenStack的网络节点上),怎么查找Veth网线的另一头在哪里呢?

比如,咱们这个tsj新世界里面网卡名eth0,咱们如何知道主机上是tsj-0就是它的对端呢?

答:可以使用 ethtool –S 方法。

ip netns exec tsj ethtool -S eth0

NIC statistics:

     peer_ifindex: 149

可以看到对端的index的149。这个时候主机上面敲:

ip link list

可看到idnex为 149 的网卡具体是哪个。

image.png

3.3      删除Veth和NS

创建了新的世界后,怎么把它抹去呢?

删除网线:(ps:网线2头会同时删除)

ip link delete tsj-0

删除ns:(ps:直接删除ns,会连带veth一起删除)

ip netns delete tsj

4      总结

咱们学习了Veth网线的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐