netns(linux net namespace)
在逻辑上是网络堆栈
的一个副本,它有独立的路由
、防火墙
和网络设备
,用来隔离网络。在云计算中,通过 netns
使一台机器可以模拟数多台服务器以及路由器的网络环境。
特点
- 每个网卡(如eth0)都属于某个
netns
,如果不显式地指定,则eth0属于默认 netns
- 如果进程运行在
netns
中,那么它只能看到该 netns
中的进程
- 不同的
netns
有不同的 iptables
- 不同的
netns
有不同的路由表,当你想让一个 destination ip
在不同场景下走不同的路由时,netns
就发挥了作用
工具包
linux net namespace
操作的工具有 iproute
提供,使用 ip netns
操作 netns。
help
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
ip netns add ns1
可以创建一个完全隔离的新网络环境,该环境包括一个独立的网卡空间
、路由表
、ARP表
、ip地址
、iptables
、ebtables
等。总之,与网络有关的组件都是独立的。
$ ip netns list
ns1
查看我们刚才创建的 netns
ip netns del ns1
$ ip netns exec ns1 `command`
$ ip netns exec ns1 ip link
此处执行命令,和如下两处十分相似,可供扩展:
$ ip netns exec ns1 bash
$ ip addr show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
使用上述命令,可以在新的网络环境中打开一个shell
,可以看到,新的网络环境里面只有一个lo设备
,并且该lo设备
与外面的lo设备
是相互隔离的。
通过如下命令,可以指定命令前面的提示符:
$ ip netns exec ns1 bash -rcfile <(echo "PS1=\"ns1> \"")
- 其他与 OpenvSwitch 配置使用见:TODO(xiexianbin)
特殊说明
netns
可以对网络设备进行隔离
$ ls -lhart /sys/class/net
total 0
drwxr-xr-x 2 root root 0 Mar 18 03:37 .
lrwxrwxrwx 1 root root 0 Mar 18 03:37 ovs-system -> ../../devices/virtual/net/ovs-system
lrwxrwxrwx 1 root root 0 Mar 18 03:37 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Mar 18 03:37 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx 1 root root 0 Mar 18 03:37 docker0 -> ../../devices/virtual/net/docker0
lrwxrwxrwx 1 root root 0 Mar 18 03:37 br0 -> ../../devices/virtual/net/br0
drwxr-xr-x 54 root root 0 Mar 18 03:37 ..
ip netns add ns1
ip link set br0 netns ns1
- 查看:
br0
只在 ns1
中,这也说明一个网络设备只能位于一个 netns
中。
$ ls -lhart /sys/class/net/
total 0
drwxr-xr-x 2 root root 0 Mar 18 03:37 .
lrwxrwxrwx 1 root root 0 Mar 18 03:37 ovs-system -> ../../devices/virtual/net/ovs-system
lrwxrwxrwx 1 root root 0 Mar 18 03:37 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 Mar 18 03:37 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx 1 root root 0 Mar 18 03:37 docker0 -> ../../devices/virtual/net/docker0
drwxr-xr-x 54 root root 0 Mar 18 03:37 ..
$ ip netns exec ns1 ls -lhart /sys/class/net/
total 0
drwxr-xr-x 2 root root 0 Mar 18 03:37 .
lrwxrwxrwx 1 root root 0 Mar 18 03:37 br0 -> ../../devices/virtual/net/br0
drwxr-xr-x 54 root root 0 Mar 18 03:37 ..
lrwxrwxrwx 1 root root 0 Mar 18 03:41 lo -> ../../devices/virtual/net/lo