iptables不是防火墙而是配置netfilter的工具;netfilter有PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING五个严格串行的钩子点;四表优先级为raw>mangle>nat>filter,且各表链不可混用;规则仅存内存,需手动持久化。

iptables 不是防火墙,而是配置 netfilter 的工具
很多人一说“Linux 防火墙”,就直接敲 iptables 命令,误以为它就是防火墙本身。其实不是:真正的防火墙能力在内核里,叫 netfilter;iptables 只是用户空间的一个配置程序,负责把你的规则“写进” netfilter 的钩子点里。就像你用遥控器调电视音量,遥控器不是喇叭,但没它你就没法控制喇叭——iptables 就是那个遥控器。
数据包经过哪五个关键位置?记住钩子点顺序
netfilter 在内核网络栈中预设了五个检查点(hook points),所有数据包必经其一或多个。它们不是并列的,而是按流向严格串行:
-
PREROUTING:刚进网卡、还没做路由判断时——适合做 DNAT(比如把公网 8080 映射到内网 80) -
INPUT:路由后确认目标是本机 → 进入本机服务(如 SSH、Nginx) -
FORWARD:路由后发现目标不是本机 → 要转发出去(路由器/网关场景) -
OUTPUT:本机进程发出的数据包 → 出门前最后一道关 -
POSTROUTING:即将发往网卡前——适合做 SNAT(比如内网共享一个公网 IP 上网)
记错顺序会导致规则不生效。例如:想限制本机访问外网某端口,必须在 OUTPUT 链加规则,而不是 INPUT——后者只管“进来”的包。
四表五链不是随便组合,优先级和用途强绑定
iptables 的“表(table)”本质是功能分类,不同表在数据包流程中触发时机不同,且有固定优先级:raw > mangle > nat > filter。这意味着:
-
raw表最早介入,可关闭连接追踪(NOTRACK),常用于高性能场景(如负载均衡器) -
nat表只在PREROUTING/OUTPUT/POSTROUTING链可用,且仅对**首个分片**生效(后续分片走 conntrack 状态,不会再次匹配 nat 规则) -
filter是默认表,只管放行/拦截,对应INPUT/FORWARD/OUTPUT链——日常封端口、限 IP 全靠它 - 你在
filter表里给PREROUTING链加规则?会报错:iptables: No chain/target/match by that name,因为该链根本不在 filter 表中定义
规则生效 ≠ 立即持久化,重启后消失是常态
用 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 加完规则,立刻生效,但这是纯内存操作。系统重启、甚至某些发行版的服务 reload,都会清空规则。常见误区:
- Ubuntu 用户以为
systemctl restart iptables有用——其实 Ubuntu 默认没这个 service,得装iptables-persistent并运行netfilter-persistent save - CentOS 7+ 默认用
firewalld,直接敲iptables命令可能被覆盖;若坚持用 iptables,需先systemctl disable firewalld && systemctl mask firewalld - 保存命令不是万能的:
iptables-save > /etc/iptables.rules只是导出文本,恢复要靠iptables-restore ,且得确保开机时自动执行(比如写进/etc/network/if-pre-up.d/iptables或 systemd unit)
最易被忽略的一点:规则顺序决定命运。iptables 按从上到下逐条匹配,一旦命中 -j ACCEPT 或 -j DROP 就终止查找。所以“允许已建立连接”这种宽泛规则,一定要放在“拒绝所有”之前,否则全被拦死。









