linux network namespace 使用说明
环境信息
- Centos 7 5.4.239-1
Linux 的 namespace 的作用是 隔离内核资源
,目前主要实现了以下 namespace
mount namespace
- 文件系统挂载点UTS namespace
- 主机名IPC namespace
- POSIX 进程间通信消息队列PID namespace
- 进程 pid 数字空间network namespace
- networkuser namespace
- user ID 数字空间
其中,除了 network namespace
,其他 namespace 的操作需要使用 C 语言调用系统 API 实现。network namespace
的增删改查功能已经集成到了 Linux 的 ip
工具集的 netns
子命令中
Linux 里面的 namespace 给处在其中的进程造成 2 个错觉:
- 它是系统里面唯一的进程
- 它独享系统的所有资源
默认情况下,Linux 里面的所有进程处在和宿主机相同的 namespace ,即初始 namespace 里,默认享有全局系统资源。
network namespace 常用操作
network namespace 的增删改查功能已经集成到了 Linux 的 ip
工具集的 netns
子命令中,因此在 Linux 系统中,对 network namespace 的操作主要使用 ip netns
命令
ip netns help |
创建并查看 network namespace
使用以下命令创建名为 netns1
的 network namespace
ip netns add netns1 |
以下命令查看系统中的 network namespace
ip netns list |
新的 network namespace
创建后,系统会在 /var/run/netns/
下面生成一个同名的挂载点
ls -l /var/run/netns/ |
此挂载点的主要作用一方面是方便对 namespace 的管理,一方面是使 namespace 即使没有进程运行也能继续存在。
新的 network namespace
创建后,可以使用 ip netns exec
命令进入 namespace,做网络配置或者查询的工作。
ip netns exec
命令只能根据 network namespace 的名称进入 namespace
以下命令查询 netns1
的 network namespace
的 IP 地址信息
ip netns exec netns1 ip add |
默认的 network namespace
除了附带一个 lo
网卡外,没有任何其他网络设备,并且此 lo
接口还处于 DOWN
的状态,因此此回环网卡也是不可访问的。
ip netns exec netns1 ping 127.0.0.1 |
在此示例中,如果想启用本地回环地址,首先需要进入 namespace,将本地回环网卡的状态修改为 UP
ip netns exec netns1 ip link set dev lo up |
此时,namespace 中的 lo
网卡可以正常使用,但是因为 namespace 中没有其他网络设备,此 network namespace
无法和其他网络通信,要和其他网络通信,需要用到其他的网络技术,例如 veth pair
删除 network namespace
要删除 network namespace
,可以使用以下命令
ip netns delete netns1 |
上面这条命令并没有实际删除
netns1
这个network namespace
,它只是移除了这个 namespace 对应的挂载点(/var/run/netns/netns1
),只要里面的进程还运行着,network namespace
就会一直存在
veth pair
veth 是虚拟以太网(Virtual Ethernet)的缩写。veth 设备总是成对出现的,因此我们称之为 veth pair
,veth pair
的一端发送的数据会在另外一端接收。根据这一特性,veth pair
常被用于跨 network namespace
的通信,即分别将 veth pair
的 2 端放在不同的 network namespace
。