iptables是netfilter项目的一部分,也常代指内核级防火墙。
基本概念
iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表 的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为 目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用 链 和 规则。很多新手面对复杂的 linux IP 路由时总是感到气馁,但是,实际上最常用的一些应用案例(NAT 或者基本的网络防火墙)并不是很复杂。
理解 iptables 如何工作的关键是这张图。图中在上面的小写字母代表 表,在下面的大写字母代表 链。从任何网络端口 进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptabales 对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到 停止,而另一些数据包是由本地进程生成的,因此在图中表现为从 发出,一直向下穿过该流程图。一份关于该流程图如何工作的详细解释请参考这里。
在大多数使用情况下都不会用到 raw,mangle 和 security 表。下图简要描述了网络数据包通过 iptables 的过程:

以上资料来源于ArchLinux iptables wiki,通过这张图,可以初步理解iptables 共组原理,但在配置的时候,出去具体的语法规则不谈,还是容易让人模糊。
个人理解,配置iptables之前,首先理解,数据是从一条条链流入的,无论是外部进入的数据,还是本机进程发起的数据,都是通过链,也可以说是规则来传播的。
然而,当我们配置iptables的时候,面向的是具体的表,表可以看做链或规则的集合,什么样的表里通过是么样的链一般情况下是确定的,只有这样,才可做到一目了然,有的放矢。比如filter表,用来做过滤,所以直接操作的链,便是input, forward, output。而用来做网络地址转换的nat表,可以处理各条链。
我们可以根据自己的需求来自定义链,通过加入各表已有链中生效。
比如当本机搭建了透明代理时,如何使本机通过该代理上网?
根据上图,本机所发出的数据包,必走output链,以及postrouting链路,具体配置的时候,只能配置在output链。强行配置在postrouting链会出错。
x_tables: ip_tables: REDIRECT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT
这样看来重定向功能是不允许配置在postrouting链路中。
根据上边那张图,很容易可以想到,如果我们这台机器充当路由的角色时,规则就应该配置在nat表的prerouting链中,很容易即可实现透明代理功能。