一:Linux namespace
Linux内核实现namespace的一个主要目的,就是实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知,仿佛置身于一个独立的系统环境中,以达到独立和隔离的目的。
二:network namespace
Network namespace主要提供了关于网络资源的隔离,包括网络设备,IPv4和IPv6协议栈,IP路由表,防火墙,/proc/net目录,/sys/class/net目录,套接字(socket)等。一个物理的网络设备最多存在于一个network namespace中,可以通过创建veth pair(虚拟网络设备对:有两端,类似管道,如果数据从一端传入另一端也能接收到,反之依然)在不同的network namespace间创建通道,以达到通信目的。
一般情况下,物理网络设备都分配在最初的root namespace(系统默认的namespace)中,但是如果有多块物流网卡,也可以把其中一块或多块分配给新创建的network namespace.
当说到network namespace时,指的是把网络独立出来,给外部用户一种透明的感觉,仿佛在与一个独立网络实体进行通信。 容器的经典做法就是创建一个veth pair,一端放置在新的namespace中,通常命名为eth0;一端放在原先的namespace中连接物理网络设备,再通过把多个设备接入网桥或者进行路由转发,来实现通信的目的。
三:ip netns命令
1. 创建一个network namespace
ip netns add nstest
2. 列出系统中已存在的network namespace
Ip netns list
3. 删除一个network namespace
Ip netns delete nstest
4. 在network namespace中执行一条命令:ip netns exec
如:ip netns exec nstest ip addr
5. 启动network namespace中的回环设备
ip netns exec nstest ip link set dev lo up
6. 在主机上创建两张虚拟网卡veth-a和veth-b
ip link add veth-a type veth peer name veth-b
7. 将veth-b设备添加到nstest这个network namespace中,veth-a留在主机中。
ip link set veth-b netns nstest 此时nstest就有了两块网卡lo和veth-b8. 在主机上为veth-a配置IP并启动
ip addr add 10.0.0.1/24 dev veth-a
ip link set dev veth-a up
9. 为nstest中的veth-b配置IP并启动
ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b
ip netns exec nstest ip link set dev veth-b up
10. 在主机中查看路由: ip route
11.在 nstest中查看路由信息:ip netns exec nstest ip route
这两条路由表明的意义是目的地址为10.0.0.0/24网络的IP分别从veth-a和veth-b发出。
12. 测试连通性:现在nstest这个network namespace有了自己的网卡,IP地址,路由表等信息:
Ping 10.0.0.2ip netns exec nstest ping 10.0.0.1
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-2146319/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28624388/viewspace-2146319/