Linux namespace

news2025/1/15 22:38:35

前言

从《initrd&init进程》可知,我们通过ssh连接linux服务器,其实主是linux启动一shell进程与我们做交互。而Linux又是多租户的,这使用得用户与用户间产生了,资源的争抢。 如何隔离资源,且让用户都无法察觉?

Linux Namespace 是什么

Namespace 是 Linux 内核中实现的特性,本质上是一种资源隔离方案.
其提供了一种抽象机制,将原本全局共享的资源隔离成不同的集合,集合中的成员独享其原本全局共享的资源。

举个例子:进程 A 和进程 B 分别属于两个不同的 Namespace,那么进程 A 将可以使用 Linux 内核提供的所有 Namespace 资源:如独立的主机名,独立的文件系统,独立的进程编号等等。同样地,进程 B 也可以使用同类资源,但其资源与进程 A 使用的资源相互隔离,彼此无法感知。
在这里插入图片描述
从用户的角度来看,每一个命名空间应该像一台单独的 Linux计算机一样,有自己的 init进程 (PID为 I),其他进程的PID依次递增, A和B空间都有PID为l的init进程, 子命名空间的进程映 射到父命名空间的进程上,父命名空间可以知道每一个子命名空间的运行状态,而子命名空间 与子命名空间之间是隔离的

当前 Linux一共实现了 7 种不同类型的 Namespace
在这里插入图片描述

User Namespace

User namespace 用于隔离安全相关的资源,包括 user IDs and group IDs(keys和 capabilities)。同样一个用户的 user ID 和 group ID 在不同的 user namespace 中可以不一样权限。换句话说,一个用户可以在一个 user namespace 中是普通用户,但在另一个 user namespace 中是超级用户。

打开两个终端

## 终端1

## 使用unshare命令进行 namespace
unshare --user /bin/bash

## 使用id命令查看
> id
uid=65534(nobody) gid=65534(nogroups) groups=65534(nogroup)

## 在新的 user namespace 中,当前用户变成了 nobody,并且 ID 也变成了 65534。
## 这是因为我们还没有映射父 user namespace 的 user ID 和 group ID 到子 user namespace 中来
## 如果没有映射,当在新的 user namespace 中用 getuid() 和 getgid() 获取 user ID 和 group ID 时,系统将返回文件 /proc/sys/kernel/overflowuid 中定义的 user ID 以及 proc/sys/kernel/overflowgid 中定义的 group ID,它们的默认值都是 65534。也就是说如果没有指定映射关系的话,会默认会把 ID 映射到 65534。

> cat /proc/sys/kernel/overflowuid
65534
> cat /proc/sys/kernel/overflowgid
65534

## 下面我们来完成 nick (外部用户)在新的 user namespace 中的映射。
## 映射ID的方法就是添加映射信息到 /proc/PID/uid_map 和 /proc/PID/gid_map (这里的 PID 是新 user namespace 中的进程 ID,刚开始时这两个文件都是空的)文件中。

## 查询当前namespace进程id 
> echo $$
16471

## 终端2

## 使用ll命令查询,uid_map,gid_map文件的归属
> ll /proc/16471/uid_map /proc/16471/gid_map

## 查看容器外用户ID
> id
uid=1000(nick) gid=1000(nick) groups=1000(nick)

## 对 uid_map 和 gid_map 文件的写入操作有着严格的权限控制,简单点说就是:这两个文件的拥有者是创建新的 user namespace 的用户
## 所以和这个用户在一个 user namespace 中的 root 账号可以写;这个用户自己是否有写 map 文件的权限还要看它有没有 CAP_SETUID 和 CAP_SETGID 的 capability(权限)

## 给nick 用户设置权限
> sudo setcap cap_setgid,cap_setuid+ep /bin/bash
> exec bash

## 查询权限
> getcap /bin/bash
/bin/bash = cap_setgid,cap_setuid+ep

## uid_map 和 gid_map 的配置信息的格式如下(每个文件中可以有多条配置信息):
## ID-inside-ns(容器内用户ID) ID-outside-ns(容器外用户ID) length
## 比如 0 1000 500 这条配置就表示父 user namespace 中的 1000~1500 映射到新 user namespace 中的 0~500。、
## 容器内 0 为root 对应容器外 1000 (nike用户)

> echo '0 1000 500' > /proc/16471/uid_map
> echo '0 1000 500' > /proc/16471/gid_map

## 终端1

> exec bash
> id
uid=0(root) gid=0(root) groups=65534(nogroup)

## 查看root目录仍没有权限,比如这里 root 对应父 user namespace 的用户是 nick
> ll / grep root
dxwx---- 4 nobody nogroup 4096  root/

当然也可以使用“-r” 来将当前用户自动映射root

unshare --user -r /bin/bash

命令解释

  • $$ :Shell本身的PID(ProcessID),即当前进程的PID。
  • setcap 设置进程特权的Linux命令。它允许普通用户运行某些需要特权的服务,而无需以root身份运行整个服务
  • uid(用户ID)、gid(初始组ID), groups是用户所在组(这里既可以看到初始组,如果有附加组,则也能看到附加组)

User namespace 与其它 namespace 的关系
. Linux 下的每个 namespace,都有一个 user namespace 与之关联,这个 user namespace 就是创建相应 namespace 时进程所属的 user namespace,相当于每个 namespace 都有一个 owner(user namespace),这样保证对任何 namespace 的操作都受到 user namespace 权限的控制。

NetWork Namespace

Network Namespace 是用来隔离网络设备、 IP地址端口 等网络械的 Namespace。 Network Namespace 可以让每个容器拥有自己独立的(虚拟的)网络设备,而且容器内的应用可以绑定 到自己的端口,每个 Namespace 内的端口都不会互相冲突。在宿主机上搭建网桥后,就能很方 便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口 。

同样的打开两个终端

## 终端1

## 查看ip
> ifconfig
ens33: 192.168.3.34
lo: 127.0.0.1

## 使用 root映射的身份进入,并net 隔离
> unshare --net --user -r /bin/bash

## 再次查询,发现为空,net 隔离成功
> ifconfig

## 查看进程
> echo $$
16894

## 终端2

## Linux上创建一对veth设备
> sudo ip link add veth0 type veth peer name veth1
> ip a | grep veth
3: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
4: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 100

## 为veth0设置IP地址并启动
> sudo ip a add dev veth0 192.168.10.10/24
> sudo ip link set veth0 up
> ifconfig
ens33: 192.168.3.34
lo: 127.0.0.1
veth0: 192.168.10.10

## 将veth1移动到刚才新建的network namespace 中
sudo ip link set veth1 netns 16894

## 终端1

## 在ns1中启动veth1并设置IP地址
> ip link set dev veth1 up
> ip a add dev veth1 192.168.10.20/24
> ifcofing
veth1: 192.168.10.20

## 使用ping测试连通
> ping 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.076 ms

现在ns1还不能和公网通信。解决这个问题也很简单,在root network namespace中开启转发并设置SNAT,在ns1中添加默认路由即可。

  • veth是一种Linux内核网络设备,它通常用于在不同的网络命名空间之间创建虚拟网络接口。veth可以分为成对出现的两个设备,一个位于主机上,另一个则与容器相关联。
    在容器技术中,veth设备通常用于将主机上的网络连接和容器内部的网络连接隔离开来。
  • SNAT(Source Network Address Translation)是一种将源IP地址和端口从一个网络地址转换为另一个网络地址的技术

主要参考

《linux unshare 命令,详解Linux Namespace之User》
《Linux namespace之:network namespace》
《自己动手写Docker》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目实现热部署

文章目录 SpringBoot实现热部署手动开启热部署自动开启热部署热部署相关配置 SpringBoot实现热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时…

初学数据库

1、什么是数据库 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的API用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&#xff0c;但是在…

企业级实践:大厂项目研发流程

引言 战国邹孟轲《孟子离娄上》&#xff1a;“离娄之明&#xff0c;公输子之巧&#xff0c;不以规矩&#xff0c;不能成方圆。” 每一个行业都有自己行之有效的规矩&#xff0c;同样软件行业也有自己一套的开发流程&#xff0c;今天就来跟大家聊一聊咱们公司的开发流程&#…

智能修改文案-智能写作平台

智能原创自动写作工具在线 随着人工智能技术的发展&#xff0c;智能原创自动写作工具在线已经成为了网络营销的一个重要工具。这种工具可以根据您输入的关键词和主题&#xff0c;自动生成高质量、原创性强的文章。下面是智能原创自动写作工具在线的优势。 节省时间和人力成本 …

IDEA重复下载SNAPSHOT包问题

问题现象 reimport 之后 状态栏显示resolving dependencies… 遇到某个比较大的快照包(33M)&#xff0c;同一天的第2个版本时 1.0-xxx-SNAPSHOT.时间戳-2 idea importer 会先分片下载 x.jar.part文件中&#xff0c;然后复制为x.jar吧 如图中所示&#xff0c;其实已经下载完了&…

C++四种类型转换运算符

C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。 但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&#xff0c;它并没有表明存在什么风险&#xff0c;风险程度如何。再者&#xff0c;C风格的…

深入浅出OkHttp,【带你手写】构建高效、高性能的网络请求框架

简述 OKHttp是一个用Java编写的网络框架&#xff0c;可用于 Android&#xff0c;以及一些基于Java的web应用开发中。它使用了HTTP/2标准的支持和连接池技术&#xff0c;可以让应用快速向Web服务器发送网络请求&#xff0c;并得到响应。OKHttp提供了一个简单的API&#xff0c;允…

【SQL】列的选择与查询

本文内容参考书籍《SQL基础教程》第二章&#xff0c;课后习题在最后&#xff0c;请多指教。之前章节的内容请点击下方链接。 前言 PostgreSQL的下载与安装 第一章 数据库的创建&#xff0c;表的创建、更新、删除 一、SELECT语句 1、查询表中的列 &#xff08;1&#xff09…

【每日一题】——移除元素

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

重装系统重启后无法进入系统解决方法

重启无法进入系统怎么办?让大家平日里使用小白装机系统的话&#xff0c;很有可能会由于没有办法顺利的进行引导菜单而导致无法进入系统下面&#xff0c;小编今天教大家小白装机重启无法进入系统解决方法。 方法/步骤&#xff1a; 方法一&#xff1a;运用热键再次进入。 1、小…

【LeetCode】剑指 Offer(29)

目录 题目&#xff1a;剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 57. 和为s的两个数…

JVM垃圾回收机制(GC)

目录 GC的作用&#xff1a; 申请内存的时机和释放内存的时机 内存泄露和内存溢出 内存泄露 内存溢出 GC&#xff08;垃圾回收的劣势&#xff09; GC&#xff08;垃圾回收&#xff09; 的工作过程 垃圾回收的过程&#xff1a; 第一阶段&#xff1a;找垃圾/判定垃…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的直方图算法增强&#xff08;C&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调中引用…

基于NXP iMX8处理器扩展外部 SGTL5000 音频接口

By Toradex胡珊逢 Apalis iMX8 计算机模块的数字音频接口 SAI&#xff08;Synchronous Audio Interface&#xff09;可以配置为 AC97、I2S格式&#xff0c;用于连接外部音频编解码器。文章接下来将介绍在 Linux BSP v6 上如何扩展第二路 SGTL5000。 iMX8 处理器具有多路 SAI 通…

I2C基础入门

I2C参数 主从模式&#xff1a; 主机从机 常见速率&#xff1a; 普通模式&#xff08;100kHz&#xff09;快速模式&#xff08;400kHz&#xff09;快速模式&#xff08;1MHz&#xff09;高速模式&#xff08;3.4MHz&#xff09;超高速模式&#xff08;5MHz&#xff09; 地址…

__cplusplus和extern “C“

文章目录 __cplusplus是什么extern "C"使用场景的示例通过MinGW编译及查看下目标文件中的符号用gcc编译器添加 -c选项 使my_handle.c文件编译后生成my_handle.o文件&#xff0c;这里的 -o是 output的意思nm命令 是GCC编译集合下最常用的查看目标文件中的符号的命令 -…

0601概述-react路由-react

1 SPA与MPA 1.1 简述 单页面应用和多页面应用是两种不同的 Web 应用程序架构。 单页面应用&#xff08;SPA&#xff09;是指在一个 HTML 页面中动态加载和渲染所有的应用程序内容&#xff0c;通过前端 JavaScript 操作来实现页面的变化和交互。SPA 不需要每次请求新的 HTML …

牛客刷题错题解析

以下是Video/Audio中会触发的事件的有&#xff1f; load play seeked abort 网址&#xff1a;https://www.nowcoder.com/questionTerminal/fc3b560267fd44e98d02a40a 方法&#xff1a;load() play() pause() 事件&#xff1a;play() playing() pause() seeked() seeking() abor…

Linux移植5.4版本内核:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(5.4版本内核)

Linux移植5.4版本内核&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;5.4版本内核&#xff09; 文章目录 Linux移植5.4版本内核&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;5.4版本内核&#xff09;1.出厂源…

浅理解JavaScript数组去重的方法(划重点),当面试官问如何实现数组去重时,你可以这样做...

文章目录 &#x1f4cb;前言&#x1f3af;什么是数组去重&#xff0c;运用场景是什么&#xff1f;&#x1f3af;常用的数组去重方法&#x1f9e9;使用 Set 对象&#x1f9e9;使用 Object&#xff08;对象、基于Hash哈希表&#xff09; 或 Map&#x1f9e9;使用 filter 方法与 i…