(1)ip netns相关命令

1.增加虚拟网络命名空间

 
ip netns add ns
   该命令会在/var/run/netns目录下创建ns网络命名空间名


2.显示所有的虚拟网络命名空间

root@wade-ThinkCentre-E73:~# ip netns list
ns

  也可通过查看/var/run/netns目录下的文件来list,结果一样

root@wade-ThinkCentre-E73:~# ls /var/run/netns/
ns
 
3.进入虚拟机网络环境

 ip netns exec ns bash  #打开虚拟网络环境ns的bash窗口
 ip addr #显示所有虚拟网络环境的设备
 exit #退出该网络虚拟环境

 
4.增加一对veth虚拟网卡
 ip link add type veth
 
5.将veth0添加到ns虚拟网络环境
ip link set veth0 netns ns
 
6.将虚拟网卡veth1改名并添加到net1虚拟网络环境中
ip link set dev veth1 name net1-bridge netns net1
 
 
7.设置虚拟网络环境ns的veth0设备处于激活状态
ip netns exec ns ip link set veth0 up
 
8.为虚拟网络环境ns的veth0设备增加IP地址

ip netns exec ns ip address add 10.0.1.1/24 dev veth0


(2)/proc/[pid]/ns文件

从3.8版本的内核开始,用户就可以在/proc/[pid]/ns文件下看到指向不同命名空间(namespace)号的文件,[4026532791] 即为namespace号。

root@wade-ThinkCentre-E73:/proc/5787/ns# ll
总用量 0
dr-x--x--x 2 root root 0  8月 31 16:13 ./
dr-xr-xr-x 9 root root 0  8月 31 12:41 ../
lrwxrwxrwx 1 root root 0  8月 31 16:36 ipc -> ipc:[4026532791]
lrwxrwxrwx 1 root root 0  8月 31 16:36 mnt -> mnt:[4026532915]
lrwxrwxrwx 1 root root 0  8月 31 16:13 net -> net:[4026532845]
lrwxrwxrwx 1 root root 0  8月 31 16:36 pid -> pid:[4026532917]
lrwxrwxrwx 1 root root 0  8月 31 16:36 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0  8月 31 16:36 uts -> uts:[4026532916]
如果两个进程指向的namespace编号相同,就说明他们在同一个namespace下。/proc/[pid]/ns的另外一个作用是,一旦文件被打开,只要打开的文件描述符(fd)存在,那么就算PID所属的所有进程都已经结束,创建的namespace就会一直存在。那如何打开文件描述符呢?把/proc/[pid]/ns目录挂载起来或者软链接就可以达到这个效果,命令如下。

挂载
# touch ~/net
# mount --bind /proc/$pid/ns/net ~/net

软链接

#ln -sf /proc/$pid/ns/net "/var/run/netns/${name}"

在使用docker的过程中我们可以使用如下命令达到操作容器的网络的目的

ln -sf /proc/$pid/ns/net "/var/run/netns/${container_name}" //$pid 为docker容器pid

ip netns exec "${container_name}"  `command`

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐