iptables是什么
iptables 是运行在Linux用户空间的应用软件,通过控制 Linux 内核 netfilter 模块来管理网络数据包的流动和流转。通常 iptables 都需要内核层级的模块来配合运作,Xtables 是主要在内核层级里面 iptables API 运作功能的模块。因此 iptables 需要用到超级用户的权限。
iptables的表(tables)和链(chain)
Linux 的 iptables 至少有3个表,包括管理本机进出的 filter、管理后端主机(防火墙内部的其他服务器)的 nat、管理特殊标志使用的 mangle(使用较少)。每种表与其中链的用途分别是:
- filter(过滤器):主要是跟进入 Linux 本机的数据包有关,是 iptables 默认的 tables。
- INPUT:主要跟进入 Linux 本机的数据包有关。
- OUTPUT:主要跟 Linux 本机所要送出的数据包有关。
- FORWARD:与 Linux 本机无关,主要是用来“转移数据包”到后端的服务器中,与下面 nat table 相关性较高。
- nat(地址转换):Network Address Translate的缩写,即地址转换。这个表主要用来在来源与目的 IP 或者 PORT的转换,与 Linux本机无关,主要与 Linux 主机后的局域网络内的服务器相关。
- PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)。
- POSTROUTING:在进行路由判断之后所有进行的规则(SNAT/MASQUERADE)。
- OUTPUT:与发送出去的数据包有关。
- mangle(整形者):这个表主要与特殊的数据包的路由标志有关,早期仅有 PREROUTING 和 OUTPUT 链。不过从 kernel 2.4.8 之后加入了 INPUT 和 FORWARD链。由于这个表与特殊的路由标志相关,在平时大部分使用环境中使用较少。
如果自己的 Linux 服务器作为 WWW 服务器,那么就要开放客户端对你的 WWW 服务器的请求要有响应,就得要处理 filter 表的 INPUT 链。如果自己的 Linux 服务器作为局域网内的路由器,那么就得分析 nat 表的各个链以及 filter 表的 FORWARD 链。也就是说,各类表的链之间是有关联关系的,见下图:
上图看起来很复杂,不过可以看出来 iptables 可以控制三种数据包的流向:
- 数据包进入 Linux 主机使用本机资源(路径A):在路由判断后确定是向 linux 本机请求的数据包,主要就会通过 filter 表的 INPUT链来控制。
- 数据包经由 Linux 主机的传递,没有使用本机资源,而是想后端主机流动(路径B):在路由判断之前进行数据包表头的修改,数据包主要是通过防火墙去向后端,此时数据包就会通过路径B来跑动。也就是说,数据包的目标并不是 Linux 本机。主要经过的链是 filter 表的 FORWARD 以及 nat 表的 PREROUTING 和 POSTROUTING。
- 数据包由 Linux 主机发送出去(路径C):例如响应客户端的请求,或者 Linux 本机主动送出的数据包,都是通过路径C来跑动。首先通过路由判断,决定了输出的路径后,再通过 filter 的 OUTPUT 链来传送。最后,还会通过 nat 表的 POSTROUTING。
由于 mangle 表用的较少,下图为去掉了 mangle 之后的简化图:
通过上图可以了解到,与本机相关的其实是 filter 表的 INPUT 和 OUTPUT 这两条链。如果 iptables 只是用来保护 Linux 本机的话,nat 规则就不需要设置,直接设定为开放即可。比如,Openstack 计算节点上的 iptables 规则就是如此。