LINUX ip-netns 解析与使用(网络命名空间的原理)

提示: ip-netns - process network namespace management


前言

ip-netns(8) — Linux manual page。


ip [ OPTIONS ] netns { COMMAND | help }

   ip netns [ list ]

   ip netns add NETNSNAME

   ip netns attach NETNSNAME PID

   ip [-all] netns del [ NETNSNAME ]

   ip netns set NETNSNAME NETNSID

   NETNSID := auto | POSITIVE-INT

   ip netns identify [ PID ]

   ip netns pids NETNSNAME

   ip [-all] netns exec [ NETNSNAME ] command...

   ip netns monitor

   ip netns list-id [ target-nsid POSITIVE-INT ] [ nsid POSITIVE-INT ]

一、网络命名空间(netwrok namespace)是什么?

一、

  1. 一个网络命名空间实际上是逻辑意义的网络协议栈的一份拷贝,加上独有的路由,防火墙规则,以及网络设备,
  2. 默认一个进程所属的网络命名空间是从该进程的父进程继承而来。最初所有的进程都是共享同一个网络命名空间的,从init进程而来,也就是我们所说的1号进程。
  3. 按照约定,一个网络命名空间是一个可以打开的(open)对象(object)放置于/var/run/netns/NAME(可以理解成一个对象文件)
  4. 从这个路径打开(open)这个文件(也就是网络命名空间的文件)将产生一个有关于这个网络命名空间的文件描述符
  5. 保持这个文件描述符处于open状态将保持这个命名空间处于生存状态。
  6. 这个文件描述符可以与setns(int setns(int fd, int nstype); 将线程与命名空间关联的一个系统调用的函数)一同使用,去更改该网络命名空间对应的任务。
    二、
    对于那些知道网络命名空间的程序,有一个约定是优先从/etc/netns/NAME/寻找全局的网络配置文件,再从/etc/.中寻找。举个例子如果你想为你的网络命名空间使用一个不同于/etc/resolv.conf版本的配置将你的vpn隔离开,你必须将这个命名空间的配置写在/etc/netns/myvpn/resolv.conf.

二、使用步骤

1.ip netns exec

该指令为配置的自动化处理,意思是为无法意识到应用程序的网络命名空间文件约定:文件可以通过创建一个挂载并且将每个命名空间的配置文件绑定到他们在/etc路径下的最传统的位置。

2. ip netns list - show all of the named network namespaces

该指令将展示所有位于/var/run/netns下的网络命名空间

3. ip netns add NAME - create a new named network namespace

如果 /var/run/netns下没有NAME(命名空间的名字),该指令就将新建一个网络命名空间。并且名字为NAME

4.ip netns attach NAME PID - create a new named network namespace

如果 /var/run/netns下没有NAME(命名空间的名字),该指令将进程PID的网络名称空间附加到NAME,就像它是使用ip netns创建的一样。

5.ip [-all] netns delete [ NAME ] - delete the name of a network

如果NAME存在于/var/run/netns中,则将其卸载并将其的挂载点移除。如这个是网络命名空间的最后一个使用者。该网络命名空间将被释放,并且在该网络命名空间下的物理设备将被移动到默认的网络命名空间(也就是全局的),否则的话只有当该命名空间没有没有其他使用者且没有其他挂载点时才能被删除(如 ip netns exec指令)。

如果使用 -all 选项将会删除所有命名空间。
ip -all netns delete

有可能会出现物理设备丢失的情况当设备向netns移动的过程中,但是这个网络命名空间正在被进程删除如下:

 $ ip netns add net0
 $ ip link set dev eth0 netns net0
 $ ip netns exec net0 SOME_PROCESS_IN_BACKGROUND
 $ ip netns del net0

只有在SOME_PROCESS_IN_BACKGROUND退出或者被杀死之后,eth0才会出在默认命名空间。为了防止这种情况,你必须将运行在该命名空间关联的进程杀死,在杀死命名空间之前。

$ ip netns pids net0 | xargs kill
$ ip netns del net0

6.ip netns set NAME NETNSID - assign an id to a peer network namespace

这个命令将为网络命名空间分配一个ID,这个ID仅在当前的网络命名空间内有效。
如果指定了关键字“ auto”,则将选择一个可用的nsid。 内核将在某些网络链接消息中使用此ID。如果内核需要时未分配ID,则内核会自动分配该ID。 分配后,将无法更改。

7.ip netns identify [PID] - Report network namespaces names for process

此命令遍历/ var / run / netns并查找指定进程的网络名称空间的所有网络名称空间名称,如果未指定PID,则将使用当前进程。

8.ip netns pids NAME - Report processes in the named network namespace

此命令遍历proc并查找所有具有命名网络命名空间作为其主要网络名称空间的进程。

9.ip [-all] netns exec [ NAME ] cmd … - Run cmd in the named network

此命令允许不知道网络命名空间的应用程序在默认网络命名空间之外的其他程序中运行,并且指定网络命名空间的所有配置都出现在惯常的全局位置中。网络命名空间和绑定安装用于将文件从其网络中移出 将网络命名空间特定的位置恢复为其默认位置,而不影响其他进程。如果指定了-all选项,则即使在其中某些cmd失败的情况下,cmd也会在每个命名的网络命名空间上同步执行。 网络命名空间名称打印在每个执行的cmd上。

10.ip netns monitor - Report as network namespace names are added and

此命令监视网络命名空间名称添加和
删除事件,并为它看到的每个事件打印一行。

11.ip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT] - list network namespace ids (nsid)

网络命名空间ID用于标识对等网络名称空间。 此命令显示当前网络名称空间的nsid,并提供相应的iproute2 netns名称(来自/ var / run / netns)(如果有的话).target-nsid选项用于显示指定网络名称空间的nsid,而不是当前网络名称空间。 此target-nsid是当前网络名称空间中的nsid。nsid选项可仅显示此nsid。 它是当前网络名称空间中的nsid。 与target-nsid选项结合使用,它可以将特定的nsid从当前网络名称空间转换为target-nsid网络名称空间的nsid。

总结

EXAMPLES top
ip netns list
Shows the list of current named network namespaces
ip netns add vpn
Creates a network namespace and names it vpn
ip netns exec vpn ip link set lo up
Bring up the loopback interface in the vpn network namespace.
ip netns add foo
ip netns add bar
ip netns set foo 12
ip netns set bar 13
ip -n foo netns set foo 22
ip -n foo netns set bar 23
ip -n bar netns set foo 32
ip -n bar netns set bar 33
ip netns list-id target-nsid 12
Shows the list of nsids from the network namespace foo.
ip netns list-id target-nsid 12 nsid 13
Get nsid of bar from the network namespace foo (result is 23).

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

举世无双勇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值