在 Linux 环境中,当我们从多网口的主机向外发出流量时,我们可以使用 路由表 ( route ),策略路由 ( ip rule ), 以及 iptables 来控制报文的流向。这些方法既可以根据 IP 五元组(source IP, dest IP, source port, dest port, TCP/UDP),也可以根据网卡接口(eth0 ~ ethx)来设置报文的发送规则。或是,创建 socket 后,将基绑定在 eth接 口 上。
但是,如果要求指定的业务进程产生,或处理的流量通过指定的网卡接口进行收发。那么就意味着,需要基于报文的进程特征来确定分发路径。IP 报文中显然是不可能带有这样的信息。解决的方案有很多种, 一种很意思的方案是 netns.
netns 是 docker 的网络虚拟化支持技术。 虽然,docker是最近开始流行的轻量级虚拟化技术,但是 netns 是很早就被引入到了 Linux 中。事实上, netns 是 namespace (命名空间)技术的网络部分。 namespace 是 linux 内核在 task_struct中对进程组管理的基础机制。进程可以在任意的命名空间里被创建, 也可以被任意的换入换出。 这个功能的实现,是通过在 task_struct 结构中(可以视为操作系统课程中的 PCB 概念),保存了进程所处的 namespace 来实现了。本质上,namespace 是一个虚拟的概念