【Docker】Linux网络命名空间

命名空间

Namespace是Linux提供的一种对于系统全局资源的隔离机制;从进程的视角来看,同一个namespace中的进程看到的是该namespace自己独立的一份全局资源,这些资源的变化只在本namespace中可见,对其他namespace没有影响。容器就是采用namespace机制实现了对网络,进程空间等的隔离。不同的Container(在K8S中是以Pod为单位)属于不同namespace,实现了Container或Pod之间的资源互相隔离,互不影响。

命名空间将全局系统资源包装在一个抽象中,使命名空间中的进程看起来拥有自己的全局资源的独立实例。对全局资源的更改对作为命名空间成员的其他进程可见,但对其他进程不可见。名称空间的一个用途是实现容器。

Linux提供了以下七种namespace:

  • Cgroup:Cgroup root directory
  • IPC:System V IPC, POSIX message queues
  • Network:Network devices, stacks, ports, etc.
  • Mount:Mount points
  • PID:Process IDs
  • User:User and group IDs
  • UTS:Hostname and NIS domain name

Network namespace允许你在Linux中创建相互隔离的网络视图,每个网络命名空间都有自己独立的网络配置,包括:网络设备、路由表、IPTables规则,路由表、网络协议栈等。

新建的网络名字空间与主机默认网络名字空间之间是隔离的。我们平时默认操作的是主机的默认网络名字空间。

不同的Network Namespace的资源互相不可见,彼此之间无法通信。

VETH

VETH(Virtual Ethernet)是Linux提供的另外一种特殊的网络设备,中文称为虚拟网卡接口。它总是成对出现,要创建就创建一个pair。一个Pair中的veth就像一个网络线缆的两个端点,数据从一个端点进入,必然从另外一个端点流出。每个veth都可以被赋予IP地址。

veth设备是虚拟以太网设备。它们可以充当网络命名空间之间的隧道,以创建到另一个命名空间中的物理网络设备的桥,但也可以用作独立的网络设备。veth设备总是成对互连。可以使用以下命令创建配对:

# ip link add <p1-name> type veth peer name <p2-name> 

在上面的例子中,p1-name和p2-name是分配给两个相连端点的名称。在设备对中的一台设备上传输的数据包会立即被另一台设备接收。当任一设备出现故障时,设备对的链路状态为故障。

veth和tap/tun类似,也是linux提供的一种虚拟网络设备;但与tap/tun不同的是,veth总是成对出现的,从一端进入的数据包将会在另一端出现,因此又常常称为veth pair。我们可以把veth pair看成一条网线两端连接的两张以太网卡。

由于network namespace隔离了网络相关的全局资源,因此从网络角度来看,一个network namespace可以看做一个独立的虚机;即使在同一个主机上创建的两个network namespace,相互之间缺省也是不能进行网络通信的。

管理网络命名空间

Network Namespace是Linux内核提供的功能,本文借助ip命令来完成各种操作。ip命令来自于iproute2安装包,一般系统默认安装,如果没有的话,可自行安装。

查看帮助信息

ip命令管理的功能很多,和Network Namespace有关的操作都在其子命令ip netns下进行的,可以通过ip netns help查询命令帮助信息:

$ ip netns help
Usage:  ip netns listip netns add NAMEip netns attach NAME PIDip netns set NAME NETNSIDip [-all] netns delete [NAME]ip netns identify [PID]ip netns pids NAMEip [-all] netns exec [NAME] cmd ...ip netns monitorip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT]
NETNSID := auto | POSITIVE-INT

创建网络命名空间

通过ip netns add命令创建一个名为ns0的网络命名空间:

$ ip netns add ns0

查询网络命名空间

通过ip netns list命令查询网络命名空间列表:

$ ip netns list
ns0

查看网络命令空间所在的目录:

$ ls /var/run/netns/
ns0

注意:新创建的Network Namespace会出现在/var/run/netns/目录下。如果需要管理其他不是ip netns创建的network namespace,只要在这个目录下创建一个指向对应network namespace文件的链接即可。

删除网络命名空间

通过ip netns delete NAME命令删除网络命名空间:

$ ip netns delete ns0

操作网络命名空间

对于每个Network Namespace来说,它会有自己独立的网卡、路由表、ARP表、iptables等和网络相关的资源。

ip命令提供了ip netns exec子命令可以在对应的Network Namespace中执行命令。

查看网络命名空间ns0的网卡信息:

$ ip netns exec ns0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00$ ip netns exec ns0 ping 127.0.0.1
ping: connect: Network is unreachable

每个namespace在创建时会自动创建一个回环接口lo,默认不启用。它的作用和Linux系统中默认看到的lo一样,都是为了实现loopback通信,如果希望lo口能工作,可以通过下面的命令启用它。

启用lo回环网卡:

$ ip netns exec ns0 ip link set lo up$ ip netns exec ns0 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever$ ip netns exec ns0 ping 127.0.0.1 -c 3
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.014 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.028 ms--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2091ms
rtt min/avg/max/mdev = 0.014/0.021/0.028/0.005 ms

再次ping回环网卡,发现已经可以ping通了。

ns0中打开一个shell终端:

$ ip netns exec ns0 /bin/bash$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever$ exit
exit

通过执行ip netns exec ns0 /bin/bash进入ns0的shell终端,后面所有的命令都在这个Network Namespace中执行,好处是不用每次执行命令时都要带上ip netns exec,缺点是我们无法清楚知道自己当前所在的shell,容易混淆。

可以采用下面的方法解决:

$ ip netns exec ns0 /bin/bash --rcfile <(echo "PS1=\"ns0> \"")
ns0>

Network Namespace之间的通信

默认情况下,network namespace是不能和主机网络,或者其他network namespace通信的。

可以使用Linux提供的veth pair来完成通信,veth pair你可以理解为使用网线连接好的两个接口,把两个端口放到两个namespace中,那么这两个namespace就能打通。

接下来我们通过实验进行验证:

创建veth pair

创建veth pair:

$ ip link add type veth$ ip link
21: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 7e:8d:e9:81:ee:6e brd ff:ff:ff:ff:ff:ff
22: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 8e:fd:3c:5b:fd:52 brd ff:ff:ff:ff:ff:ff

可以看到,此时系统中新增了一对veth pair:veth0和veth1,需要记住的是veth pair无法单独存在,删除其中一个,另一个也会自动消失。

如果需要指定veth pair两个端点的名称,可以使用下面的命令:

$ ip link add veth001 type veth peer name veth002$ ip link
23: veth002@veth001: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether ce:e8:7d:d3:31:07 brd ff:ff:ff:ff:ff:ff
24: veth001@veth002: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000link/ether 12:bc:27:1c:64:cc brd ff:ff:ff:ff:ff:ff$ ip link delete veth001

创建Network Namespace

前面我们已创建了一个名为ns0的Network Namespace,下面再创建一个名称为ns1的网络命名空间。

$ ip netns add ns1$ ip netns list
ns1
ns0

把veth pair分别加入到这两个namespace中

将veth0加入到ns0:

$ ip link set veth0 netns ns0

将veth1加入到ns1:

$ ip link set veth1 netns ns1

分别为这对veth pair配置上ip地址,并启用

为veth0配置IP,并启用该虚拟网卡:

$ ip netns exec ns0 ip addr add 192.168.1.1/24 dev veth0$ ip netns exec ns0 ip link set veth0 up$ ip netns exec ns0 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
21: veth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 7e:8d:e9:81:ee:6e brd ff:ff:ff:ff:ff:ff link-netns ns1inet 192.168.1.1/24 scope global veth0valid_lft forever preferred_lft foreverinet6 fe80::7c8d:e9ff:fe81:ee6e/64 scope linkvalid_lft forever preferred_lft forever

为veth1配置IP,并启用该虚拟网卡:

$ ip netns exec ns1 ip addr add 192.168.1.2/24 dev veth1$ ip netns exec ns1 ip link set veth1 up$ ip netns exec ns1 ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
22: veth1@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 8e:fd:3c:5b:fd:52 brd ff:ff:ff:ff:ff:ff link-netns ns0inet 192.168.1.2/24 scope global veth1valid_lft forever preferred_lft foreverinet6 fe80::8cfd:3cff:fe5b:fd52/64 scope linkvalid_lft forever preferred_lft forever

验证两个Network Namespace之间的互通

在ns0中ping通ns1:

$ ip netns exec ns0 ping 192.168.1.2 -c 2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.447 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.031 ms--- 192.168.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1009ms
rtt min/avg/max/mdev = 0.031/0.239/0.447/0.208 ms

在ns1中ping通ns0:

$ ip netns exec ns1 ping 192.168.1.1 -c 2
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.032 ms--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.019/0.025/0.032/0.006 ms

可以看到,veth pair成功实现了两个不同Network Namespace之间的网络交互。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习第26天:异步通知驱动开发: 主动

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 在正式开启今天的学习前&#xff0c;讲一讲为什么标题中加入了【主动】俩字。之前学习的阻塞和非阻塞IO&#xff0c;都是在被动的接受应用程序的操作。而今天的学…

rust入门

目录 一&#xff0c;输入输出 二&#xff0c;函数 1&#xff0c;main函数 2&#xff0c;普通函数 3&#xff0c;库函数 4&#xff0c;常用库函数 三&#xff0c;变量 1&#xff0c;变量绑定、let、mut 2&#xff0c;变量作用域 四&#xff0c;数据结构 1&#xff0c…

风云七剑攻略,最强阵容搭配

今天的风云七剑攻略最强阵容搭配给大家推荐以神仙斋减怒回血为主的阵容。 关注【娱乐天梯】&#xff0c;获取内部福利号 首先&#xff0c;这个角色在这个阵容当中&#xff0c;所有的角色当中&#xff0c;他的输出系数是最高的&#xff0c;已经达到了200%的层次&#xff0c;而且…

商业模式画布的9大模块全解读,产品经理不可不知!

“商场如战场”&#xff0c;在当今瞬息万变的商业环境中&#xff0c;创造出独特且创新的商业模式是每个企业家、策略家和决策者的首要任务。为了在激烈的市场竞争中取得优势&#xff0c;我们需要一个强大且直观的工具来帮助我们规划和塑造公司的商业模式&#xff0c;这个经常被…

H5游戏源码分享-跳得更高

H5游戏源码分享-跳得更高 控制跳动踩到云朵上 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta http-equiv"Content-Type" content"text/html;"&g…

【.NET Core】创建一个在后台运行的控制台程序(ConsoleApp)

文章目录 1. 添加Nuget包2. 修改Program.cs3. 添加TestService 借助.NET的通用主机&#xff08;IHostBuilder&#xff09;可以轻易创建一个可以执行后台任务的程序 1. 添加Nuget包 Microsoft.Extensions.Hosting 2. 修改Program.cs 通过Host获取IHostService&#xff0c;然…

[UDS] --- ECUReset 0x11

1 0x11功能描述 根据ISO14119-1标准中所述&#xff0c;诊断服务11主要用于Client向Server(ECU)请求重启行为。该重启行为将会导致Server复位回归到特定的初始状态&#xff0c;具体是什么初始状态取决于Client的请求行为。 2 0x11应用场景 一般而言&#xff0c;对于11诊断服务…

Ansible的安装和部署

目录 1.Ansible的安装 2.构建Ansible清单 直接书写受管主机名或ip 设定受管主机的组[组名称] 主机规格的范围化操作 指定其他清单文件 ansible命令指定清单的正则表达式 3.Ansible配置文件参数详解 配置文件的分类与优先级 常用配置参数 4.构建用户级Ansible操作环…

goland无法调试问题解决

goland 无法调试问题解决 golang 版本升级后&#xff0c;goland 无法进行调试了 首先请看自己下载的版本是否有误 1.apple系 M系列芯片的 arm64版本 2.apple系 intel系列芯片的x86_64 3.windows系 intel解决如下&#xff1a; 查看gopath ericsanchezErics-Mac-mini gww-api…

docker 安装minio,访问地址进不去

文章目录 黑马头条P37docker安装minio文图一、启动后页面一直是加载状态进不去 黑马头条P37docker安装minio文图 一、启动后页面一直是加载状态进不去 通过docker logs -f (容器id)查看日志 通过这个报错信息&#xff0c;得知最近minio 升级&#xff0c;一些启动信息和之前不…

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取 由于一些工程的仿真文件不易产生&#xff0c;所以我们可以利用 quartus 软件自带的 SignalTap 工具对波形进行抓取 对各个信号进行分析处理&#xff0c;让电子器件与FPGA进行正常通讯工作&#xff0c;也验证所绘制的波形图是否一…

【设计模式三原则】

设计模式三原则 单一职责原则开放封闭原则依赖倒转原则里氏代换原则 我们在进行程序设计的时候&#xff0c;要尽可能地保证程序的可扩展性、可维护性和可读性&#xff0c;所以需要使用一些设计模式&#xff0c;这些设计模式都遵循了以下三个原则&#xff0c;下面来依次为大家介…

探求flutter全栈开发

显示一种网络图片 import package:flutter/material.dart; main(){runApp(MaterialApp(theme: ThemeData.dark(),home:Home(),));}class Home extends StatelessWidget{overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar:AppBar(t…

树----数据结构

树的概念 树是一种非线性的数据结构&#xff0c;它是由 n (n>1) 个有限结点组成一个具有层次关系的集合&#xff0c;它看起来就像一颗倒挂的树&#xff0c;根朝上&#xff0c;叶朝下。由 0 个节点构成的树&#xff0c;叫做空树。 树的特点&#xff1a;每个结点有 0 个或多…

【Http协议】 一

本文主要介绍了Http协议的作用以及如何通过抓包工具Fiddler抓取http请求/响应&#xff0c;重点介绍了请求/响应报文的内容 一.Http协议 最常用的应用层协议 http超文本传输协议&#xff0c;除了能传输字符串文本&#xff0c;还能那个传输其他的 比如&#xff1a; 浏览器打开网…

网络工程综合试题(二)

1. SR技术有哪些缺点&#xff1f; SR&#xff08;Segment Routing&#xff09;技术是一种新兴的网络编程技术&#xff0c;它具有很多优点&#xff0c;但也存在一些缺点&#xff0c;包括&#xff1a; 部署复杂性&#xff1a;SR技术需要对网络进行改造和升级&#xff0c;包括更新…

MAC缓解WebUI提示词反推

当前环境信息&#xff1a; 在mac上安装好stable diffusion后&#xff0c;能做图片生成了之后&#xff0c;遇到一些图片需要做提示词反推&#xff0c;这个时候需要下载一个插件&#xff0c;参考&#xff1a; https://gitcode.net/ranting8323/stable-diffusion-webui-wd14-tagg…

Android 驱动学习调试

1 Android 驱动代码编译 参考https://www.sharetechnote.com/html/Linux_DeviceDriver_Programing.html#Device_Driver_HelloWorld编译ko文件调试驱动代码&#xff0c;将ko文件push到手机上验证 相关C文件testdriver.c #include <linux/init.h> #include <linux/mod…

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放&#xff0c;会自动翻页&#xff0c;直到翻页到最后一页。

input改造文件上传,el-table的改造,点击上传,拖拽上传,多选上传

第一个input标签效果 第二个input标签的效果 el-table的改造效果 <template><div class"outerBox"><div class"analyze" v-if"status"><div class"unFile"><div class"mainBox"><img clas…