Linux中的网络隔离功能 netns

Network Namespace(netns) 是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间,并且各自拥有独立的网络协议栈。通过 namespace 可以隔离容器的进程 PID、文件系统挂载点、主机名等多种资源,它可以为不同的命名空间从逻辑上提供独立的网络协议栈,具体包括网络设备(网卡)、路由表、arp表、iptables、以及套接字(socket)等。使得不同的网络空间就都好像运行在独立的网络中一样。如大名鼎鼎的docker便是基于netns实现的网络隔离。

1、ip netns 帮助文档

A network namespace is logically another copy of the network stack, with its own routes, firewall rules, and network devices.
ip-netns - process network namespace management.

ip netns help
man ip-netns
man ip netns
=========================================
Usage: 
ip [ OPTIONS ] netns  { COMMAND | help }
ip netns [ list ]
ip netns add NETNSNAME
ip [-all] netns delete [ NETNSNAME ]
ip netns set NETNSNAME NETNSID
ip netns identify [ PID ]
ip netns pids NETNSNAME
ip [-all] netns exec [ NETNSNAME ] command...
ip netns monitor
ip netns list-id1.将 {网卡名字} 移动到 {网络命名空间}
ip link set {网卡名字} netns {网络命名空间}
2.将接口iner1从网络名称空间ns2移动到网络名称空间ns1
ip netns exec ns2 ip link set iner1 netns ns1
3.将接口iner1从名称空间ns2移动到Linux上默认网络名称空间

2、ip netns 实践

在这里插入图片描述

2.1、添加两个tap设备并配置IP信息

添加两个tap设备并配置IP信息

1.添加并启动虚拟网卡tap设备
ip tuntap add dev tap0 mode tap
ip tuntap add dev tap1 mode tap
ip link set tap0 up
ip link set tap1 up2.配置IP
ip addr add 10.0.0.1/24 dev tap0
ip addr add 10.0.0.2/24 dev tap1

在宿主机器上使用测试与tap0 10.0.0.1的网络连通性

ping -c 1 10.0.0.1
===========================================================
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.032/0.032/0.032/0.000 ms

在宿主机器上使用测试与tap0 10.0.0.2的网络连通性

ping -c 1 10.0.0.2
===========================================================
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.046 ms--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms

2.2、添加两个netns,移动tap设备到netns中

然后添加两个netns,最后将tap设备移动到netns中

3.添加netns
ip netns add ns0
ip netns add ns14.查看已存在的netns
ip netns list5.将虚拟网卡tap0,tap1分别移动到ns0和ns1中
ip link set tap0 netns ns0
ip link set tap1 netns ns16.移动后查看netns中的网络接口网络配置丢失
【在不同的网络命名空间中移动虚拟网络接口时会重置虚拟网络接口的状态】
ip netns exec ns0 ip addr
ip netns exec ns1 ip addr7.启动netns中网络接口
ip netns exec ns0 ip link set tap0 up
ip netns exec ns1 ip link set tap1 up8.重新配置netns中网络接口的IP
ip netns exec ns0 ip addr add 10.0.0.1/24 dev tap0
ip netns exec ns1 ip addr add 10.0.0.2/24 dev tap19.添加netns
ip netns exec ns0 ip addr
ip netns exec ns1 ip addr

宿主机上使用测试与tap0 10.0.0.1的网络连通性 不通

ping -c 1 10.0.0.1
===========================================================
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.--- 10.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

宿主机上使用测试与tap0 10.0.0.2的网络连通性 不通

ping -c 1 10.0.0.2
===========================================================
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.--- 10.0.0.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

在命名空间ns0中测试与tap0的网络连通性 不通

ip netns exec ns0 ping -c 1 10.0.0.1

在命名空间ns0中测试与tap1的网络连通性 不通

ip netns exec ns0 ping -c 1 10.0.0.2
====================================
connect: Network is unreachable

在命名空间ns1中测试与tap1的网络连通性 不通

ip netns exec ns1 ping -c 1 10.0.0.2

在命名空间ns1中测试与tap0的网络连通性 不通

ip netns exec ns1 ping -c 1 10.0.0.1
====================================
connect: Network is unreachable

在netns中执行命令有两种方式:
法1::先在宿主机器上执行 ip netns exec <netns name> bash 进入netns的命令行窗口,然后就可以像是在本机一样执行命令了。
法2:每次在宿主机器上使用完整命令。例:ip netns exec ns0 ping 10.0.0.2 (含义:在命名空间ns0中执行ping 10.0.0.2命令)

可以看到在宿主机器上访问netns是丢包,而在netns中互相访问是网络不可达了,这是为什么呢?让我们来检查一下netns吧。

使用ip netns exec ns0 ip a在ns0中查看网卡

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
16: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 42:ad:98:a2:cc:81 brd ff:ff:ff:ff:ff:ff

使用ip netns exec ns1 ip a在ns1中查看网卡

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
17: tap1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether 12:06:1d:06:41:57 brd ff:ff:ff:ff:ff:ff

可以看到不仅本地环回lo和tap设备的状态都是DOWN,甚至就连tap设备的IP信息也没有了,这是因为。

我们将ns0和ns1中的相关设备都重新启动并配置上IP

ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set tap0 up
ip netns exec ns0 ip addr add 10.0.0.1/24 dev tap0ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set tap1 up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev tap1

首先我们测试一下netns中本地网络是否正常

使用ip netns exec ns0 ping 10.0.0.1在命名空间ns0中测试本地网卡是否启动

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.084 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.044 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 65ms
rtt min/avg/max/mdev = 0.033/0.049/0.084/0.021 ms

使用ip netns exec ns1 ping 10.0.0.2在命名空间ns1中测试本地网卡是否启动

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.035 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 65ms
rtt min/avg/max/mdev = 0.033/0.049/0.084/0.021 ms

可以看出本地网络没有问题,然后我们再来测试一下两个netns之间的网络连通性

使用ip netns exec ns0 ping 10.0.0.2在命名空间ns0中测试与tap1的网络连通性

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
^C
--- 10.0.0.2 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 84ms

使用ip netns exec ns1 ping 10.0.0.1在命名空间ns1中测试与tap0的网络连通性

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 30ms

可以看出没有任何ICMP回复包,netns确实把在同一台主机上的两张虚拟网卡隔离起来了。在这里我们只是简单的使用ping命令来测试网络的连通性,实际上可以做到更多,例如修改某一个netns的路由表或者防火墙规则,完全不会影响到其他的netns,当然也不会影响到宿主机器,在这里由于篇幅原因就不再展开实验了,感兴趣的同学可以实验一下。下一节我们将学习另一个网络设备veth pair,使用它来把两个netns连接起来,让两个隔离的​netns之间可以互相通信。


初心易得,始终难守;不忘初心,方得始终。

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

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

相关文章

vscode调试Electron+ts

调试Electronjs 调试Electronjs: https://www.electronjs.org/zh/docs/latest/tutorial/debugging-vscode 调试Electronts 首先看一下&#xff0c;我的目录结构。目录结构决定了launch.json中的路径部分。我将在项目根目录下进行调试&#xff0c;项目根目录下包含electron代码…

数据可视化(十一):Pandas餐饮信息表分析——交叉表、离群点分析,多维分析等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

golang创建式设计模式------单例模式

目录导航 1.单例模式1)什么是单例模式 2)使用场景3)实现方式1.懒汉式单例模式2.饿汉式3.双重检查式4.sysc.Once式 4)实践案例5)优缺点分析 1.单例模式 1)什么是单例模式 单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法&#…

【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式&#xff1a;静态分配3.3、顺序表的实现方式&#xff1a;动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

浅谈电动汽车充电站的电气安全

1 引言 1月14日日上午10点左右&#xff0c;青岛市市北区辽宁路63号公交停车场内&#xff0c;一辆报废公交车突然起火&#xff0c;由于大风天气&#xff0c;大火很快引燃了停在旁边的几辆报废车。消防人员快速赶到&#xff0c;迅速控制住火势。11时30分&#xff0c;停车场内的…

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!

前言 我们之前肯定已经见过了很多文本生成图片、文本生成声音以及AI翻唱歌曲 等多种AI产品&#xff08;模型&#xff09;。 其实音乐和图片从某种意义上来说都是艺术创作的一种形式&#xff0c;它们可以相互配合&#xff0c;共同呈现出一种更加丰富、感性的表达方式。 将图片…

弘君资本:人形机器人概念走强,盛通股份涨停,怡合达、鼎智科技等拉升

人形机器人概念14日盘中拉升走高&#xff0c;到发稿&#xff0c;盛通股份涨停&#xff0c;怡合达、鼎智科技涨约6%&#xff0c;索辰科技、伟创电气、丰立智能等涨超4%。 音讯面上&#xff0c;5月13日&#xff0c;宇树发布人形智能体Unitree G1&#xff0c;身高127cm,体重35kg&…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…

易宝OA-ExecuteQueryForDataSetBinary处sql注入

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责&#xff0c;与作者无关&#xff01;&#xff01;&#…

Centos 安装jenkins 多分支流水线部署前后端项目

1、安装jenkins 1.1 安装jdk 要求&#xff1a;11及以上版本 yum install yum install java-11-openjdk 1.2 安装jenkins 导入镜像 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo出现以下错误 执行以下命令 sudo yum …

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

强化学习——马尔可夫过程的理解

目录 一、马尔可夫过程1.随机过程2.马尔可夫性质3.马尔可夫过程4.马尔可夫过程示例 参考文献 一、马尔可夫过程 1.随机过程 随机过程是概率论的“动态”版本。普通概率论研究的是固定不变的随机现象&#xff0c;而随机过程则专注于那些随时间不断变化的情况&#xff0c;比如天…

R语言两种方法实现随机分层抽样

为了减少数据分布的不平衡&#xff0c;提供高样本的代表性&#xff0c;可将数据按特征分层一定的层次&#xff0c;在每个层次抽取一定量的样本&#xff0c;为分层抽样。分层抽样的特点是将科学分组法与抽样法结合在一起&#xff0c;分组减小了各抽样层变异性的影响&#xff0c;…

C语言指针详解(三)

目录 前言 一. 回调函数是什么&#xff1f; 1.定义 2. 代码示例&#xff1a;计数器 2.1 使用回调函数改造前 2.2 使用回调函数改造后 二. qsort使用举例 1. qsort介绍 2. 使用qsort函数排序整型数据 3. 使用qsort排序结构体数据 三. qsort函数的模拟实现 四. sizeo…

代码随想录:螺旋矩阵II相关题目推荐(54、LCR146)

59.螺旋矩阵II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 代码&#xff08;新解法&am…