你好!我是你的资深软件工程师。在现代基础设施和云原生环境中,虽然我们经常听到 firewalld、UFW 甚至是安全组(Security Group),但 iptables 依然是 Linux 网络包过滤的基石(底层大多通过 nftables 或 iptables-nft 兼容层实现)。无论是做容器网络隔离、Kubernetes Service 转发,还是排查生产环境的网络连通性,掌握 iptables 都是一项必备的核心技能。

今天我将带你从零开始,由浅入深地掌握 iptables 的基础知识与核心用法。


一、 iptables 是什么?

iptables 是 Linux 系统上用来管理内核包过滤规则(Netfilter)的命令行工具。

你可以把它想象成一个智能海关安检系统:
* 所有进出或流过你服务器的网络数据包(Packet),都要通过这套安检系统。
* 系统会根据你预设的“规则”(Rules)对数据包进行检查。
* 符合规则的数据包会被执行相应的“动作”(Targets),比如:放行(ACCEPT)、丢弃(DROP)、拒绝(REJECT) 或 重定向(REDIRECT)。


二、 核心概念:表(Tables)与链(Chains)

这是理解 iptables 最难也最重要的一层抽象。iptables 的架构分为表和链。

1. 四张“表”(Tables)—— 按功能分类

内核中有多个表,每个表负责不同类型的处理逻辑。最常用的有三个:

  • filter 表(默认):负责过滤数据包。决定你能不能访问服务器(最常用)。
  • nat 表:负责网络地址转换(Network Address Translation)。用于端口映射、Docker 端口转发、SNAT/DNAT。
  • mangle表:负责修改数据包的包头(TTL、TOS等),高级流量控制使用。

2. 五条“链”(Chains)—— 按流向分类

每个表包含多条“链”,链其实就是数据包传播的路径节点:

  • INPUT:进局的数据包(目的地是本机)。
  • OUTPUT:出局的数据包(源自本机)。
  • FORWARD:转发的数据包(经过本机,去往其他地方,例如做路由或网关)。
  • PREROUTING:在进行路由选择之前触发(常用于 DNAT 修改目标IP)。
  • POSTROUTING:在进行路由选择之后触发(常用于 SNAT 修改源IP)。

数据包流向示意图(简易版):
* 外网流入 -> PREROUTING -> [路由判断] -> INPUT -> 本机进程
* 本机进程 -> OUTPUT -> [路由判断] -> POSTROUTING -> 外网流出
* 外网流入 -> PREROUTING -> [路由判断] -> FORWARD -> POSTROUTING -> 外网流出


三、 基础语法结构

一条典型的 iptables 命令结构如下:

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 动作]
  • -t table:指定表名(不写默认是 filter)。
  • 常用命令选项:
  • -A:在链的末尾追加一条规则 (Append)。
  • -I:在链的开头插入一条规则 (Insert)。
  • -L:列出规则 (List)。
  • -F:清空规则 (Flush)。
  • -D:删除某条规则 (Delete)。
  • 常用动作(Target):
  • ACCEPT:允许通过。
  • DROP:直接丢弃(不给任何回应,调用者会感觉超时)。
  • REJECT:拒绝并返回拒绝信息。
  • LOG:记录日志到内核日志中。

四、 实战演练:常见场景配置

作为工程师,我们通过具体场景来练习。注意:在生产环境操作 iptables 时请小心,错误的配置可能导致你被 SSH 关在服务器外面!

场景 1:查看当前的防火墙规则

# 查看 filter 表的所有规则,并显示行号和包计数器
iptables -n -v -L --line-numbers

提示:-n 表示不进行 DNS 解析,直接显示 IP,能大幅提升查看速度。

场景 2:设置默认策略(Policy)

如果没有任何规则匹配,数据包该怎么办?我们可以设置默认动作。

# 默认入栈全部丢弃(安全起见,生产环境常用,但操作前必须先放行 SSH!)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

场景 3:放行必要的流量(白名单机制)

# 1. 允许本机内部通信 (lo网卡,如 127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT

# 2. 允许已经建立连接的、或者是关联的数据包通过(非常重要!否则你发出的请求收不到回应)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 3. 允许 SSH 连接 (防止自己被关外面,默认端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 允许 HTTP 和 HTTPS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

场景 4:禁止特定 IP 或封禁恶意攻击

# 封禁某个恶意的 IP
iptables -A INPUT -s 192.168.1.100 -j DROP

# 拒绝某个网段访问 MySQL (3306端口)
iptables -A INPUT -s 192.168.2.0/24 -p tcp --dport 3306 -j DROP

场景 5:删除规则

如果你配错了规则,可以通过行号删除:

# 假设我们要删除 INPUT 链中的第 3 条规则
iptables -D INPUT 3

五、 进阶:NAT 配置(端口映射)

在做微服务架构或容器化时,我们经常需要做端口转发。比如把访问服务器 80 端口的流量转发到本地的 8080 端口:

# 开启内核路由转发功能(必须先开启)
sysctl -w net.ipv4.ip_forward=1

# 将访问外网网卡 eth0 的 80 端口流量,转发到本地 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 8080

六、 持久化保存(避坑指南)

新手最容易犯的错: 用 iptables 敲了一堆命令,测试好好的,结果一重启服务器,全没了!

因为 iptables 规则默认只保存在内存中。

* CentOS / RHEL 系统:

    service iptables save
    # 或者
    iptables-save > /etc/sysconfig/iptables
  • Ubuntu / Debian 系统:

Ubuntu 默认没有自带 iptables 服务持久化包,需要安装 iptables-persistent:

    apt-get install iptables-persistent
    netfilter-persistent save
    netfilter-persistent reload

七、 资深工程师的安全建议

1. 安全第一:远程操作云服务器配置 iptables 时,千万不要第一时间执行 -P INPUT DROP。请先写好放行 SSH 的规则(如 -A INPUT -p tcp --dport 22 -j ACCEPT),确认能正常连接后,再收紧策略。
2. 备份规则:在大改规则前,用 iptables-save > iptables_backup.bak 备份,出问题时用 iptables-restore < iptables_backup.bak 恢复。
3. 理清顺序:iptables 规则是自上而下匹配的,一旦匹配成功就不再往下走。所以精确的规则放前面,宽泛的规则放后面。

希望这篇基础教程能帮你建立起对 iptables 的完整认知。如果在实际操作中有具体的业务场景(例如怎么限制某个IP的访问频率,或者怎么做SNAT),欢迎随时提问!