第 69 课 - iptables 防火墙
学习目标
完成本课程学习后,你将能够:
- 理解 iptables 的基本工作原理,包括“四表五链”核心概念。
- 掌握使用 iptables 配置基本防火墙规则,实现放行、阻断特定流量。
- 理解并应用基于连接状态的防火墙规则,提升规则效率和安全性。
- 学会备份、恢复 iptables 规则,并了解规则持久化的方法。
核心概念
什么是 iptables?
iptables 是 Linux 系统上最经典、最强大的防火墙管理工具。它直接与内核的 Netfilter 框架交互,通过定义一系列规则,来决定如何处理流经系统的网络数据包。你可以把它想象成一个“网络交警”,根据你制定的交规(规则),指挥数据包(车辆)是放行、拦下还是丢弃。
核心比喻:四表五链
理解 iptables,关键要理解“四表五链”这个核心架构。
-
五链 (Chains):是规则应用的“检查点”。数据包在流经系统的关键路径上会经过这些链,就像你开车进城会经过不同的检查站。
INPUT:处理目标地址是本机的数据包。OUTPUT:处理从本机产生并发出的数据包。FORWARD:处理需要本机路由转发的数据包(本机像路由器时)。PREROUTING:数据包刚进入网络层,还未路由判断时。POSTROUTING:数据包即将离开网络层时。
-
四表 (Tables):是规则的“分类集合”。每张表里的规则完成特定类型的任务。当数据包经过一个链时,会按表的优先级依次匹配规则。
raw:最高优先级,用于连接跟踪豁免等。mangle:用于修改数据包内容(如 TTL、TOS)。nat:网络地址转换表(如 SNAT, DNAT),最常用于实现端口转发和局域网上网。filter:过滤表,这是默认表,防火墙的核心,负责数据包的放行、丢弃。我们 90% 的规则都在这里定义。
一句话总结:我们在特定的表里,向特定的链中添加规则,以控制数据包的命运。
规则的匹配与动作 (Targets)
每条规则都包含:
- 匹配条件:如来源/目标IP、端口、协议、网络接口等。
- 动作 (Target):当数据包匹配规则后,要执行的操作。
ACCEPT:放行。DROP:静默丢弃,不向发送方返回任何信息。REJECT:明确拒绝,并向发送方返回一个错误信息(如 ICMP port-unreachable)。LOG:记录日志,然后继续匹配后续规则。SNAT、DNAT:用于地址转换。
连接跟踪 (Stateful Firewall)
这是 iptables 最强大的特性之一。它可以基于数据包的“状态”进行过滤,而不仅仅是 IP 和端口。
NEW:发起新连接的包。ESTABLISHED:已建立连接的后续包。RELATED:与已建立连接相关的新连接的包(如 FTP 数据传输)。
最佳实践:通常的策略是,允许所有 ESTABLISHED 和 RELATED 状态的包通过,只对 NEW 状态的包进行严格过滤。这比为每种服务都写双向规则要高效、安全得多。
代码示例
注意:以下命令需要 root 权限执行。在生产环境操作前,请确保有备用访问方式(如物理控制台或通过云服务商控制台),避免规则配错把自己“锁”在外面。
1. 查看当前规则
# 查看 filter 表中所有链的规则,并显示规则序号(便于删除)
sudo iptables -L -v -n --line-numbers
# 参数解释: -L 列表, -v 详细信息, -n 以数字形式显示IP/端口(不解析), --line-numbers 显示序号
2. 配置一个基础防火墙 (filter 表)
假设我们的服务器 eth0 网卡需要对外提供 SSH (22) 和 HTTP (80) 服务,并允许响应外部已建立的连接。
# 步骤 1:清空所有现有规则(谨慎操作!)
sudo iptables -F # 清除所有链中的规则
sudo iptables -X # 清除用户自定义的链
sudo iptables -Z # 清除计数器
# 步骤 2:设置默认策略(重要!先设策略,再加规则)
# 将 INPUT 和 FORWARD 链的默认策略设为 DROP(默认拒绝),OUTPUT 设为 ACCEPT(本机主动发出的都允许)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 步骤 3:添加允许规则(在 INPUT 链上)
# 规则1:允许回环接口(lo)的所有通信,本机进程间通信必须
sudo iptables -A INPUT -i lo -j ACCEPT
# 规则2:允许已建立和相关的连接(基于状态,核心!)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 规则3:允许新的 SSH 连接(注意:是 NEW 状态)
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# 规则4:允许新的 HTTP 连接
sudo iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
# (可选)规则5:允许 ICMP 协议(ping 请求)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 步骤 4:查看配置结果
sudo iptables -L -v -n --line-numbers
3. 删除与插入规则
# 删除 INPUT 链中的第 4 条规则(根据查看时的序号)
sudo iptables -D INPUT 4
# 在 INPUT 链的第 2 条规则后面,插入一条允许 HTTPS(443) 的规则
sudo iptables -I INPUT 3 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
4. 保存与恢复规则
iptables 规则默认存储在内存中,重启后会丢失。
# 安装持久化工具 (以 Ubuntu/Debian 为例)
sudo apt install iptables-persistent
# 在安装过程中会询问是否保存当前规则,选“是”。
# 或者之后手动保存:
sudo netfilter-persistent save
# 规则通常保存在 /etc/iptables/rules.v4 (IPv4) 和 /etc/iptables/rules.v6 (IPv6)
# 手动备份当前规则到文件
sudo iptables-save > /home/user/iptables-backup.rules
# 从备份文件恢复规则
sudo iptables-restore < /home/user/iptables-backup.rules
实践练习
练习 1:基础规则查看
在你的测试虚拟机中,运行 sudo iptables -L -v -n。尝试解释 Chain INPUT (policy DROP 0 packets, 0 bytes) 这一行中,policy DROP 的含义是什么?
练习 2:配置允许 Ping 和 Web 访问
要求:
- 清空现有规则。
- 设置 INPUT 链默认策略为 DROP。
- 添加规则,允许别人 ping 通你的机器。
- 添加规则,允许外部访问你机器的 80 端口(HTTP)。
- 添加规则,允许已建立的和相关的连接通过。
- 查看最终规则列表,确认其逻辑顺序。
预期输出:另一台机器应能
ping通你的机器,并且能通过浏览器访问你机器的 Web 服务(如果已启动)。
练习 3:高级规则组合
要求:
- 配置一个只允许
192.168.1.0/24网段内的主机 SSH 登录到你服务器的防火墙。 - 同时,记录所有试图 SSH 登录但不在该网段的连接(使用
LOG动作)。 - 写出实现这一功能的
iptables命令序列。
常见错误
- 把自己锁在外面:在远程连接的服务器上,直接设置 INPUT 默认策略为 DROP 且未先允许 SSH。这是最严重的错误。务必先添加允许 SSH 的规则,再修改默认策略,或通过串口控制台等备用方式操作。
- 混淆
DROP和REJECT:DROP更安全(不向攻击者透露信息),但会让客户端连接超时,排查网络问题时可能造成困惑。REJECT更友好,但在高安全环境下可能被利用。 - 规则顺序错误:iptables 按顺序匹配规则,第一条匹配到的规则生效。例如,先放行了
10.0.0.0/8的所有流量,后面又想禁止10.1.1.1的 SSH,后一条规则不会生效。 - 忘记允许回环接口 (
lo):很多本机服务(如数据库连接、Web 服务器与 PHP 的通信)都依赖于127.0.0.1。禁止lo会导致这些服务莫名故障。 - 规则没有持久化:配置好了防火墙,测试通过,但重启服务器后规则全部丢失,服务中断。一定要记得保存!
小结
iptables通过操作内核的 Netfilter 框架来工作,是 Linux 传统且强大的防火墙。- 核心是 “四表五链” 模型:
filter表用于包过滤,nat表用于地址转换;INPUT、OUTPUT、FORWARD是最常用的三条链。 - 基于状态的过滤 (
ESTABLISHED, RELATED) 是构建高效、安全防火墙规则的关键。 - 配置防火墙的标准流程是:清空 -> 设默认策略 -> 添加允许规则 -> 查看 -> 保存。
- 时刻记住备份和持久化规则,并在生产环境操作前有应急方案。
- 随着内核发展,
nftables正在逐步取代iptables,成为下一代包过滤框架,它们的概念是相通的,下一课我们将进行介绍。