学习Veth-pair的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。
什么是Veth-Pair
Veth是Linux中一种虚拟出来的网络设备,veth设备总是成对出现,所以一般也叫veth-pair。其作用是反转数据流方向。
例如:如果v-a和v-b是一对veth设备,v-a收到的数据会从v-b发出。相反,v-b收到的数据会从v-a发出。其实说白了,Veth就是一根“网线”,你从一头发数据,当然就从另一头收到数据了。网线的作用不就是这个么,veth也一样,把数据通过一头“复制”到另一头。
由于veth的“网线”特性,它常常充当着一个桥梁,连接着各种虚拟网络设备。常见用途是连接两个netwok namespace,或者连接Linux-Bridge、OVS 之类的。
Ps:veth的2头都直接连着网络协议栈,所以你创建一个veth对,主机上就会多2个网卡。
实战演练
现在用我们之前学过的 ip netns 命令来操作 一下我们创建的网络空间。
操作ns相关的输入格式为:
1 | ip netns exec [哪个命名空间] [具体要执行的命令] |
首先创造新空间:
1 | ip netns add tsj |
这样就创造了一个新的“网络空间”,可以通过
1 | ip netns list |
命令查看,确实有了一个新的ns空间了:
1 | tsj |
但是这个时候,咱们还缺少与这个空间进行交互的通道,光有空间,没有入口。
然后创造网线:
接着让我们来创造一根Veth牌网线:
命令格式是:
1 | ip link add [网线一头名字] type veth peer name [网线另一头名字] |
所以如下:
1 | ip link add tsj-0 type veth peer name tsj-1 |
网线生效:
1 | ifconfig tsj-0 up |
(或者:ip link set tsj-0 up
,看过以前的ip命令课程的,就知道这2种命令效果是一样的)
这个时候可以通过ifconfig看到这2个网卡了。
网线一头伸入到新建的空间
使用以下命令:
1 | ip link set tsj-1 netns tsj |
将tsj-1
的网线头子,放入tsj
这个虚拟空间中。
注意,网线还有一头tsj-0
仍然在Host主机空间中的。
把网卡命名为 eth0
重命名网卡:
1 | ip netns exec tsj ip link set tsj-1 name eth0 |
然后把这个网线头子生效一下:
1 | ip netns exec tsj ip link set eth0 up |
查询结果,可以看到新建的虚拟网络空间里面,有一种比较熟悉的感觉。
给网卡设置IP地址
tsj空间里面的IP设置为:
1 | ip netns exec tsj ip addr add 10.254.1.1/24 dev eth0 |
Host主机上面的IP设置为:
1 | ip addr add 10.254.1.2/24 dev tsj-0 |
OK,当前大家IP都配置好了。现在我们来测试一下连通性。从网络空间,ping 主机空间。
验证连通性
Host主机这边先监听(新开一个窗口):
1 | tcpdump -i tsj-0 -n icmp |
新建空间里面,发起ping:
1 | ip netns exec tsj ping 10.254.1.2 |
可以看到两边的效果,新建空间里面:(发出ping报文)
主机空间里面:(对Host主机来说,是收到新报文)
好啦,到这里,完整的网络空间基本长成了。
魔法师同志,恭喜学成网络虚拟化第一步。
(ps:Docker创建容器网络,过程原理跟上面是一样的,只是把cli改为使用系统调用,并且做了自动化)
高阶
在新空间中启动软件
这里我们在新创建的tsj空间中,启动一个nc服务器。
1 | ip netns exec tsj nc -lp 1234 |
上面表示启动一个nc的web服务器,监听在1234端口。
这个时候,咱们给它发请求:
1 | curl -v 10.254.1.1:1234 |
可以正常的访问
查找Veth对的另一端
如果ns非常多,veth也非常多(比如在OpenStack的网络节点上),怎么查找Veth网线的另一头在哪里呢?
比如,咱们这个tsj新世界里面网卡名eth0,咱们如何知道主机上是tsj-0就是它的对端呢?
答:可以使用 ethtool –S 方法。
1 | ip netns exec tsj ethtool -S eth0 |
可以看到对端的index的149。这个时候主机上面敲:
1 | ip link list |
可看到idnex为 149 的网卡具体是哪个。
删除Veth和NS
创建了新的世界后,怎么把它抹去呢?
删除网线:(ps:网线2头会同时删除)
1 | ip link delete tsj-0 |
删除ns:(ps:直接删除ns,会连带veth一起删除)
1 | ip netns delete tsj |
总结
咱们学习了Veth网线的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。