ip netns 命令用来管理 network namespace。它可以创建命名的 network namespace,然后通过名字来引用 network namespace,所以使用起来很方便。

ip netns 命令格式如下:
ip [ OPTIONS ] netns  { COMMAND | help }

可以通过 help 命令查看 ip netns 所有操作的帮助信息:

network namespace

network namespace 在逻辑上是网络堆栈的一个副本,它有自己的路由、防火墙规则和网络设备。
默认情况下,子进程继承其父进程的 network namespace。也就是说,如果不显式创建新的 network namespace,所有进程都从 init 进程继承相同的默认 network namespace。
根据约定,命名的 network namespace 是可以打开的 /var/run/netns/ 目录下的一个对象。比如有一个名称为 net1 的 network namespace 对象,则可以由打开 /var/run/netns/net1 对象产生的文件描述符引用 network namespace net1。通过引用该文件描述符,可以修改进程的 network namespace。

显示所有命名的 network namespace

ip netns list 命令显示所有命名的 network namesapce,其实就是显示 /var/run/netns 目录下的所有 network namespace 对象:

创建命名的 network namespace

ip netns add NAME 命令创建一个命名的 network namespace:

删除命名的 network namespace

ip [-all] netns del [ NAME ] 命令删除指定名称的 network namespace。如果指定了 -all 选项,则尝试删除所有的 network namespace。

注意,如果我们把网卡设置到了某个 network namespace 中,并在该 network namespace 中启动了进程:

$ sudo ip netns add net0
$ sudo ip link set dev eth0 netns net0
$ sudo ip netns exec net0 bash

在另一个 bash 进程中删除 network namespace net0:

$ sudo ip netns del net0

此时虽然可以删除 netowrk namespace,但是在进程退出之前,网卡一直会保持在你已经删除了的那个 network namespace 中。

查看进程的 network namespace

ip netns identify [PID] 命令用来查看进程的 network namespace。如果不指定 PID 就显示当前进程的 network namespace:

下面的命令指定了 PID:

查看 network namespace 中进程的 PID

ip netns pids NAME 命令用来查看指定的 network namespace 中的进程的 PID。这个命令其实就是去检查 /proc 下的所有进程,看进程的 network namespace 是不是指定的 network namespace:

在指定的 network namespace 中执行命令

ip [-all] netns exec [ NAME ] cmd 命令用来在指定的 network namespace 中执行命令。比如我们要看一下某个 network namespace 中有哪些网卡:

ip netns exec 后面跟着 namespace 的名字,比如这里的 neta,然后是要执行的命令,只要是合法的 shell 命令都能运行,比如上面的 ip addr 或者 bash。
更棒的是,执行的可以是任何命令,不只是和网络相关的(当然,和网络无关命令执行的结果和在外部执行没有区别)。比如下面例子中,执行 bash 命令之后,后面所有的命令都是在这个 network namespace 中执行的,好处是不用每次执行命令都要把 ip netns exec NAME 补全,缺点是你无法清楚知道自己当前所在的 shell,容易混淆:

通过 -all 参数我们可以同时在所有的 network namespace 执行命令:

输出中的 netns: 指示在某个 network namespace 中执行的结果。

监控对 network namespace 的操作

ip netns monitor 命令用来监控对 network namespace 的操作。比如我们删除一个 network namespace 时就会收到相应的通知:

理解 ip netns add 命令

我们通过下面的演示来理解 ip netns add 命令的本质。
查看默认 network namespace 的 ID:

$ readlink /proc/$$/ns/net

在 /var/run/netns 目录下创建一个用于绑定 network namespace 的文件,名为 mynet:

$ sudo mkdir -p /var/run/netns
$ sudo touch /var/run/netns/mynet

通过 unshare 命令创建新的 network namespace,并在新的 namespace 中启动新的 bash:

$ sudo unshare --net bash

查看新的 network namespace ID:

# readlink /proc/$$/ns/net

通过绑定挂载把当前 bash 进程的 network namespace 文件挂载到前面创建的 mynet 文件上:

# mount --bind /proc/$$/ns/net /var/run/netns/mynet
# ls -I /var/run/netns/mynet

通过 ls -I 命令可以看到文件 mynet 的 inode 号和 network namespace 的 ID 相同,说明绑定成功:

退出新创建的 bash,再检查一次 mynet 文件的 inode:

# exit
$ ls -I /var/run/netns/mynet

可以看出 mynet 文件的 inode 没有发生变化,说明我们使用了绑定挂载后,虽然新的 network namespace 中已经没有进程了,但这个新的 network namespace 还继续存在。

上面的一系列操作其实等同于执行了命令:sudo ip netns add mynet
下面的 nsenter 命令则等同于执行了命令: sudo ip netns exec mynet bash

$ sudo nsenter --net=/var/run/netns/mynet bash
# readlink /proc/$$/ns/net

通过 nsenter 命令新建了一个 bash 进程,并把它加入 mynet 所关联的 network namespace(net:[4026532616])。

从上面的示例可以看出,创建命名的 network namespace 其实就是创建一个文件,然后通过绑定挂载的方式将新创建的 network namespace 文件(/proc/$$/ns/net)和该文件绑定,就算该 network namespace 里的所有进程都退出了,内核还是会保留该 network namespace,以后我们还可以通过这个绑定的文件来加入该 network namespace。

参考:
ip netns man page
Linux Namespace系列(06):network namespace

Linux ip netns 命令的更多相关文章

  1. Linux 中 ip netns 命令

    通过 ip netns help 可以查看所有关于ip netns的命令: network namespace 在逻辑上是网络堆栈的一个副本,它有自己的路由.防火墙规则和网络设备. ip netns ...

  2. Linux下使用ip netns命令进行网口的隔离和配置ip地址

    1. 添加隔离标记符: ip netns add fd 2. 将指定网卡放入隔离中: ip link set eth1 netns fd 3. 在隔离环境下执行命令: ip netns exec fd ...

  3. 只获取linux ip的命令

    ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'

  4. linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...

  5. Linux防火墙:iptables禁IP与解封IP常用命令

    在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...

  6. Linux网卡高级命令、IP别名及多网卡绑定 转

    http://www.cnblogs.com/xiaoluo501395377/archive/2013/05/26/3100065.html 本篇随笔将详细讲解Linux系统的网卡高级命令.IP别名 ...

  7. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题

    VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr.Bcast.Mask) UP BROADCAST MULTICAST 问题 eth0:网络接口 ...

  8. linux IP 命令使用举例(转)

    ip 1.作用ip是iproute2软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具,例如ifconfig.route等,使用权限为超级用户.几乎所有的Linux发行版本都支持该命 ...

  9. 在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的.         在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开do ...

随机推荐

  1. Scala并发编程【快速入门】

    1.简介 Scala的actor提供了一种基于事件的轻量级线程.只要使用scala.actors.Actor伴生对象的actor()方法,就可以创建一个actor.它接受一个函数值/闭包做参数,一创建 ...

  2. VMware安装Centos7后有线线缆被拔出

    背景:在win10 系统中的虚机软件VMware Workstation中安装CentOS7桌面版,安装过程中没有设置网络 1.确认你win10系统打开了这两个服务:VMware DHCP Servi ...

  3. Sqlserver还原master

    net stop mssqlserver net start mssqlserver /m"SQLCMD" sqlcmd -s xx sqlcmd -s xx -U sa -P x ...

  4. JavaScript -- 时光流逝(四):js中的 Math 对象的属性和方法

    JavaScript -- 知识点回顾篇(四):js中的 Math 对象的属性和方法 1. Math 对象的属性 (1) E :返回算术常量 e,即自然对数的底数(约等于2.718). (2) LN2 ...

  5. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  6. LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)

    这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...

  7. JavaScript判断数据类型的方法

    typeof操作符 typeof 操作符作用:是用来检测变量的数据类型.对于值或变量使用 typeof 操作符会返回如下字符串. 数据类型undefined的判断示例 变量定义了但未初始化,就是und ...

  8. 关于CUDA,cuDNN,TF,CUDA驱动版本兼容问题

    实际工作当中,经常维护好几个项目的代码,不同项目依赖的TF版本不一致问题.网上找了好多资料,但是每次遇到的问题都不一样,每次都要去查(就是是一样的问题,解决办法也可能会不一样)每次踩坑无数,今天痛定思 ...

  9. 复制数据库的Shell命令

    mysqldump -h$host db_old -uroot -p$pass | mysql -h$host db_new -uroot -p$pass 管道符号,是unix一个很强大的功能,符号为 ...

  10. 小a与星际探索

    链接:https://ac.nowcoder.com/acm/contest/317/C来源:牛客网 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球.其中每个星球有一个能 ...