iptables 和 netfilter 是一套 Linux 防火墙组合工具,共同合作完成系统的防护工作。

iptables 是客户端工具,netfilter 是服务端程序,

iptables 工作在用户态,netfilter 工作在内核态,

用户可以通过 iptables 命令作用到服务端的 netfilter,netfilter 触发相应的回调函数(hook 机制)执行相应的防护动作。

五链

netfilter 是 Linux 内核中内置的网络数据包处理框架,提供了 5 个 hook 点,当网络包在协议栈中流转到这些 hook 点时,就会依次执行在这些hook 点上注册的各种规则,进而实现对网络包的各种处理。

  • PRE_ROUTING

    • 通过数据链路层解包,进入网络层的数据包通过该 hook 点
    • 所有接收数据包到达的第一个 hook 点
    • 此处可以进行数据包目的地址转换(DNAT)
  • LOCAL_IN

    • 经过路由查找后,目的地址是本机的数据包,会到达该 hook 点
  • IP_FORWARD

    • 进过路由查找后,目的地址不是本机地址的数据包(即转发的数据包),会到达该 hook 点
  • LOCAL_OUT

    • 所有本地生成的发往其它机器的数据包,在进入网络栈后首先到达该 hook 点
  • POST_ROUTING

    • 本机产生准备发出的数据包或转发的数据包,在经过路由判断后,会到达该 hook 点

四表

每个 hook 点可以注册各种规则,这些规则根据用途的不同,可以分为 4 个表,分别是 raw 表,mangle 表,nat 表和 filter 表。

每个链中的表,按照下面的优先顺序进行查找匹配:

1
raw > mangle > nat > filter

  • raw 表

    • 用于决定数据包是否被连接跟踪机制处理
  • mangle 表

    • 用于数据包的拆解、修改、再封装
    • 修改包的 IP 头
  • nat 表

    • 数据包的网络地址转换
  • filter 表

    • 用于数据包过滤,判断是否允许一个包通过

更准确的说

  • 用户通过 iptables(或 nftables)将规则添加到某个“表”中

  • 当数据包到达某个 hook 点(如 NF_IP_PRE_ROUTING)时,内核会依次调用注册在该 hook 上的各个表的处理函数

  • 每个表只在它“关心”的 hook 点注册处理逻辑

  • 在每个表内部,规则按链(chain)组织

其它