了解 iptables 的工作流程对于理解其各种命令和参数以及选项非常有帮助,也是设计 iptables 的基础。开启了 iptables 之后,所有通过系统网卡接口的数据都会经过 iptables 的检查和处理。iptables 就像是一道流水线,其各条规则就像是流水线上的技工,各规则按照一定的顺序排列在流水线上。所有进入 iptables 的数据包,在走这个流程的过程中会被各条规则检查。
每条规则包括匹配条件(如果不指定匹配条件则默认匹配所有)和处理方法 2 个部分。某规则看到有个数据包从流水线上过来了,就先看看是不是满足自己的匹配条件,不满足就让它继续往下游走;满足就按照自己的处理方法对其进行处理。
每个数据包最终的处理的结果只有这么 3 种,且必须为这 3 种中的一个,否则就是还没处理完:
- ACCEPT – 接受。如果被接受,一个数据包就可以从 iptables 中出来了,不用再接着被后面的规则检验。
- DROP – 丢弃。如果被丢弃,这个数据包就沉没了,直接从 iptables 的流水线上被拿下来扔掉。
- REJECT – 拒绝。如果被拒绝,这个数据包会被拒收,但是 iptables 会让希望告诉发送方它的数据包被扔掉了。也就是说,实际上这个数据包还是被扔掉了,但是系统会发送回去一个消息,告诉别人一声。
如果一个数据包得到了上面 3 种最终判决结果中的一个,它就会从 iptables 这条流水线上被请下来,否则就继续往下游走。
并不是每条规则都能给出上面的最终判决。如果不能给出最终判决,这条规则的操作有:
- 跳转(-j)- 有 2 个跳转方向:
- -j LOG – 做个记录,然后让数据包接着被下面的检查员检查;
- -j other_chain – 将数据包交给另一个链(other_chain)来处理,然后撒手不管。
- 撒手不管 – 这个数据包就流向下一个检查员,由后面的规则进行处置。
设计 iptables 的规则就是设计这么一条流水线,使用 iptables 的各种命令、参数和参数选项组合出满足自己需要的匹配规则并指定处理方式,同时考虑到 iptables 规则在流水线上的前后顺序。
一般采取的思路是,只“接受”满足我们要求的数据包,对于没有规则与之匹配的数据包,默认采取丢弃(或拒绝)操作(一般最后一条规则都是 -j DROP,不能处理的都给丢弃了)。不过也有人说,直接 DROP 不是太礼貌,可以选择 REJECT(丢弃并通知一声)。然而也有人说,既然没有匹配的规则,那多半说明这个数据包是“不正常的”,既然不正常,还给别人通知什么啊,直接丢了拉倒。所以还是设计一个比较严谨的 iptables 吧。©
本文发表于水景一页。永久链接:<http://cnzhx.net/blog/intro-to-iptables-processing/>。转载请保留此信息及相应链接。