热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ipnetns命令详解

原文链接:https:www.cpweb.top343一、命令介绍ipnetns命令是用来管理网络命名空间的,网络命名空间可以实现网络隔离。每个网络命

原文链接:https://www.cpweb.top/343

一、命令介绍

  ip netns 命令是用来管理 网络命名空间 的,网络命名空间可以实现 网络隔离。每个网络命名空间都提供了一个完全独立的网络协议栈,包括网络设备接口、IPV4 和 IPV6 协议栈、IP路由表、防火墙规则、端口、sockets 等。像 docker 就是利用 Linux 的网络命名空间来实现容器网络的隔离。


用法含义
ip netns list列出网络命名空间。此命令显示的是 “/var/run/netns” 中的所有网络命名空间。
ip netns add NAME添加网络命名空间
ip [-all] netns delete [NAME]删除网络命名空间
ip [-all] netns exec [NAME] cmd …在指定的网络命名空间中执行命令
ip netns set NAME NETNSID给网络命名空间分配id
ip netns identify [PID]查看进程的网络命名空间
ip netns monitor监控对网络命名空间的操作
ip netns pids NAME查找使用此网络命名空间并将其作为主要网络命名空间的进程。此命令会从 /proc 目录中遍历。


二、示例演示

添加并列出network space,随后删除所有的network space。

root@cp:~# ip netns add test1
root@cp:~# ip netns add test2
root@cp:~# ip netns ls
test2
test1
root@cp:~# ip -all netns del
root@cp:~# ip netns ls

创建的网络命名空间是可以在 /var/run/netns 路径下看到。

root@cp:~# cd /var/run/netns/
root@cp:/var/run/netns# ls
test1 test2

使用 exec 命令在网络命名空间中执行命令,查看 test1 的网卡信息

root@cp:~# ip netns exec test1 ip a
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

网络命名空间除了网络是虚拟的以外&#xff0c;文件系统完全和当前系统共享&#xff0c;也就是说所有本地可以使用的命令都可以在网络命名空间中使用。

root&#64;cp:~# ip netns exec test1 ls
app backup.tar cp1 perf.data registry_latest.tar test test_0.1.tar test-bind ubuntu-test.tar
root&#64;cp:~# ip netns exec test1 pwd
/root

进入网络命名空间可以用 exec 执行 bash 即可。

root&#64;cp:~# ip netns exec test1 bash
root&#64;cp:~# ip a
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

–all 选项可以在所有网络命名空间中执行命令。

root&#64;cp:~# ip -all netns exec ip anetns: test2
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:00netns: test1
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 set NAME NETNSID 给网络命名空间分配ID。该ID仅在当前网络命名空间中有效&#xff0c;如果指定了关键字“ auto”&#xff0c;则将会自动选择一个可用的nsid。内核将在某些 netlink 消息中使用此ID&#xff0c;如果在内核需要时未分配ID&#xff0c;则它将由内核自动分配。注意 ID 分配后&#xff0c;将无法更改。

root&#64;cp:~# ip netns add cp
root&#64;cp:~# ip netns
cp
root&#64;cp:~# ip netns set cp 6
root&#64;cp:~# ip netns
cp (id: 6)


使用 ip netns monitor 监控网络命名空间的添加和删除事件&#xff0c;只能监控添加和删除。

root&#64;cp:~# ip netns del cp
root&#64;cp:~# ip netns add cp

另一个终端同步反馈的

root&#64;cp:~# ip netns monitor
delete cp
add cp


  以下两个示例以 docker 容器为例&#xff0c;在没做一些设置前&#xff0c;使用 ip netns 命令是无法管理分配给 docker 容器的网络命名空间&#xff0c;至于如何使用 ip netns 命令管理分配给容器的网络命名空间&#xff0c;下面扩展中有介绍到。在做下面示例时请先做好以下设置。

root&#64;cp:~# docker run -itd --name test centos
7ec02643b32d1c53b39126f6d603b72a402597d938ddef35e7bdb4076763c68f
root&#64;cp:~# ip netns list # 查看为空
root&#64;cp:~#
root&#64;cp:~# ln -s /proc/11421/ns/net /var/run/netns/test
root&#64;cp:~# ip netns list
test (id: 0)

  使用 ip netns identify 命令查看容器 test 的网络命名空间。使用 ip netns pids 命令查找使用该网络命名空间的进程。

root&#64;cp:~# ip netns identify 11421
test
root&#64;cp:~# ip netns pids test
11421


三、扩展


1、网络命名空间的连接

  创建一对 veth pair 虚拟网络设备接口&#xff0c;然后将其分别分配给两个网络命名空间&#xff0c;去连接两个网络命名空间。
  注&#xff1a;veth-pair 是一对的虚拟网络设备接口&#xff0c;它都是成对出现的&#xff0c;所以它常常充当着一个桥梁&#xff0c;我们可以用它实现 “网络命名空间之间的连接”、“Docker 容器之间的连接” 、“Docker 容器和网桥间的连接” 等等。

root&#64;cp:~# ip link add name net1 type veth peer name net2
root&#64;cp:~# ip a
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 host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:a9:42:0e brd ff:ff:ff:ff:ff:ffinet 192.168.18.25/24 brd 192.168.18.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::c75c:21df:8db2:598e/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:2c:d7:37:17 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:2cff:fed7:3717/64 scope link valid_lft forever preferred_lft forever
19: net2&#64;net1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether e2:3c:d5:80:93:3c brd ff:ff:ff:ff:ff:ff
20: net1&#64;net2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether f2:f1:b8:34:4a:9a brd ff:ff:ff:ff:ff:ff

将两个虚拟接口迁移到对应的网络命名空间里。

root&#64;cp:~# ip link set net1 netns test1
root&#64;cp:~# ip link set net2 netns test2
root&#64;cp:~# ip -all netns exec ip anetns: test2
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
19: net2&#64;if20: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether e2:3c:d5:80:93:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0netns: test1
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
20: net1&#64;if19: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether f2:f1:b8:34:4a:9a brd ff:ff:ff:ff:ff:ff link-netnsid 1

给两块网卡设置ip并启动

root&#64;cp:~# ip netns exec test1 ip addr add local 192.168.100.1/24 dev net1
root&#64;cp:~# ip netns exec test2 ip addr add local 192.168.100.2/24 dev net2
root&#64;cp:~# ip netns exec test1 ifconfig net2 up
root&#64;cp:~# ip netns exec test2 ifconfig net2 up
root&#64;cp:~# ip -all netns exec ip anetns: test2
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
19: net2&#64;if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether e2:3c:d5:80:93:3c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 192.168.100.2/24 scope global net2valid_lft forever preferred_lft foreverinet6 fe80::e03c:d5ff:fe80:933c/64 scope link valid_lft forever preferred_lft forevernetns: test1
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
20: net1&#64;if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether f2:f1:b8:34:4a:9a brd ff:ff:ff:ff:ff:ff link-netnsid 1inet 192.168.100.1/24 scope global net1valid_lft forever preferred_lft foreverinet6 fe80::f0f1:b8ff:fe34:4a9a/64 scope link valid_lft forever preferred_lft forever

ping 测试通信

root&#64;cp:~# ip netns exec test1 ping 192.168.100.2
PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.
64 bytes from 192.168.100.2: icmp_seq&#61;1 ttl&#61;64 time&#61;0.275 ms
64 bytes from 192.168.100.2: icmp_seq&#61;2 ttl&#61;64 time&#61;0.047 ms
64 bytes from 192.168.100.2: icmp_seq&#61;3 ttl&#61;64 time&#61;0.043 ms
^C
--- 192.168.100.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2008ms
rtt min/avg/max/mdev &#61; 0.043/0.121/0.275/0.109 ms


2、关于docker网络命名空间的问题

  当 docker 容器被创建出来后&#xff0c;你会发现使用 ip netns 命令无法看到容器对应的网络命名空间。这是因为 ip netns 命令是从 /var/run/netns 文件夹中读取内容的&#xff0c;而 docker 容器的网络命名空间不是在 /var/run/netns 下&#xff0c;而是位于 /proc/[pid]/ns/net。想要使用 ip netns 命令去管理 docker 容器的网络命名空间&#xff0c;就需要将它的网络命名空间显示在 /var/run/netns 目录下&#xff0c;那就要先找到容器的网络命名空间在哪里&#xff0c;然后做一个软链接即可。

首先查询容器的PID。

root&#64;cp:~# docker inspect --format &#39;{{.State.Pid}}&#39; web
4775

然后创建软链接&#xff0c;建议指定在 /var/run/netns/ 中的名字&#xff0c;因为每个容器都是net。

root&#64;cp:~# ln -s /proc/4775/ns/net /var/run/netns/web
root&#64;cp:~# ip netns ls
web (id: 0)
test2 (id: 2)
test1 (id: 1)

此时就可以用 ip netns 命令去管理 docker 容器的网络命名空间了。


推荐阅读
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了在Linux系统中设置文件ACL权限的方法和使用说明,包括在centos7.3和centos6.9中开启ACL权限的两种方法:在挂载时指定打开ACL权限和修改默认的属性信息。同时提供了对ACL权限的详细解释和应用场景。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Linux磁盘的分区、格式化的观察和操作步骤
    本文介绍了如何观察Linux磁盘的分区状态,使用lsblk命令列出系统上的所有磁盘列表,并解释了列表中各个字段的含义。同时,还介绍了使用parted命令列出磁盘的分区表类型和分区信息的方法。在进行磁盘分区操作时,根据分区表类型选择使用fdisk或gdisk命令,并提供了具体的分区步骤。通过本文,读者可以了解到Linux磁盘分区和格式化的基本知识和操作步骤。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
无聊人生918_644
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有