【摘要】 学习Veth-pair的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。
1 什么是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个网卡。
2 实战演练
现在用我们之前学过的 ip netns 命令来操作 一下我们创建的网络空间。
操作ns相关的输入格式为:
ip netns exec 【哪个命名空间】 【具体要执行的命令】
2.1 首先创造新空间
ip netns add tsj
这样就创造了一个新的“网络空间”,可以通过
ip netns list
命令查看,确实有了一个新的ns空间了:
tsj
但是这个时候,咱们还缺少与这个空间进行交互的通道,光有空间,没有入口。
2.2 然后创造网线
接着让我们来创造一根Veth牌网线:
命令格式是:ip link add 【网线一头名字】 type veth peer name 【网线另一头名字】
所以如下:
ip link add tsj-0 type veth peer name tsj-1
2.3 网线生效
ifconfig tsj-0 up
ifconfig tsj-1 up
(或者:ip link set tsj-0 up,看过以前的ip命令课程的,就知道这2种命令效果是一样的)
这个时候可以通过ifconfig看到这2个网卡了。
2.4 网线一头伸入到新建的空间
使用以下命令:
ip link set tsj-1 netns tsj
将“tsj-1”的网线头子,放入“tsj”这个虚拟空间中。
注意,网线还有一头“tsj-0”仍然在Host主机空间中的。
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网卡也生效了)
查询结果,可以看到新建的虚拟网络空间里面,有一种比较熟悉的感觉。
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
可以看到两边的效果,新建空间里面:(发出ping报文)
主机空间里面:(对Host主机来说,是收到新报文)
好啦,到这里,完整的网络空间基本长成了。
魔法师同志,恭喜学成网络虚拟化第一步。
(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
可以正常的访问
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 的网卡具体是哪个。
3.3 删除Veth和NS
创建了新的世界后,怎么把它抹去呢?
删除网线:(ps:网线2头会同时删除)
ip link delete tsj-0
删除ns:(ps:直接删除ns,会连带veth一起删除)
ip netns delete tsj
4 总结
咱们学习了Veth网线的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。