Docker前传之linux iptables – paulliu – 简书

Docker前传之linux iptables – paulliu – 简书

如果要深入了解docker的网络配置,那就得先了解iptables。本文接下来会从0到1的说说iptables。

什么是iptables

iptables是linux自带的一款开源的内核级基于数据包过滤的防火墙。利用iptables可以实现诸如数据包过滤、转发等功能。

基本概念

iptables包含表,表中包含链,链中包含规则。(规则指的是一条条用于过滤数据包的语句)
iptables共有四个表五个链,简称四表五链。
四表指的是filter, nat, mangle, raw。其中前2个是用的最多的,后面2个用的较少,raw可以说基本不怎么使用。
五链指的是INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING。(注意,链名用大写。)

下表列出了三个常用表中包含的链:


下面介绍常用的filter表和nat表。

filter表

过滤数据包,用于本机防火墙,这是默认表。
包含的三个链,
INPUT 链:用于过滤所有目标地址是本机的数据包
OUTPUT 链:用于过滤所有本机产生的数据包
FORWARD链:用于过滤所有路过本机的数据包

nat表

网络地址转换(Network Address Translation)。
包含的三个动作,
DNAT:改变数据包的目的地址使包能重路由到某台机器,使公网能够访问局域网内的服务器
SNAT: 改变数据包的源地址,使局域网能访问公网
MASQUERADE:假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口IP都会改变,SNAT就无法使用。而MASQUERADE作用就是将IP伪装成为封包出去的那块装置上的IP,MASQUERADE会自动读取ip地址然后做SNAT出去。
包含的三个链,
PREROUTING链:数据包到达防火墙时改变包的目的地址。
OUTPUT链:改变本地产生数据包的目标地址。
POSTROUTING:在数据包离开防火墙时改变数据包的源地址。

原理浅析

如下图,当请求主机的某个服务时,需要经过iptables中的匹配规则,由上到下层层过滤。


下图描述了一个数据包在linux内核的处理流程。



对于收到的每个数据包,都从A点进来,经过路由判决(分析数据包的目的地址),如果是发送给本机的就经过B点,然后传递给进程处理;否则就经过C点,然后顺着E点将该包转发出去。
对于发送的每个数据包,也有一个路由判决,以确定该包是从哪个接口出去,然后经过D点,最后也是顺着E点将该包发送出去。
图中ABCDE五个点就是上面提到的五个链,如下图:



再详细点,在上图中添加表,那就变为下图:

从该图可以总结出:

  1. 四表其实是对链进一步划分出了4类,且每类在执行上有着不同的优先级。对于一个数据包,四个表中的规则处理的优先级:raw>mangle>nat>filter。
  2. 真正让防火墙起作用的是规则,而五表其实是5个hook点,规则在这5个点执行。

为了精简,将该图中不太常用的mangle表去掉,剩下的表和链也是最常用的,如下图:


上图中,上面的弧线所在的路径,常用来配置主机防火墙,而下面的从左到右的直线,是用来做nat的,docker默认的网络配置即通过该路径。

总结一下iptables的用途:
利用filter表作为主机防火墙;
利用nat表的POSTROUTING链,使局域网内的机器上网;
利用nat表的PREROUTING链,将外部socket映射为内部socket;

下一节中将描述docker默认的nat网络配置。