Linux 防火墙 Iptables
一、Iptables 概述
- 高效稳定:基于内核工作,数据包过滤效率高,能稳定应对高并发网络场景。
- 灵活可扩展:通过 “表 - 链 - 规则” 的结构,可适配不同网络环境(如局域网共享上网、服务器发布),且支持丰富的扩展模块。
- 易上手:相较于其他防火墙工具,命令逻辑清晰,学习成本较低,同时具备强大的定制能力。
二、Iptables 核心组成
Iptables 的核心是 “表(Table)- 链(Chain)- 规则(Rule)” 的三层结构,理解三者关系是配置的基础。
1. 表(Table):规则的分类集合
表用于归类不同功能的规则,共 5 种常用表,优先级从高到低为:raw > mangle > nat > filter,各表功能与包含的链如下:
表名 | 核心功能 | 包含的链 |
---|---|---|
raw | 确定是否对数据包进行状态跟踪 | OUTPUT、PREROUTING |
mangle | 修改数据包内容(如打标记)、流量整形 | INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING |
nat | 网络地址转换(修改源 / 目标 IP / 端口) | OUTPUT、PREROUTING、POSTROUTING |
filter | 数据包过滤(决定放行 / 丢弃) | INPUT、OUTPUT、FORWARD |
2. 链(Chain):规则的执行序列
链是规则的有序集合,对应数据包在防火墙中的不同处理阶段,共 5 种核心链:
链名 | 触发场景 | 作用 |
---|---|---|
PREROUTING | 数据包进入防火墙,路由选择前 | 修改目标地址(如 DNAT) |
INPUT | 数据包目标为防火墙本机(入站) | 过滤入站到本机的数据包 |
FORWARD | 数据包需转发到其他主机(转发) | 过滤转发的数据包 |
OUTPUT | 防火墙本机向外发送数据包(出站) | 过滤本机出站的数据包 |
POSTROUTING | 数据包路由选择后,即将出站 | 修改源地址(如 SNAT) |
3. 规则(Rule):数据包的处理逻辑
规则是链中的具体指令,每条规则包含 “匹配条件” 和 “控制类型”:
- 匹配条件:如协议(TCP/UDP/ICMP)、源 / 目标 IP、端口、网卡等。
- 控制类型:如允许(ACCEPT)、丢弃(DROP)、拒绝(REJECT)、地址转换(SNAT/DNAT)等。
规则匹配策略:数据包按链中规则的顺序自上而下匹配,匹配到即停止后续检查,未匹配任何规则时,执行链的 “默认策略”(如默认 DROP 丢弃所有数据包)。
三、数据包过滤流程
数据包在防火墙中的处理路径分为三类场景,需结合表的优先级和链的顺序理解:
1. 入站数据包(目标为防火墙本机)
路径:PREROUTING(raw→mangle→nat)
→ 路由选择(判断目标为本机) → INPUT(mangle→filter)
→ 本机应用程序。
2. 转发数据包(目标为其他主机)
路径:PREROUTING(raw→mangle→nat)
→ 路由选择(判断需转发) → FORWARD(mangle→filter)
→ POSTROUTING(mangle→nat)
→ 出站到目标主机。
3. 出站数据包(本机向外发送)
路径:本机应用程序 → 路由选择 → OUTPUT(raw→mangle→nat→filter)
→ POSTROUTING(mangle→nat)
→ 出站。
四、Iptables 规则配置
Iptables 命令的基本语法为:
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
(注:链名、控制类型需大写,默认表为 filter)
1. 常用管理选项与控制类型
(1)管理选项:规则的增删改查
选项 | 作用 | 示例 |
---|---|---|
-A | 在链末尾追加规则 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT (允许 SSH 入站) |
-I | 在链开头 / 指定位置插入规则 | iptables -I INPUT 2 -p icmp -j DROP (在 INPUT 链第 2 位插入丢弃 ICMP 规则) |
-D | 删除规则(按序号 / 内容) | iptables -D INPUT 3 (删除 INPUT 链第 3 条规则) |
-F | 清空链中所有规则 | iptables -F FORWARD (清空 FORWARD 链规则) |
-L | 列出规则 | iptables -t nat -nvL (查看 nat 表规则,数字显示 IP,显示详细统计) |
-P | 设置链的默认策略 | iptables -P INPUT DROP (INPUT 链默认丢弃所有数据包) |
-R | 修改规则 | iptables -R INPUT 1 -p tcp --dport 80 -j ACCEPT (修改 INPUT 链第 1 条规则为允许 80 端口) |
(2)控制类型:数据包的处理动作
控制类型 | 作用 | 适用场景 |
---|---|---|
ACCEPT | 允许数据包通过 | 放行合法流量(如 SSH、HTTP) |
DROP | 丢弃数据包,不回应 | 隐藏主机存在(如拒绝恶意 IP 访问) |
REJECT | 拒绝数据包,返回回应 | 明确告知对方 “连接被拒绝” |
SNAT | 修改数据包源地址 | 局域网共享公网 IP 上网(内→外) |
DNAT | 修改数据包目标地址 | 公网访问内网服务器(外→内) |
MASQUERADE | 动态 SNAT(适配非固定公网 IP) | 拨号上网场景(如家庭宽带) |
LOG | 记录日志到/var/log/messages | 流量审计(不影响数据包转发) |
2. 匹配条件:精准筛选数据包
匹配条件分为三类,可组合使用实现精准过滤:
(1)通用匹配:无需依赖扩展模块
直接匹配协议、IP、网卡等,示例:
- 拒绝来自
192.168.116.20
的所有数据包:iptables -A INPUT -s 192.168.116.20 -j DROP
- 允许非 ICMP 协议的数据包入站:
iptables -A INPUT ! -p icmp -j ACCEPT
(!
表示取反)
(2)隐含匹配:依赖特定协议
需配合-p
指定协议(如 TCP/UDP/ICMP),示例:
- 允许 FTP 端口(20-21)入站:
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
(--dport
指定目标端口) - 禁止别人 ping 本机(丢弃 ICMP 请求包):
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
(--icmp-type 8
为 ping 请求)
(3)显式匹配:需指定扩展模块(-m)
需用-m
指定模块,支持多端口、IP 范围、连接状态等,示例:
- 允许 TCP 的 22、80、443 端口入站:
iptables -A INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
(multiport
模块支持多端口) - 允许已建立连接的数据包入站:
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
(state
模块匹配连接状态)
五、NAT 地址转换
NAT 是 Iptables 的核心功能之一,用于解决内网 IP 不能直接访问公网、公网不能访问内网服务器的问题,分为 SNAT 和 DNAT 两种场景。
1. SNAT:内网共享公网 IP 上网(内→外)
应用场景
局域网内多台主机通过网关服务器的公网 IP 访问互联网(如公司内网共享一个公网 IP)。
实验环境准备
- 私网客户端:IP
192.168.1.1/24
,网关192.168.1.254
(网关服务器内网网卡)。 - 网关服务器:双网卡(内网
192.168.1.254/24
,公网10.0.0.100/8
),开启路由转发(echo 1 > /proc/sys/net/ipv4/ip_forward
)。 - 外网 Web 服务器:IP
10.0.0.1/8
,开启 HTTP 服务(httpd)。
配置命令
- 固定公网 IP:将内网
192.168.1.0/24
的数据包源地址改为公网10.0.0.100
:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33(公网网卡) -j SNAT --to 10.0.0.100
- 动态公网 IP(如拨号上网):自动使用公网网卡的 IP 伪装:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
2. DNAT:公网访问内网服务器(外→内)
应用场景
将内网服务器(如 Web 服务器)通过网关的公网 IP 发布到互联网,供公网用户访问。
配置命令
假设网关公网 IP 为10.0.0.100
,内网 Web 服务器 IP 为192.168.1.2:80
,将公网访问10.0.0.100:80
的请求转发到内网服务器:
iptables -t nat -A PREROUTING -i ens33(公网网卡) -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80