一、概述:什么是iptables?
在Linux系统中,网络安全防护的核心工具之一便是iptables
。它绝非一个简单的命令,而是一个功能强大的用户态工具,与Linux内核中的netfilter
框架协同工作,共同构建了Linux的防火墙体系。理解iptables,意味着你获得了精细控制服务器网络流量的能力,是实现网络安全的基石。
二、核心架构:四表五链
要掌握iptables,必须首先理解其“四表五链”的规则组织结构。这好比一个高效的物流分拣中心:
- 规则(Rules):是具体的分拣指令(如“来自上海的包裹发往A区”)。
- 链(Chains):是挂在不同节点的分拣流水线,负责在特定时机处理数据包。
- 表(Tables):是规则链的集合,每种表专用于处理一类特定的网络任务。
1. 四张表(Tables):按功能划分
表名 | 核心功能 | 内置链 |
---|---|---|
raw | 连接跟踪处理,用于决定是否对数据包进行状态跟踪 | PREROUTING , OUTPUT |
mangle | 拆改数据包,可修改TOS、TTL等报文头信息 | PREROUTING , INPUT , FORWARD , OUTPUT , POSTROUTING |
nat | 网络地址转换,实现SNAT(源地址转换)和DNAT(目标地址转换) | PREROUTING , OUTPUT , POSTROUTING |
filter | 最常用的表,负责过滤数据包,决定是否放行 | INPUT , FORWARD , OUTPUT |
优先级顺序:raw
-> mangle
-> nat
-> filter
2. 五条链(Chains):按时机划分
数据包在网络栈中的不同处理节点被称为“链”:
- INPUT:处理发往本机的数据包(入站)。
- OUTPUT:处理本机发出的数据包(出站)。
- FORWARD:处理经本机转发的数据包(网关)。
- PREROUTING:在路由决策之前修改数据包(通常用于DNAT)。
- POSTROUTING:在路由决策之后修改数据包(通常用于SNAT)。
3. 数据包处理流程
一个数据包的“一生”会经历以下路径,与链息息相关:
- 入站数据:
PREROUTING
->INPUT
-> 本机进程 - 转发数据:
PREROUTING
->FORWARD
->POSTROUTING
- 出站数据:本机进程 ->
OUTPUT
->POSTROUTING
三、iptables语法与操作指南
1. 基本命令结构
iptables -t <表名> <管理选项> <链名> <匹配条件> -j <控制类型>
-t
:指定操作的表,默认为filter
。- 管理选项:指定操作方式,如添加、删除、查看规则。
- 链名:指定操作的链。
- 匹配条件:指定要过滤的数据包特征。
-j
:指定数据包的处理方式(控制类型)。
2. 常用管理选项
选项 | 全称 | 功能说明 | 示例 |
---|---|---|---|
-A | Append | 在链的末尾追加规则 | iptables -A INPUT ... |
-I | Insert | 在链的指定位置插入规则(默认为开头) | iptables -I INPUT 2 ... |
-D | Delete | 删除指定的规则 | iptables -D INPUT 3 |
-L | List | 查看规则列表 | iptables -L -n -v |
-F | Flush | 清空链中的所有规则 | iptables -F |
-P | Policy | 设置链的默认策略 | iptables -P INPUT DROP |
-n | numeric | 以数字形式显示地址和端口(常与-L 联用) | iptables -nL |
--line-numbers | 显示规则的行号(便于删除) | iptables -L --line-numbers |
3. 常见控制类型(-j 参数)
控制类型 | 作用 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包,不响应任何信息(更安全) |
REJECT | 拒绝数据包,并向发送方返回拒绝信息(更友好) |
LOG | 将匹配的数据包信息记录到日志(/var/log/messages ),然后继续匹配下一条规则 |
SNAT | 源地址转换,用于内网机器共享公网IP上网 |
DNAT | 目标地址转换,用于将公网IP的请求映射到内网服务器 |
四、实战案例:常用规则配置
-
禁止任何主机ping本机
iptables -t filter -A INPUT -p icmp -j REJECT # 更严格的设置(无响应) # iptables -t filter -A INPUT -p icmp -j DROP
-
禁止所有从ens33网卡进来的SSH连接请求
iptables -A INPUT -i ens33 -p tcp --dport 22 -j DROP
-
查看并管理规则
# 查看INPUT链的规则,并显示行号 iptables -L INPUT --line-numbers# 删除INPUT链的第2条规则 iptables -D INPUT 2# 清空INPUT链的所有规则 iptables -F INPUT
-
设置默认策略(最后的安全防线)
# 配置默认拒绝所有入站连接,然后单独开放所需端口(白名单策略,最安全) iptables -P INPUT DROP iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许HTTPS iptables -A INPUT -i lo -j ACCEPT # 允许本地回环通信
五、总结
iptables是Linux网络安全的基石,通过其高度灵活的“四表五链”结构,实现了对网络流量极其精细的控制。掌握它需要理解:
- 核心概念:
netfilter
与iptables
的关系,以及四表五链的划分依据和工作流程。 - 语法精髓:规则的增删改查命令,特别是
-A
,-I
,-D
,-P
,-j
等关键选项。 - 最佳实践:采用白名单策略(默认拒绝,按需放行)是构建安全系统的黄金法则。