iptables学习笔记(一)
浏览 327 | 评论 0 | 字数 4102
lovecatc
2020年09月20日
  • iptables是Linux下著名的防火墙工具。虽然这么说,但是事实上iptables是项目netfilter的一部分。netfilter是位于操作系统内核空间的框架,而iptables则为用户提供了操作这个框架的工具。

    iptables的主要功能包括数据包的过滤、数据包内容的修改以及网络地址转换(NAT)。为了正常发挥这些功能,就要对iptables进行规则(rules)的配置。

    iptables有几个核心的概念:钩子(hooks),表(tables)和链(chains)。我们首先来看hooks的概念。hooks位于内核协议栈,经过机器的数据包会经过若干hook。具体来说,关系如下

                                       Is target localhost?
              +-----------------+       +----------------+  Y   +--------------+
    --------> |NF_IP_PRE_ROUTING| ----->|routing decision|----->|NF_IP_LOCAL_IN|
    Incoming  +-----------------+       +----------------+      +--------------+
                                                |                      |
                                            N   |                      | 
                                                ↓                      ↓
                                        +----------------+      +---------------+
                                        |  NF_IP_FORWARD |      |local processes|
                                        +----------------+      +---------------+
                                                |                      |
                                                |                      |
                                                ↓                      ↓
                                        +----------------+      +---------------+
                                        |routing decision|<-----|NF_IP_LOCAL_OUT|
                                        +----------------+      +---------------+
                                                |
                                                |
                                                ↓                        
                                      +-------------------+             
                <---------------------| NF_IP_POST_ROUTING|
                       Outcoming      +-------------------+

    可以看到,图中共有5个netfilter hook。对应节点和状态如下

    • NF_IP_PRE_ROUTING:接受的数据包刚刚入站,没有经过路由选择,不知道数据包是否要发给本机。
    • NF_IP_LOCAL_IN:已经经过路由选择,并且数据包的目标是本机。
    • NF_IP_FORWARD:已经经过路由选择,并且数据包的目标不是本机。
    • NF_IP_LOCAL_OUT:本地的数据包刚刚到达IP层,没有进行路由选择。
    • NP_IP_POST_ROUTING:本地或转发的数据包已经经过了路由选择,即将交由底层发送。

    需要特别说明的是,hook函数全部位于IP层,而IPV4和IPV6的IP层是不同的。因此上述hooks只针对IPV4,IPV6的配置需要使用ip6tables

    显然,为了实现iptables的功能,仅仅经过hook是不够的。在经过每一个hook时,还需要配置相应的规则(rule)。而这些规则,就由tables分类管理。目前iptables支持以下表:

    • Filter:这个表中的rule主要用于过滤数据,控制数据能否通过。
    • NAT:这个表的rule负责转换网络地址,即是否要进行地址转换,以及如何修改源地址和目标地址,从而影响数据包的路由,达到转发的目的。
    • Mangle:这个表中的rule负责修改数据包头,或给数据包进行标记以便后续处理。
    • Raw:这个表的rule负责给数据包标记,以控制哪些数据包不被connection tracking(见下文)追踪。
    • Security:这个表中的rule主要和SELinux有关,为数据包设置标记,以便SELinux相关的模块处理。

    将上面提到的rule注册到hook上,就有了chain的概念。因为有5个hook,因此与之对应的,也有5个chain

    • PREROUTING : NF_IP_PRE_ROUTING
    • FORWARD : NF_IP_FORWARD
    • INPUT : NF_IP_LOCAL_IN
    • OUTPUT : NF_IP_LOCAL_OUT
    • POSTROUTING : NF_IP_POST_ROUTING

    tableschains是多对多的关系,也即每个表中可以有多个链,每个链中也可以含多个表。并不是每个链都能包含所有的表。某些表对于某个链来说是多余或无意义的。在表/链中,都存在优先级的问题。

    事实上,除了上述五个chain,iptables还允许用户自定义chain。但由于自定义chain没有与hook绑定,因此只能从内置的5个chain中跳转到自定义chain。

    首先看每个链中可以包含哪些表。自上而下代表优先级自高到低。

    • PREROUTING

      • raw
      • (connection tracking)
      • mangle
      • nat(DNAT)
    • FORWARD

      • mangle
      • filter
      • security
    • INPUT

      • mangle
      • filter
      • security
      • nat(SNAT, not standard)
    • OUTPUT

      • raw
      • (connection tracking)
      • mangle
      • nat(DNAT)
      • filter
      • security
    • POST_ROUTING

      • mangle
      • nat(SNAT)

    connect tracking发生在PREROUTING和OUTPUT这两个环节。它将追踪每个数据包,维护连接状态,然后供其它的rule应用。

    实际使用中,往往是以tables为入口,对rules进行操作。因此有必要考虑每个table对应的chain

    • raw

      • PREROUTING
      • OUTPUT
    • mangle

      • PREROUTING
      • FORWARD
      • INPUT
      • OUTPUT
      • POSTROUTING
    • nat

      • DNAT

        • PREROUTING
        • OUTPUT
      • SNAT

        • INPUT
        • POST_ROUTING
    • filter

      • FORWARD
      • INPUT
      • OUTPUT

    讲过了hook, chaintables以及它们之间的关系,就可以解释具体的rule了。每条rule包括两部分信息:Matching和Targets。matching即匹配条件,它指出了如何匹配一个数据包。匹配条件包括协议类型、源/目的IP、源/目的端口、I/O接口、包头数据和连接状态等等。targets即匹配后的动作。一般可以进行的操作包括

    • DROP:丢弃数据包,不再进行后续处理
    • RETURN:跳出当前chain,不再执行本条chain中其它的rule
    • QUEUE:将数据包放入用户空间队列,供用户空间进程处理
    • ACCEPT:同意通过,继续执行之后的rule
    本文作者:lovecatc
    本文链接:https://lovecatc.com/index.php/archives/22/
    最后修改时间:2020-09-20 07:53:26
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论