ezra-sullivan
发布于 2025-06-10 / 1 阅读
0
0

01 - iptables 原理

更新时间:2025 年 6 月

iptablesnetfilter

iptables 其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过 iptables 这个代理,将用户的安全设定执行到对应的『安全框架』中,这个『安全框架』才是真正的防火墙,名字叫 netfilternetfilter 是防火墙真正的『安全框架』( framework), 位于内核空间。iptables 其实是个命令行工具,位于用户空间,通常用这个工具去操作真正的框架

表、链和规则

iptables 结构

iptables -> 表 -> 链 -> 规则iptables -> tables -> chains -> rules)。 简单地讲,tables)由 chains)组成,而 chains)又由 规则rules) 组成。我们通过设置 规则 来完成过滤、重定向、修改数据包等功能

iptables 的内建链和内建表

链(chain

什么是 chains)呢?当数据包从网络上来到主机,需要经过一些『关卡』,经过这些『关卡』的时候,则必须符合通过的『条件』,而且,『关卡』会根据检验『条件』来放行、拒绝或者丢弃数据等等;这里的『关卡』就是chains),而『条件』就是 规则rules);iptables 默认有 5 个内建链chains),如下图所示:

01-rules

每个内建链的功能如下:

  • INPUT 链 – 处理来自外部的数据
  • OUTPUT 链 – 处理向外发送的数据
  • FORWARD 链– 将数据转发到本机的其他网卡设备上
  • PREROUTING 链 – 处理刚到达本机并在路由转发前的数据包。它可以转换数据包中的目标IP地址(destination ip address),通常用于 DNAT (destination NAT)
  • POSTROUTING 链 – 处理即将离开本机的数据包。它可以转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)

处理不同方向的数据,由不同内建链负责,系统内建链与数据流向可以由下图描述

02-data-stream

根据上图,我们能够得知报文的流向

  • 到本机某进程的报文: PREROUTING --> INPUT
  • 由本机转发的报文: PREROUTING --> FORWARD --> POSTROUTING
  • 由本机的某进程发出报文: OUTPUT --> POSTROUTING

表(table

每个 chains)上都放置了一串规则,但是有些规则负责的功能有些很相似,这个时候,可以把具有相同功能的规则的集合叫做table),所以不同功能的规则,可以放置在不同的表中进行管理,而 iptables 已经内置定义了4种表,每种表对应了不同的功能

filter 表:负责过滤数据包,有以下三种内建链:

  • INPUT
  • OUTPUT
  • FORWARD

nat 表:负责网络地址转换功能;有以下三种内建链:

  • PREROUTING
  • POSTROUTING
  • OUTPUT
  • INPUT链(CentOS 6 之前不存在,CentOS 7 之后新增加

mangle 表:拆解报文,做出修改,并重新封装数据包;能改变 TCP 头中的 QoS 位;有以下 5 个内建链:

  • PREROUTING
  • OUTPUT
  • FORWARD
  • INPUT
  • POSTROUTING

raw 表:用于处理异常, 在整个防火墙体系优先级最高,如果启动用raw表,数据将会跳过conntrack(关闭nat表上启用的连接追踪机制;),有以下2个内建链:

  • PREROUTING
  • OUTPUT

加上表的描述,数据包经过防火墙的流程可以总结为下图:

03-topo

优先级次序

表间优先顺序

raw -–> mangle –-> nat -–> filter

链间优先顺序

入站数据:PREROUTING、INPUT
出站数据:OUTPUT、POSTROUTING
转发数据:PREROUTING、FORWARD、POSTROUTING

链内规则匹配顺序

自上向下按顺序依次进行检查,找到相匹配的规则即停止,若在该链内找不到的相匹配的规则,则按该链的默认策略处理(未修改的情况下,默认策略为允许 ACCEPT )

iptables 的规则

iptables 规则的关键:

  • Rules 包括一个条件和一个目标 (target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值。
  • 如果不满足条件,就判断下一条Rules

目标值(Target Values)

可以在 target 里指定的特殊值:

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应
  • REJECT:拒绝数据包通过,必要时会给数据发送端响应信息,客户端刚请求就会收到拒绝的信息
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题
  • MASQUERADE:是 SNAT 的种特殊形式,适用于动态的、临时会变的IP上
  • DNAT:目标地址转换
  • REDIRECT:在本机做端口映射
  • LOG:在文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

举例

iptables -t filter -I INPUT -p tcp --dport 12345 -j REJECT

该命令表示在 filter 表的 INPUT 链上添加一条 REJECT 规则,由以上可知,INPUT 链在数据流入的方向上,将 tcp 连接且目标端口为12345 的数据包拒绝掉,即以 tcp 访问本机 1234 5的数据都会被拒绝,达到防火墙的目的

本文为原理简介,关于更多 iptables 的操作将有另一篇文章说明


评论