文章目录
ip netns 相关的操作

ip netns 命令用来管理 network namespace。它可以创建命名的 network namespace,然后通过名字来引用 network namespace,所以使用起来很方便。
ip netns 命令格式如下:
ip [ OPTIONS ] netns { COMMAND | help }
可以通过 help 命令查看 ip netns 所有操作的帮助信息:
1 2 3 4 5 6 7 8 9 10 |
[root@controller ~]# ip netns help Usage: ip netns list ip netns add NAME ip netns set NAME NETNSID ip [-all] netns delete [NAME] ip netns identify [PID] ip netns pids NAME ip [-all] netns exec [NAME] cmd ... ip netns monitor ip netns list-id |
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。
1 2 3 4 5 6 7 8 9 |
[root@controller ~]# ls -l /var/run/netns/ total 0 -r--r--r-- 1 root root 0 Feb 23 16:32 qdhcp-da4be97a-ba00-4d26-8da3-20c35cb82cd1 -r--r--r-- 1 root root 0 Feb 23 16:32 qdhcp-e9e93b4c-6c74-43cd-a7ea-6d47b3750630 -r--r--r-- 1 root root 0 Feb 23 17:27 qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 -r--r--r-- 1 root root 0 Feb 23 16:33 qrouter-3edb1128-d3c4-4962-b0ff-30494a262d3e -r--r--r-- 1 root root 0 Feb 23 16:33 qrouter-48f56af2-8b30-44f6-b04b-d508e4fc5335 -r--r--r-- 1 root root 0 Feb 23 16:33 qrouter-689f770d-b581-421e-819c-d81cc10c6530 -r--r--r-- 1 root root 0 Feb 23 16:33 qrouter-d803363e-1690-4c75-8452-ef63d59d2cd2 |
显示所有命名的 network namespace
ip netns list 命令显示所有命名的 network namesapce,其实就是显示 /var/run/netns 目录下的所有 network namespace 对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@controller ~]# ip netns qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 (id: 14) qrouter-d803363e-1690-4c75-8452-ef63d59d2cd2 (id: 12) qrouter-689f770d-b581-421e-819c-d81cc10c6530 (id: 11) qrouter-48f56af2-8b30-44f6-b04b-d508e4fc5335 (id: 10) qrouter-3edb1128-d3c4-4962-b0ff-30494a262d3e (id: 9) qdhcp-da4be97a-ba00-4d26-8da3-20c35cb82cd1 (id: 8) qdhcp-e9e93b4c-6c74-43cd-a7ea-6d47b3750630 (id: 7) [root@controller ~]# ip netns list qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 (id: 14) qrouter-d803363e-1690-4c75-8452-ef63d59d2cd2 (id: 12) qrouter-689f770d-b581-421e-819c-d81cc10c6530 (id: 11) qrouter-48f56af2-8b30-44f6-b04b-d508e4fc5335 (id: 10) qrouter-3edb1128-d3c4-4962-b0ff-30494a262d3e (id: 9) qdhcp-da4be97a-ba00-4d26-8da3-20c35cb82cd1 (id: 8) qdhcp-e9e93b4c-6c74-43cd-a7ea-6d47b3750630 (id: 7) |
查看 network namespace 中进程的 PID
ip netns pids NAME 命令用来查看指定的 network namespace 中的进程的 PID。这个命令其实就是去检查 /proc 下的所有进程,看进程的 network namespace 是不是指定的 network namespace:
1 2 3 4 5 6 7 8 9 |
[root@controller ~]# ip netns pids qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 36372 385467 [root@controller ~]# ps -ef|grep 36372 nobody 36372 1 0 09:22 ? 00:00:00 dnsmasq --no-hosts --no-resolv --pid-file=/var/lib/neutron/dhcp/fc3c667c-0ae6-44bf-ba49-df295a138774/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/fc3c667c-0ae6-44bf-ba49-df295a138774/host --addn-hosts=/var/lib/neutron/dhcp/fc3c667c-0ae6-44bf-ba49-df295a138774/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/fc3c667c-0ae6-44bf-ba49-df295a138774/opts --dhcp-leasefile=/var/lib/neutron/dhcp/fc3c667c-0ae6-44bf-ba49-df295a138774/leases --dhcp-match=set:ipxe,175 --dhcp-userclass=set:ipxe6,iPXE --local-service --bind-dynamic --dhcp-range=set:subnet-a11a5ec1-cde3-4d5e-b97f-e87f9e1ef127,192.168.210.0,static,255.255.255.0,86400s --dhcp-option-force=option:mtu,1500 --dhcp-lease-max=256 --conf-file= --domain=openstacklocal root 63411 37849 0 09:31 pts/7 00:00:00 grep --color=auto 36372 [root@controller ~]# ps -ef|grep 385467 root 63556 37849 0 09:31 pts/7 00:00:00 grep --color=auto 385467 neutron 385467 1 0 Feb23 ? 00:00:01 haproxy -f /var/lib/neutron/ns-metadata-proxy/fc3c667c-0ae6-44bf-ba49-df295a138774.conf |
在指定的 network namespace 中执行命令
ip [-all] netns exec [ NAME ] cmd 命令用来在指定的 network namespace 中执行命令。比如我们要看一下某个 network namespace 中有哪些网卡:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[root@controller ~]# ip netns exec qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ns-4e4b6baa-1e@if90: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether fa:16:3e:36:59:c5 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.210.100/24 brd 192.168.210.255 scope global ns-4e4b6baa-1e valid_lft forever preferred_lft forever inet 169.254.169.254/16 brd 169.254.255.255 scope global ns-4e4b6baa-1e valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe36:59c5/64 scope link valid_lft forever preferred_lft forever # 查看网络命名空间的 端口信息 [root@controller ~]# ip netns exec qdhcp-fc3c667c-0ae6-44bf-ba49-df295a138774 netstat -anlp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 169.254.169.254:80 0.0.0.0:* LISTEN 385467/haproxy tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 36372/dnsmasq tcp 0 0 192.168.210.100:53 0.0.0.0:* LISTEN 36372/dnsmasq tcp 0 0 169.254.169.254:53 0.0.0.0:* LISTEN 36372/dnsmasq tcp6 0 0 ::1:53 :::* LISTEN 36372/dnsmasq tcp6 0 0 fe80::f816:3eff:fe36:53 :::* LISTEN 36372/dnsmasq udp 0 0 127.0.0.1:53 0.0.0.0:* 36372/dnsmasq udp 0 0 192.168.210.100:53 0.0.0.0:* 36372/dnsmasq udp 0 0 169.254.169.254:53 0.0.0.0:* 36372/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 36372/dnsmasq udp6 0 0 ::1:53 :::* 36372/dnsmasq udp6 0 0 fe80::f816:3eff:fe36:53 :::* 36372/dnsmasq Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ] DGRAM 2656387 385467/haproxy unix 2 [ ] DGRAM 21233486 36372/dnsmasq unix 2 [ ] DGRAM 21233503 36372/dnsmasq |
