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 的介绍就介绍完了, 后续再详细写各模块的文章.