69·网络高级

iptables 防火墙

iptablesfirewall

第 69 课 - iptables 防火墙

学习目标

完成本课程学习后,你将能够:

  1. 理解 iptables 的基本工作原理,包括“四表五链”核心概念。
  2. 掌握使用 iptables 配置基本防火墙规则,实现放行、阻断特定流量。
  3. 理解并应用基于连接状态的防火墙规则,提升规则效率和安全性。
  4. 学会备份、恢复 iptables 规则,并了解规则持久化的方法。

核心概念

什么是 iptables?

iptables 是 Linux 系统上最经典、最强大的防火墙管理工具。它直接与内核的 Netfilter 框架交互,通过定义一系列规则,来决定如何处理流经系统的网络数据包。你可以把它想象成一个“网络交警”,根据你制定的交规(规则),指挥数据包(车辆)是放行、拦下还是丢弃。

核心比喻:四表五链

理解 iptables,关键要理解“四表五链”这个核心架构。

  • 五链 (Chains):是规则应用的“检查点”。数据包在流经系统的关键路径上会经过这些链,就像你开车进城会经过不同的检查站。

    • INPUT:处理目标地址是本机的数据包。
    • OUTPUT:处理从本机产生并发出的数据包。
    • FORWARD:处理需要本机路由转发的数据包(本机像路由器时)。
    • PREROUTING:数据包刚进入网络层,还未路由判断时。
    • POSTROUTING:数据包即将离开网络层时。
  • 四表 (Tables):是规则的“分类集合”。每张表里的规则完成特定类型的任务。当数据包经过一个链时,会按表的优先级依次匹配规则。

    • raw:最高优先级,用于连接跟踪豁免等。
    • mangle:用于修改数据包内容(如 TTL、TOS)。
    • nat:网络地址转换表(如 SNAT, DNAT),最常用于实现端口转发和局域网上网。
    • filter:过滤表,这是默认表,防火墙的核心,负责数据包的放行、丢弃。我们 90% 的规则都在这里定义。

一句话总结:我们在特定的表里,向特定的链中添加规则,以控制数据包的命运。

规则的匹配与动作 (Targets)

每条规则都包含:

  1. 匹配条件:如来源/目标IP、端口、协议、网络接口等。
  2. 动作 (Target):当数据包匹配规则后,要执行的操作。
    • ACCEPT:放行。
    • DROP:静默丢弃,不向发送方返回任何信息。
    • REJECT:明确拒绝,并向发送方返回一个错误信息(如 ICMP port-unreachable)。
    • LOG:记录日志,然后继续匹配后续规则。
    • SNATDNAT:用于地址转换。

连接跟踪 (Stateful Firewall)

这是 iptables 最强大的特性之一。它可以基于数据包的“状态”进行过滤,而不仅仅是 IP 和端口。

  • NEW:发起新连接的包。
  • ESTABLISHED:已建立连接的后续包。
  • RELATED:与已建立连接相关的新连接的包(如 FTP 数据传输)。

最佳实践:通常的策略是,允许所有 ESTABLISHEDRELATED 状态的包通过,只对 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 访问

要求

  1. 清空现有规则。
  2. 设置 INPUT 链默认策略为 DROP。
  3. 添加规则,允许别人 ping 通你的机器。
  4. 添加规则,允许外部访问你机器的 80 端口(HTTP)。
  5. 添加规则,允许已建立的和相关的连接通过。
  6. 查看最终规则列表,确认其逻辑顺序。 预期输出:另一台机器应能 ping 通你的机器,并且能通过浏览器访问你机器的 Web 服务(如果已启动)。

练习 3:高级规则组合

要求

  1. 配置一个只允许 192.168.1.0/24 网段内的主机 SSH 登录到你服务器的防火墙。
  2. 同时,记录所有试图 SSH 登录但不在该网段的连接(使用 LOG 动作)。
  3. 写出实现这一功能的 iptables 命令序列。

常见错误

  1. 把自己锁在外面:在远程连接的服务器上,直接设置 INPUT 默认策略为 DROP 且未先允许 SSH。这是最严重的错误。务必先添加允许 SSH 的规则,再修改默认策略,或通过串口控制台等备用方式操作。
  2. 混淆 DROPREJECTDROP 更安全(不向攻击者透露信息),但会让客户端连接超时,排查网络问题时可能造成困惑。REJECT 更友好,但在高安全环境下可能被利用。
  3. 规则顺序错误:iptables 按顺序匹配规则,第一条匹配到的规则生效。例如,先放行了 10.0.0.0/8 的所有流量,后面又想禁止 10.1.1.1 的 SSH,后一条规则不会生效。
  4. 忘记允许回环接口 (lo):很多本机服务(如数据库连接、Web 服务器与 PHP 的通信)都依赖于 127.0.0.1。禁止 lo 会导致这些服务莫名故障。
  5. 规则没有持久化:配置好了防火墙,测试通过,但重启服务器后规则全部丢失,服务中断。一定要记得保存!

小结

  • iptables 通过操作内核的 Netfilter 框架来工作,是 Linux 传统且强大的防火墙。
  • 核心是 “四表五链” 模型:filter 表用于包过滤,nat 表用于地址转换;INPUTOUTPUTFORWARD 是最常用的三条链。
  • 基于状态的过滤 (ESTABLISHED, RELATED) 是构建高效、安全防火墙规则的关键。
  • 配置防火墙的标准流程是:清空 -> 设默认策略 -> 添加允许规则 -> 查看 -> 保存。
  • 时刻记住备份持久化规则,并在生产环境操作前有应急方案。
  • 随着内核发展,nftables 正在逐步取代 iptables,成为下一代包过滤框架,它们的概念是相通的,下一课我们将进行介绍。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「nftables 新一代防火墙」 以巩固所学知识。