命名空间(Linux namespace)是linux内核针对实现虚拟化引入的一个特性。创建的每个进程都有自己的命名空间,运行在其中的进程都像是在独立的操作系统中运行一样,命名空间保证了进程之间互不影响。
    命名空间提供了一种不同的解决方案,只使用一个内核在一台物理计算机上运作,所有全局资源都通过命名空间抽象起来。这使得可以将一组进程放置到一个命名空间中,各个命名空间彼此隔离。
 
    Linux内核提供了6种命名空间:
命名空间
描述
作用
进程命名空间
隔离进程ID
inux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同 进程命名空间是一个父子结构,子空间对于父空间可见
网络命名空间
隔离网络设备、协议栈、端口等
通过网络命名空间,实现网络隔离,将不同命名空间的网络设备连接到一起
IPC命名空间
隔离进程间通信
进程间交互方法 PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互
挂载命名空间
隔离挂载点,隔离文件目录
进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到 chroot 的功能,而在安全性方面比 chroot 更高
UTS命名空间
隔离Hostname和NIS域名
拥有独立的主机名和域名,目的是独立出主机名和网络信息服务(NIS)
用户命名空间
隔离用户和group ID
每个命名空间内上的用户跟宿主主机上不在一个命名空间 同进程 ID 一样,用户 ID 和组 ID 在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的 ID
    下面主要介绍Linux网络命名空间。
 

网络命名空间

    在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。
  • 从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。
  • 从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。
  • 从用户的角度来看,我们只需使用工具ip(package is iproute2)来创建一个新的持久网络命名空间。
 
查看存在的网络命名空间
    查看是否存在命名空间,若报错,需要更新系统内核,以及 ip 工具程序。
[root@localhost ~]# ip netns ls
添加网络命名空间
[root@localhost ~]# ip netns add test1
列出网卡所有,其中ens18和ens19为物理网卡
[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 6a:b4:3c:52:ac:44 brd ff:ff:ff:ff:ff:ff
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 66:4a:9f:f6:51:16 brd ff:ff:ff:ff:ff:ff
创建新的虚拟网卡
    同时创建veth0和veth1两个虚拟网卡,这个时候这两个网卡还都属于“default”或“global”命名空间,和物理网卡一样。
[root@localhost ~]# ip link add veth0 type veth peer name veth1
[root@localhost ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 6a:b4:3c:52:ac:44 brd ff:ff:ff:ff:ff:ff
3: ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 66:4a:9f:f6:51:16 brd ff:ff:ff:ff:ff:ff
4: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 52:83:c8:40:04:6f brd ff:ff:ff:ff:ff:ff
把其中一个网卡转移到网络命名空间中
ip link set veth1 netns test1
激活网络命名空间中的网卡及配置IP地址
[root@localhost ~]# ip link set veth1 netns test1
[root@localhost ~]# ip netns exec test1 ip link set lo up
[root@localhost ~]# ip netns exec test1 ip link set veth1 up
[root@localhost ~]# ip netns exec test1 ip addr add 1.1.1.1/24 dev veth1
[root@localhost ~]# ip netns exec test1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> 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
4: veth1@if5: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 1.1.1.1/24 scope global veth1
valid_lft forever preferred_lft forever
宿主机虚拟网卡配置IP地址并测试网络通信
# 宿主机配置IP地址并测试网络
[root@localhost ~]# ip link set veth0 up
[root@localhost ~]# ip addr add 1.1.1.2/24 dev veth0
[root@localhost ~]# ping 1.1.1.1 -c 1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=64 time=0.100 ms --- 1.1.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.100/0.100/0.100/0.000 ms
# 在网络命名空间test1中ping宿主机上的IP地址
[root@localhost ~]# ip netns exec test1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
4: veth1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ba:f1:e3:75:a8:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 1.1.1.1/24 scope global veth1
valid_lft forever preferred_lft forever
inet6 fe80::b8f1:e3ff:fe75:a8c4/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec test1 ping -c 1 1.1.1.2
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=0.088 ms --- 1.1.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.088/0.088/0.088/0.000 ms
跨主机访问网络命名空间中的网络
    为了让另一个主机可以访问本主机上的某个网络命名空间中定义的IP地址,可以将宿主机的物理网卡和虚拟网卡做桥接,这样就可以和虚拟网卡通信。
# 添加网络命名空间
ip netns add test1
# 添加虚拟网卡
ip link set veth1 netns test1
# 将网卡添加到网络命名空间中并激活网卡
ip link set veth1 netns test1
ip netns exec test1 ip link set lo up
ip netns exec test1 ip link set veth1 up
ip netns exec test1 ip addr add 1.1.1.1/24 dev veth1
# 在宿主机添加桥接网络并将宿主机物理网卡和虚拟网卡添加到桥接中
ip link add vmbr0 type bridge
ip link set vmbr0 up
ip link set ens19 master vmbr0
ip link set veth0 master vmbr0
# 另一个主机访问网络命名空间中的IP地址
ping 1.1.1.1

Linux网络命名空间的更多相关文章

  1. docke通信之Linux 网络命名空间

    一.前言 namespace(命名空间)和cgroup是软件容器化(想想Docker)趋势中的两个主要内核技术.简单来说,cgroup是一种对进程进行统一的资源监控和限制,它控制着你可以使用多少系统资 ...

  2. Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)

    作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...

  3. [Linux网络、命名空间、veth设备对、docker的host模式、container模式、none模式、brideg模式、网桥的增删查,容器与网桥的连接断开]

    [Linux网络.命名空间.veth设备对.docker的host模式.container模式.none模式.brideg模式.网桥的增删查,容器与网桥的连接断开] 网络名称空间 为了支持网络协议栈的 ...

  4. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  5. Linux的命名空间详解--Linux进程的管理与调度(二)【转】

    Linux Namespaces机制提供一种资源隔离方案. PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace.每个Namespace里面的资源对其他Namesp ...

  6. Linux的命名空间详解--Linux进程的管理与调度(二)

    转自:http://blog.csdn.net/gatieme/article/details/51383322 日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux- ...

  7. 网络驱动移植之解析Linux网络驱动的基本框架

    内核源码:linux-2.6.38.8.tar.bz2 概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备. 1.分配并初始化网络设备 动态分配网络设备 ...

  8. 由PPPOE看Linux网络协议栈的实现

    http://www.cnblogs.com/zmkeil/archive/2013/05/01/3053545.html 这个标题起得比较纠结,之前熟知的PPPOE是作为PPP协议的底层载体,而实际 ...

  9. Linux网络驱动--snull

    snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...

随机推荐

  1. 学习JAVAWEB第二天

    DML:C:添加数据INSERT INTO 表名(列名1,2...) Values(值1,2,3..)查询表select * from表名D:删除数据delete from 表名 where 条件(i ...

  2. deque概述

    1.简介 双端队列deque,与vector的最大差异在于: 一.deque运行常数时间对头端或尾端进行元素的插入和删除操作. 二.deque没有所谓的容器概念,因为它是动态地以分段连续空间组合而成随 ...

  3. ABC182 F Valid payments

    解法一 首先不妨来思考一下怎样的一个付钱方案是最优的,假设需要支付 \(Y\) 元,第 \(a_i\) 种钱币支付了 \(s_i\) 张,那么必须有:\(s_i < \frac{a_{i + 1 ...

  4. war3 Game

    转载请注明来源:https://www.cnblogs.com/hookjc/ //位置结构.x,y不多说,unknown是3F800000.浮点数1.0?? struct Pos {   DWORD ...

  5. jdbc插入或查询数据库时间总是比实际时间少8小时原因

    mysql插入数据库的时间总是有问题,比实际时间要早8小时.检查是jdbc连接的url中配置的时区有问题,原先是 jdbc.url=jdbc:mysql://47.**.**.**:3306/yeey ...

  6. Linux文件系统与日志分析的了解

    Linux文件系统与日志分析 1.inode和block概述 2.模拟inode耗尽实验 3.ext类型文件恢复 4.xfs类型文件恢复 5.日志文件 6.日志分析 1.文件:文件是存储在硬盘上的,硬 ...

  7. C++实现对Json数据的友好处理

    背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...

  8. 微服务如何聚合 API 文档?这波秀~

    今天这篇文章介绍一下微服务如何聚合Swagger实现接口文档管理. 文章目录如下: 为什么需要聚合? 微服务模块众多,如果不聚合文档,则访问每个服务的API文档都需要单独访问一个Swagger UI界 ...

  9. python篇第5天【变量】

    第4天加班 多个变量赋值 Python允许你同时为多个变量赋值.例如: a = b = c = 1 以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上. 您也可以为多个对象指定多个变 ...

  10. suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用

    文章目录 编译部署nginx 下载nginx源码包 编译nginx 配置nginx.conf 配置nginx为systemctl管理 分发nginx二进制文件和配置文件 启动kube-nginx服务 ...