使用ip netns可创建隔离网络环境,如ip netns add ns1创建命名空间,通过veth pair连接主机与命名空间并配置IP和路由,实现通信。在 Linux 中,网络命名空间(Network Namespace)是实现网络隔离的核心机制之一,常用于容器技术(如 Docker)中。通过 ip netns 命令,可以创建、管理和操作独立的网络环境,使得不同命名空间中的网络栈(包括接口、路由、防火墙规则等)彼此隔离。
使用 ip netns 命令可以轻松创建和管理命名空间。
创建一个名为 ns1 的网络命名空间:
ip netns add ns1查看当前系统中所有网络命名空间:
ip netns list删除命名空间:
ip netns del ns1注意:删除命名空间会自动清理其中的网络资源(如果已挂载)。
使用 ip netns exec 可以在指定命名空间中运行命令。
ip netns exec ns1 ip link这会显示 ns1 中的网络接口列表。你也可以执行其他网络命令,如:
ip netns exec ns1 ip addr每个命名空间拥有独立的回环接口,但默认未启用。需手动开启:
ip netns exec ns1 ip
link set lo up
单独的命名空间无法与外部通信。通常使用虚拟以太网对(veth pair)将其连接到主机或其他命名空间。
创建一对虚拟网卡:
ip link add veth0 type veth peer name veth1将 veth1 分配给命名空间 ns1:
ip link set veth1 netns ns1为主机端的 veth0 配置 IP 并启用:
ip addr add 192.168.100.1/24 dev veth0在命名空间内配置 veth1:
ip netns exec ns1 ip addr add 192.168.100.2/24 dev veth1此时,ns1 可通过 veth0 与主机通信。若主机开启 IP 转发,还可访问外部网络。
ip netns 会将命名空间挂载到 /var/run/netns/ 目录下,即使没有运行中的进程,命名空间仍可保留。
例如,手动挂载一个未持久化的命名空间(通过 unshare 创建):
unshare --net=/var/run/netns/ns2 bash这样命名空间可被 ip netns 管理。
基本上就这些。通过命名空间 + veth + 路由,就能构建出完全隔离的网络环境,是实现容器网络的基础。不复杂但容易忽略细节,比如回环接口开启和子网规划。