网络命名空间
通过对网络资源的隔离,就能在一个宿主机上虚拟多个不同的网络环境。Docker正是利用了网络的命名空间特性,实现了不同容器之间的网络隔离。
命名空间的元素有:进程、套接字、网络设备。
- 网络设备:它的特征决定它是否可以在命名空间移动
网络命名空间的实现
建立了新的网络命名空间,并将某个进程关联到这个网络命名空 间后,就出现了类似于如图7.1所示的内核数据结构,所有网站栈变量 都被放入了网络命名空间的数据结构中。这个网络命名空间是其进程组 私有的,和其他进程组不冲突。
所有的网络设备(物理的或虚拟接口、桥等在内核里都叫作Net Device)都只能属于一个命名空间。当然,物理设备(连接实际硬件的 设备)通常只能关联到root这个命名空间中。虚拟的网络设备(虚拟的 以太网接口或者虚拟网口对)则可以被创建并关联到一个给定的命名空 间中,而且可以在这些命名空间之间移动。
网络命名空间的操作
- 创建一个命名空间:
ip netns add <name>
- 在命名空间中执行命令:
ip netns exec <name> <command>
- 也可以先通过bash命令进入内部的shell界面,然后执行各种命令:
ip netns exec <name> bash
网络命名空间的使用技巧
在不同的网络命名空间之间转移设备,例如下面会提到的Veth设备对的转移。因为一个设备只能属于一个命名空间,所以转移后在这个命名空间中就看不到这个设备了。具体哪些设备能被转移到不同的命名空间呢?在设备里面有一个重要的属性:NETIF_F_ ETNS_LOCAL,如果这个属性为on,就不能被转移到其他命名空间中。
Veth设备对
Veth设备对是为了在不同的网络命名空间之间通信,利用它可以直接将两个网络命名空间连接起来。由于要连接两个网络命名空间,所以Veth设备都是成对出现的,很像一对以太网卡,并且中间有一根直连的网线。既然是一对网卡,那么我们将其中一端称为另一端的peer。在Veth设备的一端发送数据时,它会将数据直接发送到另一端,并触发另一端的接收操作。
Veth设备对的操作命令
Veth设备对如何查看对端
网桥
Linux网桥的实现
Linux可以支持多个不同的网络,它们之间能够相互通信,如何将这些网络连接起来并实现各网络中主机的相互通信呢?可以用网桥。网桥是一个二层的虚拟网络设备,把若干个网络接口“连接”起来,以使得网络接口之间的报文能够互相转发。网桥能够解析收发的报文,读取目标MAC地址的信息,和自己记录的MAC表结合,来决策报文的转发目标网络接口。为了实现这些功能,网桥会学习源MAC地址(二层网桥转发的依据就是MAC地址)。在转发报文时,网桥只需要向特定的网口进行转发,来避免不必要的网络交互。如果它遇到一个自己从未学习到的地址,就无法知道这个报文应该向哪个网络接口转发,就将报文广播给所有的网络接口(报文来源的网络接口除外)。
网桥的常用操作命令
iptables和Netfilter
在Linux网络协议栈中有一组回调函数挂接点,通过这些挂接点挂 接的钩子函数可以在Linux网络栈处理数据包的过程中对数据包进行一 些操作,例如过滤、修改、丢弃等。整个挂接点技术叫作Netfilter和 iptables。
- Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中
- iptables是在用户模式下运行的进程,负责协助和维护内核中Netfilter 的各种规则表。二者互相配合来实现整个Linux网络协议栈中灵活的数 据包处理机制。
处理规则
挂节点
INPUT、PREOUTING、FORWARD、OUTPUT、POSTROUTING
表类型
RAW、MANGLE、NAT和FILTER。优先级从高到低。
匹配参数
匹配的参数用于对数据包或者TCP数据连接的状态进行匹配。当有多个条件存在时,它们一起发挥作用,来达到只针对某部分数据进行修
改的目的。常见的匹配参数如下。
- 流入、流出的网络接口。
- 来源、目的地址。
- 协议类型。
- 来源、目的端口。
匹配动作
一旦有数据匹配,就会执行相应的动作。动作类型既可以是标准的
预定义的几个动作,也可以是自定义的模块注册的动作,或者是一个新
的规则链,以便更好地组织一组动作。
路由
路由功能由IP层维护的一张路由表来实现。当主机收到数据报文 时,它用此表来决策接下来应该做什么操作。当从网络侧接收到数据报 文时,IP层首先会检查报文的IP地址是否与主机自身的地址相同。如果 数据报文中的IP地址是主机自身的地址,那么报文将被发送到传输层相 应的协议中。如果报文中的IP地址不是主机自身的地址,并且主机配置 了路由功能,那么报文将被转发,否则,报文将被丢弃。
- 目的IP地址:此字段表示目标的IP地址。这个IP地址可以是某 主机的地址,也可以是一个网络地址。如果这个条目包含的是一个主机 地址,那么它的主机ID将被标记为非零;如果这个条目包含的是一个网 络地址,那么它的主机ID将被标记为零。
- 下一个路由器的IP地址:这里采用“下一个”的说法,是因为 下一个路由器并不总是最终的目的路由器,它很可能是一个中间路由 器。条目给出的下一个路由器的地址用来转发在相应接口接收到的IP数 据报文。
- 标志:这个字段提供了另一组重要信息,例如,目的IP地址 是一个主机地址还是一个网络地址。此外,从标志中可以得知下一个路 由器是一个真实路由器还是一个直接相连的接口。
- 网络接口规范:为一些数据报文的网络接口规范,该规范将 与报文一起被转发。