Linux Namespace
Linux Namespace 是 Linux 内核提供的一种机制,用于实现进程之间的隔离。通过使用 Namespace,可以将一组进程和资源限制在一个隔离的环境中,使它们看起来像在独立的系统上运行一样。
PID Namespace(进程隔离):
PID Namespace 为进程提供了独立的进程 ID 空间,使得每个 Namespace 内的进程 ID 是唯一的,且从 1 开始计数。这样,每个 Namespace 中的进程看到的进程列表只包含该 Namespace 内的进程。
Network Namespace(网络隔离):
Network Namespace 提供了独立的网络栈,包括网络设备、IP 地址、路由表等。这使得不同的 Namespace 可以拥有自己独立的网络配置,实现网络资源的隔离。
Mount Namespace(挂载隔离):
Mount Namespace 提供了独立的文件系统挂载点。每个 Namespace 可以拥有自己的挂载点和挂载状态,使得不同的 Namespace 可以独立地挂载文件系统或分享文件系统。
UTS Namespace(主机名隔离):
UTS Namespace 允许每个 Namespace 内拥有独立的主机名和域名信息。这样,不同的 Namespace 内的进程可以具有不同的主机名和域名。
IPC Namespace(进程间通信隔离):
IPC Namespace 提供了独立的进程间通信资源,例如消息队列、信号量和共享内存。这使得不同的 Namespace 中的进程无法相互干扰。
User Namespace(用户隔离):
User Namespace 允许将不同 Namespace 内的用户映射到不同的 UID 和 GID。这样,不同 Namespace 内的用户可以拥有相同的 UID 和 GID,但在全局范围内是唯一的。
NET网络名称空间隔离测试
NET网络名称空间测试案例:
(1)创建一个名称为"net-test-linux"的网络名称空间
ip netns add net-test-linux
ll /var/run/netns/net-test-linux
ip netns exec net-test-linux ip a
(2)启动"net-test-linux"的网络名称空间的网卡
ip netns exec net-test-linux ping 127.0.0.1 # 未启动网卡,无法ping通自己。
ip netns exec net-test-linux ifconfig lo up
ip netns exec net-test-linux ping 127.0.0.1
(3)宿主机创建网络设备对
ip link add veth100 type veth peer name veth200
ip a # 会多出来2块网卡,即veth100,veth200。
(4)将"veth200"设备关联到咱们自定义的"net-test-linux"网络名称空间
ip link set veth200 netns net-test-linux
ip a # 你会发现宿主机的veth200不见了
(5)将"veth200"设备配置IP地址
ip netns exec net-test-linux ip a
ip netns exec net-test-linux ifconfig veth200 172.31.100.200/24 up
ip netns exec net-test-linux ip a
(6)宿主机veth100也配置IP地址
ifconfig veth100 172.31.100.100/24 up
ifconfig veth100
ping 172.31.100.200
(7)net-test-linux"的网络名称空间ping宿主机的IP地址
ip netns exec net-test-linux ping 172.31.100.100
ip netns exec net-test-linux ping 10.0.0.102 # 未添加网关,无法跨网段ping通
ip netns exec net-test-linux route add default gw 172.31.100.100 # 配置默认网关
ip netns exec net-test-linux ping 10.0.0.102 # Duang~可以ping通啦!
ip netns exec net-test-linux ping baidu.com # 无法访问外网,这是正常的!此处建议pingIP地址,域名解析需要DNS。
tcpdump -i veth100 -nn icmp # 宿主机可以抓取到数据报文。
ip netns exec net-test-linux iptables -vnL -t nat # 如果想要连接外网,可以尝试手动配置NAT。
(8)测试完成后,删除名称空间
ll /var/run/netns/ # 可以先查看挂载点文件是否存在
ip netns del net-test-linux # 删除名称空间
ll /var/run/netns/
ip link del veth100 # 删除宿主机的虚拟网卡