Linux安全 | 防火墙工具 iptables 详解
iptables 是 Linux 系统中功能强大的内核级防火墙工具,通过配置规则实现对网络数据包的过滤、转发和地址转换等操作,是保障 Linux 服务器网络安全的核心组件之一。
本指南将从基础概念、核心架构、语法规则到实际操作进行系统性讲解。
更多技术专栏【linux】
一、iptables 基础概念
在学习 iptables 之前,需先理解防火墙的分类及操作系统的内核 / 用户空间概念,这是掌握 iptables 工作原理的基础。
1. 防火墙分类
(1)按逻辑功能分类
分类 | 说明 |
---|---|
主机防火墙 | 针对单个主机进行防护,仅保护安装防火墙的主机本身,如 Linux 本机的 iptables。 |
网络防火墙 | 部署在网络边缘或入口(如网关、路由器),保护整个局域网,如企业出口的硬件防火墙。 |
(2)按物理形态分类
分类 | 说明 |
---|---|
硬件防火墙 | 在硬件级别实现防火墙功能,性能强、稳定性高,通常用于企业级场景(如华为、思科硬件防火墙)。 |
软件防火墙 | 基于通用硬件平台(如 x86 服务器),通过应用软件实现防火墙逻辑,iptables 即典型的软件防火墙。 |
2. 内核空间与用户空间
Linux 操作系统将内存划分为两个核心区域,iptables 的工作依赖于这两个区域的协作:
- 内核空间(内核态)
操作系统内核占据的内存区域,拥有最高权限,负责硬件管理、内存调度和网络数据包处理。iptables 的核心规则引擎运行在此区域,直接处理数据包。
- 用户空间(用户态)
普通用户进程所在的内存区域,权限受限。用户通过
iptables
命令(运行在用户态)配置规则,规则最终会被加载到内核空间生效。
二、iptables 核心架构:四表五链
iptables 的核心是 “表(Table)” 和 “链(Chain)” 的组合,表决定功能,链决定数据包流经的位置,规则则配置在 “链” 上实现具体逻辑。
1. 四表:定义功能维度
表是规则的集合,不同表对应不同的网络功能,内核通过加载不同模块实现表的功能。
表(Table) | 核心功能 | 依赖内核模块 |
---|---|---|
filter 表 | 最常用表,负责数据包过滤(允许 / 拒绝数据包通过),是防火墙的核心功能。 | iptable_filter |
nat 表 | 实现网络地址转换(如 SNAT 源地址转换、DNAT 目标地址转换),用于局域网访问互联网或端口转发。 | iptable_nat |
mangle 表 | 拆解数据包,修改数据包的 TOS(服务类型)、TTL(生存时间)等字段,用于流量整形或标记。 | iptable_mangle |
raw 表 | 关闭 nat 表启用的连接追踪机制,用于处理不需要追踪的数据包(如高并发服务),优先级最高。 | iptable_raw |
2. 五链:定义数据包流经路径
链是内核中预设的数据包处理节点,数据包从进入主机到离开主机会依次经过不同的链,规则按顺序在链上执行。
链(Chain) | 流经时机 | 关联的表(优先级从高到低) |
---|---|---|
PREROUTING | 数据包进入主机后、路由判断前(如 DNAT 需在此链处理,修改目标地址后再路由)。 | raw 表 → mangle 表 → nat 表 |
INPUT | 数据包经过路由判断后,目标是本机(如访问本机的 80 端口),用于主机本地防护。 | mangle 表 → filter 表 |
FORWARD | 数据包经过路由判断后,需转发到其他主机(如本机作为网关时),用于转发过滤。 | mangle 表 → filter 表 |
OUTPUT | 本机主动发送的数据包(如本机访问外部网站),在路由判断前处理。 | raw 表 → mangle 表 → nat 表 → filter 表 |
POSTROUTING | 数据包转发或发送前、离开主机前(如 SNAT 需在此链处理,修改源地址后再发送)。 | mangle 表 → nat 表 |
3. 表与链的关联及优先级
(1)表 - 链关联关系
表(Table) | 包含的链(Chain) |
---|---|
raw 表 | PREROUTING、OUTPUT |
mangle 表 | PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING |
nat 表 | PREROUTING、OUTPUT、POSTROUTING |
filter 表 | INPUT、FORWARD、OUTPUT |
(2)表的优先级(从高到低)
raw 表
→ mangle 表
→ nat 表
→ filter 表
即数据包会先经过高优先级表的链,再进入低优先级表的链,例如:外部数据包进入主机时,先经过 raw 表的 PREROUTING 链,再到 mangle 表的 PREROUTING 链,最后到 nat 表的 PREROUTING 链。
三、iptables 基本语法
iptables 命令的核心格式为 “指定表→指定链→匹配条件→执行动作”,需熟练掌握常用参数、动作和操作命令。
1. 核心处理动作(-j 选项指定)
动作决定数据包匹配规则后的处理方式,常用动作如下:
动作(Target) | 含义 |
---|---|
ACCEPT | 允许数据包通过,继续向下一个链或表传递。 |
DROP | 直接丢弃数据包,不向客户端返回任何响应(客户端会等待超时)。 |
REJECT | 拒绝数据包通过,向客户端返回 “拒绝响应”(如 ICMP 不可达),客户端会立即知道被拒绝。 |
SNAT | 源地址转换,修改数据包的源 IP(如局域网主机通过网关访问互联网时,将私有 IP 改为公网 IP)。 |
DNAT | 目标地址转换,修改数据包的目标 IP(如端口转发时,将访问网关的 IP 改为内网服务器 IP)。 |
REDIRECT | 端口重定向,将数据包的目标端口修改为本机的其他端口(如将 8080 端口转发到 80 端口)。 |
2. 常用操作命令
操作命令用于对链中的规则进行增、删、改、清等操作:
操作命令 | 英文全称 | 说明 |
---|---|---|
-A | Append | 在指定链的尾部添加一条新规则(新规则最后执行)。 |
-D | Delete | 删除链中匹配的规则(可按规则序号或匹配条件删除)。 |
-R | Replace | 替换链中指定序号的规则(修改已有规则)。 |
-I | Insert | 在指定链的首部或指定位置插入一条新规则(新规则优先执行)。 |
-F | Flush | 清空指定表或所有表的所有链规则(需谨慎使用,避免误删所有防护规则)。 |
-P | Policy | 设置指定链的默认策略(当数据包不匹配任何规则时,按默认策略处理,可选 ACCEPT/DROP)。 |
3. 常见匹配参数
匹配参数用于定义 “哪些数据包会被规则处理”,常用参数如下:
匹配参数 | 说明 |
---|---|
-s 源 IP / 网段 | 指定数据包的源地址(如 |
-d 目标 IP / 网段 | 指定数据包的目标地址(用法同 |
-p 协议 | 指定数据包的协议类型(如 |
--dport 端口 | 指定数据包的目标端口(仅用于 TCP/UDP 协议,如 |
--sport 端口 | 指定数据包的源端口(用法同 |
-i 网卡 | 指定数据包的流入网卡(如 |
-o 网卡 | 指定数据包的流出网卡(用法同 |
四、iptables 实战操作
以下操作基于 Linux 系统(如 CentOS、Ubuntu),所有命令需以 root
用户执行(或加 sudo
)。
1. 增加规则(-A/-I)
(1)在 INPUT 链尾部添加规则:允许 192.168.150.10 访问本机的 22 端口(SSH)
bash
# -t filter:使用 filter 表(默认表,可省略);-A INPUT:在 INPUT 链尾部添加;-p tcp:匹配 TCP 协议;--dport 22:目标端口 22;-j ACCEPT:允许通过
iptables -t filter -A INPUT -p tcp --dport 22 -s 192.168.150.10 -j ACCEPT
(2)在 INPUT 链首部插入规则:拒绝所有来自 192.168.150.15 的数据包
bash
# -I INPUT:在 INPUT 链首部插入(优先执行);-s 192.168.150.15:源地址为 192.168.150.15;-j DROP:丢弃数据包
iptables -I INPUT -s 192.168.150.15 -j DROP
(3)在 INPUT 链指定位置插入规则:在第 2 条规则位置插入 “允许 192.168.150.16 访问本机 80 端口(HTTP)”
bash
iptables -I INPUT 2 -p tcp --dport 80 -s 192.168.150.16 -j ACCEPT
2. 查看规则(iptables -L)
查看当前 iptables 规则(加 -n
以 IP 形式显示,避免解析域名;加 --line-numbers
显示规则序号):
bash
iptables -L INPUT -n --line-numbers
输出示例:
plaintext
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 192.168.150.15 0.0.0.0/0
2 ACCEPT tcp -- 192.168.150.16 0.0.0.0/0 tcp dpt:80
3 ACCEPT tcp -- 192.168.150.10 0.0.0.0/0 tcp dpt:22
3. 删除规则(-D)
(1)按规则序号删除:删除 INPUT 链的第 1 条规则
bash
iptables -D INPUT 1
(2)按匹配条件删除:删除 INPUT 链中 “拒绝 192.168.150.15” 的规则
bash
iptables -D INPUT -s 192.168.150.15 -j DROP
4. 修改规则(-R)
将 INPUT 链第 2 条规则修改为 “允许 192.168.150.17 访问 80 端口”:
bash
iptables -R INPUT 2 -p tcp --dport 80 -s 192.168.150.17 -j ACCEPT
5. 清空规则与设置默认策略
(1)清空所有表的规则(谨慎使用!)
bash
iptables -F
(2)设置 INPUT 链默认策略为 “拒绝所有数据包”(仅允许匹配规则的数据包通过)
bash
# -P:设置默认策略;INPUT 链默认策略为 DROP
iptables -P INPUT DROP
注意:设置默认策略为 DROP 前,需先确保已添加 “允许 SSH 端口(22)” 的规则,否则会导致远程连接断开!
五、iptables 进阶用法
除基础匹配外,iptables 支持通过扩展模块实现更灵活的匹配逻辑,以下介绍常用扩展模块。
1. iprange 模块:匹配连续 IP 范围
通过 iprange
模块可匹配 “一段连续的 IP 地址”,而非单个 IP 或网段。参数:
--src-range 起始IP-结束IP
:匹配源 IP 范围--dst-range 起始IP-结束IP
:匹配目标 IP 范围-m iprange
:声明使用 iprange 模块
示例:拒绝 192.168.150.15 到 192.168.150.25 的所有 IP 访问本机:
bash
iptables -I INPUT -m iprange --src-range 192.168.150.15-192.168.150.25 -j DROP
2. string 模块:匹配数据包中的字符串
通过 string
模块可检测数据包中是否包含指定字符串,常用于过滤特定内容(如敏感信息)。参数:
--algo 算法
:必选参数,指定字符串匹配算法(bm
或kmp
,bm
效率更高)--string "目标字符串"
:指定要匹配的字符串-m string
:声明使用 string 模块
示例:拒绝包含 “bit” 字符串的数据包进入本机:
bash
iptables -I INPUT -m string --algo bm --string "bit" -j DROP
3. 端口转发(nat 表 + SNAT/DNAT)
端口转发是 iptables 的核心功能之一,需通过 nat
表实现,且需先开启内核转发功能。
(1)开启内核 IP 转发(临时生效,重启后失效)
bash
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效:编辑 /etc/sysctl.conf
,添加或修改以下配置,然后执行 sysctl -p
生效:
bash
net.ipv4.ip_forward = 1
(2)实例 1:本机 8080 端口转发到内网服务器(192.168.150.15:8088)
假设本机 IP 为 192.168.150.16,需实现 “外部访问 192.168.150.16:8080 → 转发到 192.168.150.15:8088”:
bash