Linux虚拟网络技术的资料讲解

在linux虚拟化技术中,网络级别上最重要的三项技术是网络名称空间、线对和veth桥接器或虚拟交换机技术。 今天,我们将指导您学习linux网络虚拟化技术。
我们首先了解下network namespace,它是由linux内核提供,是实现网络虚拟化的重要功能。通过创建多个隔离的网络空间,实现网络资源的隔离。
不同的network namespace的资源互相不可见,彼此之间无法通信。如下图所示:
network namespace
ip netns命令
network namespace是linux内核提供的功能,本文借助ip命令来完成各种操作。ip命令来自于iproute2安装包,一般系统默认安装,如果没有的话,读者可自行安装。
ip命令管理的功能很多,和network namespace有关的操作都在其子命令ip netns下进行的,可以通过ip netns help查询命令帮助信息
[root@qll253 ~]# ip netns helpusage: ip netns list
ip netns add name
ip netns set name netnsid
ip [-all] netns delete [name]
ip netns identify [pid]
ip netns pids name
ip [-all] netns exec [name] cmd 。..
ip netns monitor
ip netns list-id
创建network namespace
1、通过 ip netns add 命令创建一个名为ns0的网络命名空间:
[root@1ll253 ~]# ip netns add ns02、查询命名空间
[root@1ll253 ~]# ip netns listns0
3、命名空间所在目录
[root@1ll253 ~]# ls /var/run/netns/ns0
注意:新创建的 network namespace 会出现在/var/run/netns/目录下。如果需要管理其他不是 ip netns 创建的 network namespace,只要在这个目录下创建一个指向对应 network namespace 文件的链接即可。
操作network namespace
对于每个 network namespace 来说,它会有自己独立的网卡、路由表、arp 表、iptables 等和网络相关的资源。ip命令提供了ip netns exec命令可以在对应的 network namespace 中执行命令。
1、查看网络命名空间 ns0 的网卡信息
[root@1ll253 ~]# ip netns exec ns0 ip addr1: lo:mtu 65536 qdisc noop state down group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
每个 namespace 在创建时会自动创建一个回环接口lo,默认不启用。它的作用和linux系统中默认看到的lo一样,都是为了实现loopback通信,如果希望lo口能工作,可以通过下面的步骤2启用它。
2、启用lo回环网卡:
[root@1ll253 ~]# ip netns exec ns0 ip link set lo up再次检查回环网卡状态:
[root@1ll253 ~]# ip netns exec ns0 ip addr1: lo: mtu 65536 qdisc noqueue state unknown group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
会发现此时回环口卡处于up状态,并且系统分配127.0.0.1/8的ip地址。
3、在 ns0 中打开一个shell终端
[root@1ll253 ~]# ip netns exec ns0 /bin/bash[root@1ll253 ~]# ip addr1: lo: mtu 65536 qdisc noqueue state unknown group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever
[root@1ll253 ~]# exitexit
通过执行ip netns exec ns0 /bin/bash进入ns0的shell终端,后面所有的命令都在这个network namespace中执行,好处是不用每次执行命令时都要带上ip netns exec ,缺点是我们无法清楚知道自己当前所在的shell,容易混淆。
可以采用下面的方法解决:
[root@1ll253 ~]# ip netns exec ns0 /bin/bash --rcfile 《(echo “ps1=”ns0》 “”)ns0》
network namespace 之间的通信
默认情况下,network namespace 是不能和主机网络,或者其他 network namespace 通信的。
可以使用 linux 提供的veth pair来完成通信,veth pair你可以理解为使用网线连接好的两个接口,把两个端口放到两个namespace中,那么这两个namespace就能打通。
接下来我们通过实验进行验证:
1、创建veth pair
[root@1ll253 ~]# ip link add type veth
[root@1ll253 ~]# ip link14: veth0@veth1: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether 06:17:62:85:64:fc brd ff:ff:ff:ff:ff:ff
15: veth1@veth0: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether fe:9a:48:e4:a3:99 brd ff:ff:ff:ff:ff:ff
[root@1ll253 ~]#
可以看到,此时系统中新增了一对veth pair:veth0和veth1,需要记住的是veth pair无法单独存在,删除其中一个,另一个也会自动消失。
如果需要指定veth pair两个端点的名称,可以使用下面的命令:
[root@1ll253 ~]# ip link add veth001 type veth peer name veth002[root@1ll253 ~]# ip link12: veth002@veth001: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether aa:3e:04:da:a7:69 brd ff:ff:ff:ff:ff:ff
13: veth001@veth002: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether 3e:5d:5f:4e:06:2b brd ff:ff:ff:ff:ff:ff
2、创建network namespace
我们已创建了一个名为ns0的network namespace,下面再创建一个名称为ns1的网络命名空间。
[root@1ll253 ~]# ip netns add ns1[root@1ll253 ~]# ip netns listns1
ns0
3、把veth pair分别加入到这两个namespace中
将veth0加入到ns0,将veth1加入到ns1,如下所示:
[root@1ll253 ~]# ip link set veth0 netns ns0[root@1ll253 ~]# ip link set veth1 netns ns14、分别为这对veth pair配置上ip地址,并启用
1)为veth0配置ip,并启用该虚拟网卡
[root@1ll253 ~]# ip netns exec ns0 ip addr add 192.168.1.1/24 dev veth0[root@1ll253 ~]# ip netns exec ns0 ip link set veth0 up2)为veth1配置ip,并启用该虚拟网卡
[root@1ll253 ~]# ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1[root@1ll253 ~]# ip netns exec ns1 ip link set veth1 up5、查看这对veth pair的状态
6、验证两个network namespace之间的互通
可以看到,veth pair成功实现了两个不同network namespace之间的网络交互。
网桥
虽然veth pair可以实现两个 network namespace 之间的通信,但 veth pair 有一个明显的缺陷,就是只能实现两个网络接口之间的通信。如果多个network namespace需要进行通信,则需要借助bridge。
下面我们通过实验来进行讲解:
准备步骤:还原网络环境
为方便接下来的实验,我们把刚刚创建的network namespace及veth pair删除,保证纯净的网络环境。
[root@1ll253 ~]# ip netns delete ns0[root@1ll253 ~]# ip netns delete ns11、创建3个network namespace
[root@1ll253 ~]# ip netns add ns0[root@1ll253 ~]# ip netns add ns1[root@1ll253 ~]# ip netns add ns22、创建3对veth pair
[root@1ll253 ~]# ip link add type veth[root@1ll253 ~]# ip link16: veth0@veth1: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether ba:fa:d6:14:e1:32 brd ff:ff:ff:ff:ff:ff
17: veth1@veth0: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether a2:ef:d9:a5:96:51 brd ff:ff:ff:ff:ff:ff
18: veth2@veth3: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether a2:5b:e7:9e:b1:55 brd ff:ff:ff:ff:ff:ff
19: veth3@veth2: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether 92:91:67:ab:69:ac brd ff:ff:ff:ff:ff:ff
20: veth4@veth5: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether 8a:c8:35:f6:11:3f brd ff:ff:ff:ff:ff:ff
21: veth5@veth4: mtu 1500 qdisc noop state down mode default group default qlen 1000
link/ether 2a:b7:82:d4:49:d5 brd ff:ff:ff:ff:ff:ff
3、创建网桥
// 创建名为 docker0 的网桥
[root@1ll253 ~]# ip link add docker0 type bridge
//启动 docker0 网桥
[root@1ll253 ~]# ip link set dev docker0 up
//为docker0网桥配置ip
[root@1ll253 ~]# ifconfig docker0 172.17.0.1/16此时可以通过ifconfig命令查看:
4、绑定网口
network namespace、veth pair、bridge 都创建完毕,下面通过命令将每对veth pair的一端绑定在network namespace,另一端绑定在docker0网桥上,用于实现网络互通
1)配置第一个网络命名空间 ns0
// 将veth1添加进ns0
[root@1ll253 ~]# ip link set dev veth1 netns ns0//将veth1重命名为eth0
[root@1ll253 ~]# ip netns exec ns0 ip link set dev veth1 name eth0//为ns0中的eth0配置ip
[root@1ll253 ~]# ip netns exec ns0 ip addr add 172.17.0.101/16 dev eth0// 启动ns0中的eth0网卡
[root@1ll253 ~]# ip netns exec ns0 ip link set dev eth0 up// 将veth0添加加网桥docker0
[root@1ll253 ~]# ip link set dev veth0 master docker0// 启动veth0网卡
[root@1ll253 ~]# ip link set dev veth0 up2)配置第二个网络命名空间 ns1
[root@1ll253 ~]# ip link set dev veth3 netns ns1[root@1ll253 ~]# ip netns exec ns1 ip link set dev veth3 name eth0[root@1ll253 ~]# ip netns exec ns1 ip addr add 172.17.0.102/16 dev eth0[root@1ll253 ~]# ip netns exec ns1 ip link set dev eth0 up[root@1ll253 ~]# ip link set dev veth1 master docker0[root@1ll253 ~]# ip link set dev veth3 up3)配置第三个网络命名空间 ns2
[root@1ll253 ~]# ip link set dev veth5 netns ns2[root@1ll253 ~]# ip netns exec ns2 ip link set dev veth5 name eth0[root@1ll253 ~]# ip netns exec ns2 ip addr add 172.17.0.103/16 dev eth0[root@1ll253 ~]# ip netns exec ns1 ip link set dev eth0 up[root@1ll253 ~]# ip link set dev veth5 master docker0[root@1ll253 ~]# ip link set dev veth5 up5、
和网桥有关的操作还可以使用brctl,这个命令来自 bridge-utils安装包。这里使用brctl show来查询网桥docker0下绑定的网卡。
6、验证多个namespace之间的通信
// 进入ns0 bash终端
[root@1ll253 ~]# ip netns exec ns0 /bin/bash --rcfile 《(echo “ps1=”ns0》 “”)
// ping 网桥docker0
ns0》 ping -c 1 172.17.0.1ping 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.033 ms.。.
// ping ns1上的eth0网卡
ns0》 ping -c 1 172.17.0.102
ping 172.17.0.102 (172.17.0.102) 56(84) bytes of data.
64 bytes from 172.17.0.102: icmp_seq=1 ttl=64 time=0.049 ms.。.
// ping ns2上的eth0网卡ns0》
ping -c 1 172.17.0.103ping 172.17.0.103 (172.17.0.103) 56(84) bytes of data.
64 bytes from 172.17.0.103: icmp_seq=1 ttl=64 time=0.038 ms
。..

可关断晶闸管特性_可关断晶闸管的检测
多功能小夜灯小巧便携,造型简单设计唯美
基于DSP的声雷达信号采集系统
十年专注石墨烯,这家公司欲开启柔性可穿戴领域新时代
小米成为九号公司真正出现在大众视线里的重要推手
Linux虚拟网络技术的资料讲解
企业能源管控云平台如何帮助企业节能减排?——安科瑞 严新亚
汽车芯片面临的最大技术挑战是什么?
ChannelExpert平台如何对DDR信号进行时域眼图仿真分析
变压器中性点间隙保护装置的图解
论智能传感器对于智能工厂的重要性
黑鲨游戏手机2 Pro开启预约该机搭载骁龙855 Plus辅以12GB+256GB内存
华为在手机市场大跌 穿戴设备业务小米或许会被进一步压制
配电系统中三相五线制接法示意图
板载DC/DC转换器的电磁兼容性(EMC)和电磁干扰(EMI)解析
iOS市场份额将至最低,Android与iOS之间差距被进一步拉大
Melexis 推出新款3D磁性位置传感器芯片,重新定义市场格局
ARM发布全新架构CPU、GPU及AI内核 性能全面提升
2019年三星全球5G手机市场占有率为53.9%,售出670万部5G手机
一加5什么时候上市?性能欲超小米6,高颜值配高性能的国产手机即将来袭