Linux 防火墙 iptables 的工作原理

11次阅读

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

Linux 防火墙 iptables 的工作原理

iptables 不是防火墙,而是配置 netfilter 的工具

很多人一说“linux 防火墙”,就直接敲 iptables 命令,误以为它就是防火墙本身。其实不是:真正的防火墙能力在内核里,叫 netfilteriptables 只是用户空间的一个配置程序,负责把你的规则“写进” netfilter 的钩子点里。就像你用遥控器调电视音量,遥控器不是喇叭,但没它你就没法控制喇叭——iptables 就是那个遥控器。

数据包经过哪五个关键位置?记住钩子点顺序

netfilter 在内核网络中预设了五个检查点(hook points),所有数据包必经其一或多个。它们不是并列的,而是按流向严格串行:

  • PREROUTING:刚进网卡、还没做路由判断时——适合做 DNAT(比如把公网 8080 映射到内网 80)
  • input路由后确认目标是本机 → 进入本机服务(如 sshnginx
  • 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 就终止查找。所以“允许已建立连接”这种宽泛规则,一定要放在“拒绝所有”之前,否则全被拦死。

text=ZqhQzanResources