前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >命名空间介绍之七:网络命名空间

命名空间介绍之七:网络命名空间

作者头像
谛听
修改于 2019-11-05 02:35:00
修改于 2019-11-05 02:35:00
3.7K0
举报
文章被收录于专栏:巫山跬步巫山跬步

自从上次我们研究 Linux 命名空间以来已经有一段时间了。我们的系列缺少了一篇,现在补上:网络命名空间。顾名思义,网络命名空间将网络设备、地址、端口、路由防火墙规则等的使用划分在不同的盒子,基本上是在一个单独运行的内核实例中虚拟化网络。网络命名空间在 2.6.24 版进入内核,约 5 年前;大概一年后,它们才进入黄金时段。从那以后,它们似乎在很大程度上被开发人员忽略了。

基本的网络命名空间管理

与其他命名空间一样,通过将 CLONE_NEWNET 标志传递给 clone() 系统调用可创建网络命名空间。不过,可从命令行方便地使用 ip 网络配置工具来设置和使用网络命名空间。例如:

代码语言:txt
AI代码解释
复制
# ip netns add netns1

此命令创建了一个名为 netns1 的新网络命名空间。当 ip 工具创建网络命名空间时,它会在 /var/run/netns 下为其创建绑定挂载;这允许命名空间一直存在,即使没有进程在其中运行,还有助于操作命名空间自身。由于网络命名空间在可用之前需要大量配置,因此这些交给了系统管理员。

代码语言:txt
AI代码解释
复制
# ls  /var/run/netns

netns1

“ip netns exec”命令可在命名空间中运行网络管理命令:

代码语言:txt
AI代码解释
复制
# ip netns exec netns1 ip link list

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

此命令列出命名空间中的可见接口。可以使用以下命令删除网络命名空间:

代码语言:txt
AI代码解释
复制
# ip netns delete netns1

此命令将删除引用了给定网络命名空间的绑定挂载。但是,只要有进程在命名空间内运行,该命名空间就一直存在。

代码语言:txt
AI代码解释
复制
# ls  /var/run/netns

#

网络命名空间配置

新的网络命名空间将有一个环回设备,但没有其他网络设备。每个网络设备(物理或虚拟接口、网桥等)只能存在于单个网络命名空间中。此外,不能将物理设备(连接到实际硬件的设备)分配给除 root 外的命名空间。相反,可以创建虚拟网络设备(例如虚拟以太网或 veth)并将其分配给命名空间。这些虚拟设备允许命名空间内的进程通过网络进行通信;配置、路由等决定它们可以与谁通信。

首次创建时,新命名空间中的 lo 环回设备被关闭,因此即使 ping 环回设备也会失败:

代码语言:txt
AI代码解释
复制
# ip netns exec netns1 ping 127.0.0.1

connect: Network is unreachable

打开该接口便可 ping 环回地址:

代码语言:txt
AI代码解释
复制
# ip netns exec netns1 ip link set dev lo up

# ip netns exec netns1 ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

64 bytes from 127.0.0.1: icmp\_seq=1 ttl=64 time=0.051 ms

但 netns1 和根名称空间之间仍然不能通信。为此,需要创建和配置虚拟以太网设备:

代码语言:txt
AI代码解释
复制
# ip link add veth0 type veth peer name veth1

# ip link set veth1 netns netns1

第一个命令设置一对已连接的虚拟以太网设备。发送到 veth0 的数据包将被 veth1 接收,反之亦然。第二个命令将 veth1 分配给 netns1 命名空间。

代码语言:txt
AI代码解释
复制
# ip netns exec netns1 ifconfig veth1 10.1.1.1/24 up

# ifconfig veth0 10.1.1.2/24 up

然后,这两个命令为两个设备设置 IP 地址。

代码语言:txt
AI代码解释
复制
# ping 10.1.1.1

PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.

64 bytes from 10.1.1.1: icmp\_seq=1 ttl=64 time=0.087 ms

...



# ip netns exec netns1 ping 10.1.1.2

PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.

64 bytes from 10.1.1.2: icmp\_seq=1 ttl=64 time=0.054 ms

...

如上面的 ping 命令所示,可以双向通信了。

不过,如前所述,命名空间并不共享路由表或防火墙规则,可通过在 netns1 中运行 route 和 iptables -L 来证明。

代码语言:txt
AI代码解释
复制
# ip netns exec netns1 route

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 veth1



# ip netns exec netns1 iptables -L

Chain INPUT (policy ACCEPT)

target     prot opt source               destination



Chain FORWARD (policy ACCEPT)

target     prot opt source               destination



Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

第一行命令将简单地显示数据包到 10.1.1 子网的路由(使用veth1),而第二行命令显示没有配置防火墙。这些都意味着从 netns1 发送到互联网的数据包将收到“network is unreachable”消息。如果需要的话,有几种方法可以将命名空间连接到互联网。可以在根名称空间和 netns1 的 veth 设备中创建网桥。或者,可以在根命名空间中配置 IP 转发和网络地址转换NAT)。其中任何一种(还有其他的配置可能性)都允许 netns1 的数据包到达互联网,并在 netns1 中收到回复。

分配给命名空间(通过clone()、unshare() 或 setns())的非 root 进程只能访问在该命名空间的网络设备和配置 --- 当然,root 可以添加并配置新设备。借助 ip netns 子命令,有两种寻址网络命名空间的方法:按名称(如 netns1)或按命名空间中进程的 ID。由于 init 通常位于根命名空间中,因此可以使用如下命令:

代码语言:txt
AI代码解释
复制
# ip link set vethX netns 1

这将把一个(可能是新创建的)veth 设备放入根名称空间,它将为来自任何其他命名空间的 root 用户工作。如果不希望 root 用户执行网络命名空间中的此类操作,可以使用 PID 和挂载命名空间来使得其他网络命名空间无法访问。

网络命名空间的使用

正如我们所看到的,一个命名空间的网络可以完全没有(或只是环回)任何功能,也可以完全访问系统的网络。这使得网络命名空间有许多不同的用例。

通过关闭命名空间内的网络,管理员可以确保其内运行的进程无法与命名空间外建立连接。即使进程由于某种安全漏洞而受到损害,它也无法加入僵尸网络或发送垃圾邮件。

即使是处理网络流量的进程(例如,web 服务器工作进程或 web 浏览器呈现进程)也可被放置到受限制的命名空间中。一旦建立了与远程终端的连接,则该连接的文件描述符便可被 clone() 创建的新网络命名空间中的子进程处理。因为子进程会继承父进程的文件描述符,所以可以访问连接的描述符。另一种可能是,父进程通过 Unix 套接字将连接的文件描述符发送到受限网络命名空间中的进程。不管哪种情况,子进程或工作进程都无法建立其他网络连接,因为命名空间中缺少合适的网络设备。

命名空间还可以用来在一个单独的盒子中测试复杂的网络配置。另外,可以在更为密闭、防火墙更严格的命名空间中运行敏感服务。显然,还可通过网络命名空间为每个容器提供自己的网络视图,而不受容器外部进程的影响。等等。

命名空间通常提供了一种划分系统资源并将进程组与其他资源隔离的方法。网络命名空间大体也如此,但由于网络是安全的敏感区域,因此提供各种类型的网络隔离尤其重要。当然,同时使用多个命名空间类型可以为安全性和其他需求提供更多的隔离。


原文:https://lwn.net/Articles/580893/

公众号:Geek乐园

博客:https://blog.csdn.net/u012319493/article/details/102881935

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
【探寻C++之旅】第九章:二叉搜索树
二叉搜索树是一棵特殊的二叉树,从名字上我们可以看出这颗特殊的二叉树的特殊点就在于搜索二字。接下来我们先了解一下什么是二叉搜索树,再看一看二叉搜索有什么作用。
code_monnkey_
2025/05/31
820
【探寻C++之旅】第九章:二叉搜索树
【深入C++】二叉搜索树
二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,其每个节点最多有两个子节点,分别称为左子节点和右子节点。BST具有以下性质:
用户11305458
2024/10/09
1430
【深入C++】二叉搜索树
【C++高阶】二叉搜索树的全面解析与高效实现
二叉搜索树(BST,Binary Search Tree)又称二叉排序树,是一种特殊的二叉树,它或者是一棵空树,或者是具有以下性质的二叉树:
IsLand1314
2024/10/15
1390
【C++高阶】二叉搜索树的全面解析与高效实现
孩子,你渴望知道[二叉树]吗?
又被称为二叉排序树,是一种特殊的二叉树,有着这几个典型的特点。 1、若左子树不为空,则左子树上的所有节点的值小于根节点的值 2、若右子树不为空,则右子树上的所有节点的值大于根节点的值 3、左右子树分别也都是二叉搜索树
薛定谔方程难
2024/07/13
810
孩子,你渴望知道[二叉树]吗?
C++进阶:二叉搜索树介绍、模拟实现(递归迭代两版本)及其应用
假设我们插入以下元素:5, 3, 7, 1, 4, 6, 8,可以构建如下的二叉搜索树(BST):
是Nero哦
2024/03/21
2730
C++进阶:二叉搜索树介绍、模拟实现(递归迭代两版本)及其应用
【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
在我们目前的学习中,二叉搜索树最重要的用途就是key--val模型,KV模型就是每一个key值都对应一个val值,这样就形成一个<key,val>键值对,这样的应用在生活中是非常常见的
GG Bond1
2024/07/20
1000
【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
C++: set与map容器的介绍与使用
二叉树我们在c语言数据结构阶段已经学习过, 这里map和set的特性需要先铺垫二叉搜索树, 而二叉搜索树也是一种树形解构, 二叉搜索树的特性了解, 有助于更好的理解map和set的特性, 本文将借助二叉搜索树, 对二叉树部分进行收尾与总结.
用户11317877
2024/10/16
1070
C++: set与map容器的介绍与使用
【C++二叉搜索树】树语静谧:探寻二叉搜索树的内在秩序
我们现在想去找这个4,4比8小,那么我们就没必要去右子树进行查找了,我们直接在左子树进行查找就行了
Undoom
2025/05/29
960
【C++二叉搜索树】树语静谧:探寻二叉搜索树的内在秩序
【二叉树进阶】搜索二叉树(递归+非递归两种版本详解)
我们之前学的普通的二叉树其实意义不大,因为如果只是用二叉树来存储数据的话,还不如直接用链表或者顺序表等这些顺序结构。
YIN_尹
2024/01/23
3270
【二叉树进阶】搜索二叉树(递归+非递归两种版本详解)
C++之搜索二叉树
本文介绍了二叉搜索树的相关概念,主要介绍了如何使用和实现搜索二叉树以及搜索二叉树具体的例题练习。
摘星
2023/04/28
5410
C++之搜索二叉树
【数据结构与算法】AVL二叉搜索树的CRUD实现与应用详解
二叉搜索树(Binary Search Tree)又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
利刃大大
2025/02/03
660
【数据结构与算法】AVL二叉搜索树的CRUD实现与应用详解
【二叉树进阶】搜索二叉树的性能分析及其应用
这种情况最坏的查找无非也就查找高度次(那如果结点数量为N,它的高度通常保持在logN的水平),所以这样它的时间复杂度就是O(logN)。 但是,避免不了出现这样的情况
YIN_尹
2024/01/23
2400
【二叉树进阶】搜索二叉树的性能分析及其应用
手撕AVL树、红黑树,红黑树封装map、set
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,咱们中国的邻居俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。
梨_萍
2023/04/10
8640
手撕AVL树、红黑树,红黑树封装map、set
C++:二叉搜索树
二叉搜索树(BST, Binary Search Tree)又叫做二叉排序树,它可以是一颗空树,其性质如下:
二肥是只大懒蓝猫
2023/03/30
2870
C++:二叉搜索树
【C++】从零开始构建二叉搜索树
普通的二叉树没有特别的性质,今天我们就来赋予其一个全新的性质来满足高速搜索的需求 ,并为后序的map与set做铺垫 ,二叉搜索树的特性了解,有助于更好的理解map和set的特性
叫我龙翔
2024/05/26
1380
【C++】从零开始构建二叉搜索树
C++二叉搜索树与KV模型
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树
有礼貌的灰绅士
2023/04/12
4220
C++二叉搜索树与KV模型
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
前言: 在数据结构和算法的广阔领域中,二叉搜索树(Binary Search Tree,简称BST)无疑是一颗璀璨的明星。它以其高效的数据检索能力和独特的树形结构,在计算机科学领域扮演着举足轻重的角色。对于任何对编程和数据结构感兴趣的人来说,掌握二叉搜索树都是至关重要的一步
Eternity._
2024/06/21
1980
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
C++:基于红黑树封装map和set
想要用红黑树封装map和set,需要对之前实现的key-value红黑树进行修改,因为map是key-value结构而set是key结构,之前实现的红黑树不能满足需求。
HZzzzzLu
2024/11/26
750
C++:基于红黑树封装map和set
【C++】二叉搜索树 - 从基础概念到代码实现
最优情况下,二叉搜索树为完全二叉树(或者接近完全二叉树),其高度为:log2 N 最差情况下,二叉搜索树退化为单指树,其高度为:N 所以综合而言二叉搜索树增删查改的时间复杂度为:O(N)
_孙同学
2025/04/27
1310
【C++】二叉搜索树 - 从基础概念到代码实现
二叉树搜索树
比如要删除这里的3,根据二叉搜索树的性质,左边都是比它小的,右边都是比它大的。 那么我们解决问题的方法就有两种了:
code-child
2023/05/30
1940
二叉树搜索树
推荐阅读
相关推荐
【探寻C++之旅】第九章:二叉搜索树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档