手记

Linux network namespace 学习

  • 在同一台主机上,不同的进程是共享内核资源的。但是,整体资源是有限的,分配不合理势必会相互影响。Linux中提出了namespace机制,来解决资源隔离问题。
  • namespace,即命名空间。最简单的理解就相当于文件夹,对于文件名为 foo 的文件只能在文件夹 bar0 出现一次,却可以在文件夹 bar1 再次出现,表现为 /xxx/bar0/foo 和 /xxx/bar1/foo。访问 namespace 下的资源时, 同样要加上 namespace 。Linux下能用 namespace 隔离的资源有多种,network namespace 是比较常用的一种。

ip netns 命令

查看帮助

$ ip netns help
Usage: ip netns list	# 列出主机上所有的 ns
       ip netns add NAME	# 新增一个 ns
       ip netns set NAME NETNSID	# 给 ns 设置 id 
       ip [-all] netns delete [NAME]	# 删除一个 ns
       ip netns identify [PID]	# 查看进程所在 ns
       ip netns pids NAME	# 查看 ns 中所有进程
       ip [-all] netns exec [NAME] cmd ...	# 在 ns 中运行命令
       ip netns monitor	# 监控 ns 的创建
       ip netns list-id	# 列出所有 ns 的 id

直连

# 创建
sudo ip netns add host01
sudo ip netns add host02

# 创建一对 veth 设备
sudo ip link add veth1.1 type veth peer name veth1.2

# veth1.1 加入 host01 改名 eth0
sudo ip link set veth1.1 netns host01
sudo ip netns exec host01 ip link set veth1.1 name eth0
sudo ip netns exec host01 ifconfig eth0 10.0.0.1/24 up
sudo ip netns exec host01 ifconfig lo up

# veth1.2 加入 host02 改名 eth0
sudo ip link set veth1.2 netns host02
sudo ip netns exec host02 ip link set veth1.2 name eth0
sudo ip netns exec host02 ifconfig eth0 10.0.0.2/24 up
sudo ip netns exec host02 ifconfig lo up

查看

sudo ip netns exec host01 ip a
sudo ip netns exec host02 ip a
sudo ip netns exec host01 ping 10.0.0.2
sudo ip netns exec host02 ping 10.0.0.1

桥接

sudo ip netns add host01
sudo ip netns add host02
sudo ip netns exec host01 ifconfig lo up
sudo ip netns exec host02 ifconfig lo up

sudo ip link add veth1.1 type veth peer name veth1.2
sudo ip link add veth2.1 type veth peer name veth2.2

sudo brctl addbr br0
sudo ip link set br0 up 
sudo brctl addif br0 veth1.1
sudo brctl addif br0 veth2.1
sudo ip link set veth1.1 up 
sudo ip link set veth2.1 up 

sudo ip link set veth1.2 netns host01
sudo ip netns exec host01 ip link set veth1.2 name eth0
sudo ip netns exec host01 ifconfig eth0 10.1.0.1/24 up

sudo ip link set veth2.2 netns host02
sudo ip netns exec host02 ip link set veth2.2 name eth0
sudo ip netns exec host02 ifconfig eth0 10.1.0.2/24 up

删除

sudo ip link set br0 down
sudo brctl delbr br0
sudo ip netns del host01
sudo ip netns del host02
1人推荐
随时随地看视频
慕课网APP