近几年,Docker、Kubernetes等容器化技术和容器编排工具的兴起使技术人员从应用部署和维护的泥淖中解脱出来,同时也改变了很多很多互联网公司的技术架构。笔者近期也在学习Docker和Kubernetes,对这些新技术所带来的便捷性和安全性非常着迷,其中尤其对容器化技术的网络实现方式更为好奇。今天就把近期的对Linux虚拟网络技术的学习成果分享出来,希望能和大家一起交流学习。
Network Namespace
Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己都在独立的网络中。而且不同Network Namespace的资源相互不可见,彼此之间无法通信。如下图所示:
ip netns命令
可以借助 ip netns
命令来完成对 Network Namespace 的各种操作。 ip netns
命令来自于 iproute2
安装包,一般系统会默认安装,如果没有的话,读者自行安装。
注意: ip netns
命令修改网络配置时需要 sudo 权限。
可以通过 ip netns
命令完成对Network Namespace 的相关操作,可以通过 ip netns help
查看命令帮助信息:
-
$ ip netns help
-
Usage: ip netns list
-
ip netns add NAME
-
ip netns set NAME NETNSID
-
ip [-all] netns delete [NAME]
-
ip netns identify [PID]
-
ip netns pids NAME
-
ip [-all] netns exec [NAME] cmd ...
-
ip netns monitor
-
ip netns list-id
默认情况下,Linux系统中是没有任何 Network Namespace的,所以 ip netns list
命令不会返回任何信息。
创建Network Namespace
下面,我们通过命令创建一个名为 ns0
的命名空间:
-
$ ip netns add ns0
-
$ ip netns list
-
ns0
新创建的 Network Namespace 会出现在 /var/run/netns/
目录下。如果相同名字的 namespace 已经存在,命令会报 Cannotcreatenamespacefile"/var/run/netns/ns0":Fileexists
的错误。
对于每个 Network Namespace 来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。
操作Network Namespace
ip
命令提供了 ip netnsexec
子命令可以在对应的 Network Namespace 中执行命令。
-
查看新创建 Network Namespace 的网卡信息
-
$ ip netns exec ns0 ip addr
-
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
-
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
可以看到,新创建的Netw