iptables 工作方式的通俗理解

了解 iptables 的工作流程对于理解其各种命令和参数以及选项非常有帮助,也是设计 iptables 的基础。开启了 iptables 之后,所有通过系统网卡接口的数据都会经过 iptables 的检查和处理。iptables 就像是一道流水线,其各条规则就像是流水线上的技工,各规则按照一定的顺序排列在流水线上。所有进入 iptables 的数据包,在走这个流程的过程中会被各条规则检查。

每条规则包括匹配条件(如果不指定匹配条件则默认匹配所有)和处理方法 2 个部分。某规则看到有个数据包从流水线上过来了,就先看看是不是满足自己的匹配条件,不满足就让它继续往下游走;满足就按照自己的处理方法对其进行处理。

每个数据包最终的处理的结果只有这么 3 种,且必须为这 3 种中的一个,否则就是还没处理完:

  1. ACCEPT – 接受。如果被接受,一个数据包就可以从 iptables 中出来了,不用再接着被后面的规则检验。
  2. DROP – 丢弃。如果被丢弃,这个数据包就沉没了,直接从 iptables 的流水线上被拿下来扔掉。
  3. REJECT – 拒绝。如果被拒绝,这个数据包会被拒收,但是 iptables 会让希望告诉发送方它的数据包被扔掉了。也就是说,实际上这个数据包还是被扔掉了,但是系统会发送回去一个消息,告诉别人一声。

如果一个数据包得到了上面 3 种最终判决结果中的一个,它就会从 iptables 这条流水线上被请下来,否则就继续往下游走。

并不是每条规则都能给出上面的最终判决。如果不能给出最终判决,这条规则的操作有:

  1. 跳转(-j)- 有 2 个跳转方向:
    1. -j LOG – 做个记录,然后让数据包接着被下面的检查员检查;
    2. -j other_chain – 将数据包交给另一个链(other_chain)来处理,然后撒手不管。
  2. 撒手不管 – 这个数据包就流向下一个检查员,由后面的规则进行处置。

设计 iptables 的规则就是设计这么一条流水线,使用 iptables 的各种命令、参数和参数选项组合出满足自己需要的匹配规则并指定处理方式,同时考虑到 iptables 规则在流水线上的前后顺序。

一般采取的思路是,只“接受”满足我们要求的数据包,对于没有规则与之匹配的数据包,默认采取丢弃(或拒绝)操作(一般最后一条规则都是 -j DROP,不能处理的都给丢弃了)。不过也有人说,直接 DROP 不是太礼貌,可以选择 REJECT(丢弃并通知一声)。然而也有人说,既然没有匹配的规则,那多半说明这个数据包是“不正常的”,既然不正常,还给别人通知什么啊,直接丢了拉倒。所以还是设计一个比较严谨的 iptables 吧。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/intro-to-iptables-processing/>。转载请保留此信息及相应链接。

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>