《跟唐老师学习云网络》 - Veth网线

举报
tsjsdbd 发表于 2020/02/21 09:48:36 2020/02/21
【摘要】 学习Veth-pair的概念和作用,并实战使用Veth + Network Namespace新建了一个可以独立使用的网络命令空间,从而详细了解了一个完整的网络空间是如何搭建的过程。

 

1      什么是Veth-Pair

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

image.png

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

image.png

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

image.png

Psveth2头都直接连着网络协议栈,所以你创建一个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

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

 

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

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

 

3      高阶

3.1      在新空间中启动软件

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

ip netns exec tsj nc -lp 1234

上面表示启动一个ncweb服务器,监听在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

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

ip link list

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

image.png

 

3.3      删除VethNS

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

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

ip link delete tsj-0

 

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

ip netns delete tsj

 

4      总结

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

 

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。