0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Wildesbeast 来源:21IC 作者:21IC 2020-06-27 09:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

。..

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11849

    浏览量

    219759
  • 交换机
    +关注

    关注

    23

    文章

    2941

    浏览量

    104967
  • 桥接器
    +关注

    关注

    0

    文章

    85

    浏览量

    45777
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    WiFi Mesh网络技术架构介绍

    对无线网络的需求 智能家居中坚固、可扩展且自我修复, 工业物联网与大规模传感器部署 推动了网状WiFi技术的重大创新。所以 传统WiFi依赖于中央路由器,也就是网状网络 创建一个去中心化的互联节点
    的头像 发表于 01-21 13:32 401次阅读

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    每个内存地址是虚拟的,不是直接指向RAM中的任何地址。当用户访问内存中的存储单元时,都会进行地址转换以匹配相应的物理内存。书籍的第10章讨论了五个主题,对Linux内核内存分配进行详细讲解。 接着
    发表于 01-16 20:05

    网络技术的演进与革新:从虚拟化到全栈智能互联

    前言在传统IT架构中,网络核心是物理设备集群,服务器通信依赖网线、光纤连接,流量管控与访问控制完全依托路由器、交换机实现。随着云计算技术的兴起,网络形态发生根本性变革——云网络不仅涵盖
    的头像 发表于 01-16 14:06 750次阅读
    云<b class='flag-5'>网络技术</b>的演进与革新:从<b class='flag-5'>虚拟</b>化到全栈智能互联

    华为IP Club沪之行上海金融网络技术沙龙圆满落幕

    以“品智联接 数智金融”为主题的华为IP Club沪之行-上海金融网络技术沙龙成功举办。众多金融行业代表、产业学者齐聚一堂,围绕行业面临的挑战与演进方向,共同探讨在技术变革与业务高要求的双重驱动下,如何构建面向未来的金融网络,旨
    的头像 发表于 12-25 15:18 800次阅读

    华为联合发布基于智能体的校园自智网络技术白皮书

    发布了《基于智能体的校园自智网络技术白皮书》(以下简称“《白皮书》”)。该《白皮书》系统阐述了校园自智网络方案在实现全网体验可视、大模型智能运维、自动化管理及绿色运营等方面的创新技术,为全国高校智能化发展提供了从
    的头像 发表于 12-17 16:39 955次阅读

    华为联合发布园区自智网络技术白皮书

    近日,在沙特国王大学(KSU)主办的AI教育峰会期间,华为联合全球固定网络创新联盟(以下简称“NIDA”)与沙特国王大学(以下简称“KSU”),共同发布了《园区自智网络技术白皮书》(以下简称
    的头像 发表于 11-25 15:12 887次阅读

    爱立信率先完成5G可编程网络技术演示

    近日,在IMT-2020(5G)推进组的组织下,爱立信率先成功完成了5G可编程网络技术演示。本次演示结合实际应用场景验证了可编程网络在服务保障、动态资源分配、网络能力开放以及意图冲突管理等方面的关键
    的头像 发表于 11-05 17:14 8825次阅读

    华为网络技术赋能上海院开启智慧建筑新篇章

    智慧建筑的实践者和推动者,也正在通过网络技术的创新应用,打造智慧、绿色的高品质万兆园区新标杆,以数智力量共拓“城市更新”崭新篇章。
    的头像 发表于 10-30 10:17 885次阅读

    华为助力埃塞俄比亚电信通信网络技术迈向新高度

    近日,埃塞俄比亚领先运营商埃塞俄比亚电信与华为共同宣布,在北非区域率先完成GigaAAU FDD三频Massive MIMO站点的商用部署。此次合作是双方在提升网络性能、改善用户体验方面的又一重大举措,标志着埃塞俄比亚电信通信网络技术迈向新高度,也为北非数字经济发展注入强
    的头像 发表于 08-20 13:53 1112次阅读

    华为网络智能体NetMaster荣获2025 AI网络技术“智驱应用标杆奖”

    [中国,北京,2025年8月9日]2025 AI网络技术应用创新大会在北京成功举办。在本次大会期间的2025 AI网络技术年度评选颁奖盛典上,华为网络智能体NetMaster凭借AI技术
    的头像 发表于 08-12 09:40 2895次阅读

    AI网络全栈式互联架构产品及解决方案提供商奇异摩尔荣获2025 AI 网络技术智网技术先锋奖

      中国北京-8月9日,以 “智联万物 网聚未来” 为主题的2025 AI网络技术应用创新大会在北京金茂万丽酒店圆满举行。本次大会由中国通信学会信息通信网络技术专业委员会、中国通信学会开源技术专业
    的头像 发表于 08-11 19:14 2063次阅读
    AI<b class='flag-5'>网络</b>全栈式互联架构产品及解决方案提供商奇异摩尔荣获2025 AI <b class='flag-5'>网络技术</b>智网<b class='flag-5'>技术</b>先锋奖

    Linux系统中网络配置详解

    网络配置是Linux系统运维中的核心技能之一。正确理解和配置子网掩码、网关等网络参数,直接影响系统的网络连通性和性能。本文将深入探讨Linux
    的头像 发表于 07-17 11:01 1492次阅读

    Linux网络管理的关键技术和最佳实践

    在大型互联网企业中,Linux网络管理是运维工程师的核心技能之一。面对海量服务器、复杂网络拓扑、高并发流量,运维人员需要掌握从基础网络配置到高级网络
    的头像 发表于 07-09 09:53 1183次阅读

    技术分享 | 迅为RK3568开发板如何将 Linux 板卡虚拟成U盘

    技术分享 | 迅为RK3568开发板如何将 Linux 板卡虚拟成U盘
    的头像 发表于 06-04 10:57 1410次阅读
    <b class='flag-5'>技术</b>分享 | 迅为RK3568开发板如何将 <b class='flag-5'>Linux</b> 板卡<b class='flag-5'>虚拟</b>成U盘

    手把手教你如何调优Linux网络参数

    在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃。本文基于真实案例分析,从参数解读、问题诊断到优化实践,手把手教你如何调优Linux
    的头像 发表于 05-29 09:21 1301次阅读