iptables 之 —— 新手入门(图文并茂, 一文读懂 iptables)

Overview

关于防火墙,这里就不多说了。 大家都知道 Linux 的防火墙(自带)—— iptables, 其实这么说是不准确的。 iptables 应该只能算是一个代理软件, Linux 真正的防火墙叫 netfilter。 这是位于内核空间的一个安全框架, iptables 是帮助你操作、配置 netfilter 的工具。 Linux 内核很少收录软件系统的,但是有两个除外, 一个是 netfilter , 另一个是 LVS(Linux Virtual Server). 可见这两个软件的重要性。

在十几年前, LVS 非常的流行,只是现在CPU不值钱了,带宽不是问题了, Loadbalance 都慢慢的转去七层了。我不是搞运维的, 所以我不知道还有多少系统在使用 LVS。 但是不管怎样,也无法抹杀 LVS 的地位。 也是技术人应该学习和掌握的。

Netfilter 是 Linux 操作系统核心层的一个数据包处理模块, 有着非常强大的功能:

  • 网络地址转换 (Network Address Translate)
  • 数据包内容修改
  • 数据包过滤

在 OpenRC 系统里有一条命令 /etc/init.d/iptables start | stop | restart 其实准确的来说,并没有这个服务,这个只是帮你重新载入上一次(关机前)的 iptables 的配置

数据包流向

整体看一下 Linux 数据包在 netfilter 中的流向

上图太复杂了,不利于初学者理解。所以我先画一张简单的便于理解

一个数据包进来,首先经过 Routing 决定这个数据包到底应该进用户空间(访问本机服务),还是走转发(FORWARD)。整个过程,数据包会经过5个关卡,分别是 PREROUTING, INPUT, OUTPUT, POSTROUTING, 如果是转发走 FORWARD. 这也就是四表五链里面说的五链。

所以我们可以得出几种数据包的流向

  • 到本机的请求报文: PREROUTING -> INPUT
  • 本机响应的响应报文: OUTPUT -> POSTROUTING
  • 由本机转发的报文: PREROUTING -> FORWARD -> POSTROUTING

五链介绍

可以这样理解五链,就是 netfilter 给到我们修改数据包的 5 个 hooks

那么这五个链代表的是什么意思呢? 相信从图中也看出来了

  • PREROUTING 路由前
  • INPUT 进入用户空间前
  • OUTPUT 从用户空间出来
  • POSTROUTING 路由后
  • FORWARD 转发

分别指的是在这几个节点上你想对数据包做什么? 换句话说就是 iptables 的规则是作用的在链上的。 那么规则保存在哪里呢? 就是常说的四表。

四表介绍

iptables 主要是规则,规则本身是作用在五条链上,那么规则保存在哪里呢? 就得介绍一下通常所说的四表。每张表的作用不尽相同。

  • filter 默认表, 用于存放与防火墙相关的操作. 主要负责数据包的过滤
  • nat 用于网络地址转换用的(NAT)
  • mangle 用于修改数据包属性的。主要负责拆解报文,做修改,并重新封包。
  • raw 用于配置数据包。如:关闭nat表上启用的连接追踪机制。 基本用不到
  • security 用于强制访问控制网络规则。 基本用不到

一般说的4表,其实还有一张security表,只是基本用不到。 raw表其实也是用不到的。正常来说 filter, nat 是非常常用的。 mangle 用的也很少, 不过要使用透明代理,是需要用到这张表的。

表链之间的关系

某些链中注定不会包含某类规则,所以并不是所有表都会作用在所有链上。他们之间会有对应规则的

filter nat mangle raw
PREROUTING x
INPUT x x
OUTPUT
POSTROUTING x x
FORWARD x x

实际使用的过程中 iptables 的命令是从表开始的, 所以换一个角度看 表(功能) -> 链(钩子)

  • raw 表中的规则可以被哪些链使用: PREROUTING, OUTPUT
  • mangle 表中的规则可以被哪些链使用: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  • nat 表中的规则可以被哪些链使用: PREROUTING, OUTPUT, POSTROUTING. (据说 centos7 中有 INPUT)
  • filter 表中的规则可以被哪些链使用: INPUT, FORWARD, OUTPUT

当多张表同时作用在一个链上的时候,规则的优先级如下: raw -> mangle -> nat -> filter

数据在防火墙中的流向

根据上述的内容,大体上数据在防火墙中的流向可以用如下图表示

记住这张图有助于编写 iptables 的规则.

什么是规则

前面说了半天都是在说数据包的流向, 以及 netfilter hooks的概念, 而对用户而言主要是编写规则. 所以这边简单讲述一下规则的概念

规则: 根据指定的匹配条件来匹配每个流经对应 “链” 的数据包, 若匹配成功, 则执行后面指定的处理动作.

通俗的理解一下, 当一个数据包进入到应用层, 经过 INPUT 节点的时候, 匹配到这个数据包不是一个正常的数据包(假设服务器上只开启了80端口的 tcp 服务, 有一个访问80的 udp 数据包), 那么可以直接拒绝这个数据包的进入. 匹配 80端口的 udp 数据包 就是匹配规则, 拒绝就是执行动作.

匹配条件

匹配条件分为基本条件和扩展条件

基本条件:

源地址 source IP, 目标地址 destination IP

扩展条件:

源端口 source port, 目标端口 destination port

处理动作

处理动作在 iptables 里被称作 target

下面我列出一些常用的处理动作

  • ACCEPT: 允许数据包通过
  • DROP: 直接丢弃, 不给任何响应信息
  • REJECT: 拒绝数据包通过, 会给响应信息
  • SNAT: 源地址转换, 一般局域网通过一个网关上网就是通过这个来实现的
  • DNAT: 目标地址转换, 和 SNAT是对应的
  • MASQREADE: 可是认为是 SNAT 的和种特殊形式, 如果家庭上网上动态 IP , 所以 SNAT 的规则就不好写了.
  • REDIRECT: 在本机做端口映射
  • LOG: 在 /var/log/messages 中记录日志.

整体关于 iptables 的介绍就介绍完了, 后续再详细写各模块的文章.

Posts in this series