Linux 防火墙规则核心在于理清数据包流向、匹配条件与动作逻辑,需先明确放行 / 拒绝策略及处理环节;iptables 由 filter、nat、mangle 三表及五链构成,链内规则顺序匹配且命中即止,未匹配时依默认策略处理;配置前须查规则、备份、设超时回滚。

Linux防火墙 规则的核心是理解数据包流向、匹配条件和动作逻辑,不是死记命令。真正写好规则,关键在“想清楚要放行什么、拒绝什么、在哪一环处理”。下面从基础概念到实际配置,一步步讲透。
iptables 基础结构:三张表 + 五条链
iptables 不是单一 工具,而是由表(table)和链(chain)组成的规则容器:
- filter 表:最常用,负责过滤(ACCEPT/DROP/REJECT),含 INPUT、OUTPUT、FORWARD 链
- nat 表 :做地址转换(SNAT/DNAT/ 端口 映射),主要用 PREROUTING、POSTROUTING、OUTPUT 链
- mangle 表:改写数据包头(如 TTL、QoS 标记),较少日常使用
每条链按顺序逐条匹配,一旦命中即执行动作并停止后续匹配(除非用 - j 跳转)。默认策略(policy)决定未匹配时的行为,比如 iptables -P INPUT DROP 表示 INPUT 链默认丢弃所有包——这很安全,但必须先放通 SSH 等必要流量,否则可能锁死远程连接。
写规则前必做的三件事
别急着敲命令,先确认环境、理清需求、留好退路:
- 查当前规则 :
iptables -L -n -v(- n 禁 DNS 解析,- v 看包 / 字节 计数);更清晰用iptables-save - 备份现有规则:
iptables-save > /root/iptables-backup-$(date +%F).rules - 设置超时自动回滚(防误锁):
(sleep 300; iptables-restore,5 分钟后若没手动确认,自动恢复
典型场景规则写法(附说明)
以下规则均基于 filter 表,假设你已设iptables -P INPUT DROP,需显式放行:
- 允许本地回环通信:
iptables -A INPUT -i lo -j ACCEPT(- i 指定入接口,lo 是 loopback) - 允许已建立的连接返 回流 量:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(现代内核推荐用-m conntrack --ctstate替代 state 模块) - 开放 SSH(仅限某 IP 段):
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT(- s 指定源 IP,–dport 目标端口) - 限制 SSH 暴力尝试:
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --rcheck --seconds 60 --hitcount 4 -j REJECT,再加一行-A INPUT -p tcp --dport 22 -m recent --name ssh --set -j ACCEPT(首次访问记录,1 分钟内超 3 次就拒绝) - 拒绝特定 IP 扫描行为:
iptables -A INPUT -s 203.0.113.45 -j DROP(DROP 静默丢弃,REJECT 会发 RST/ICMP 提示)
进阶技巧:持久化、日志与调试
重启后规则消失?被拒绝却不知原因?这些是真实运维痛点:
- 保存规则到文件并开机加载 :Debian/Ubuntu 用
iptables-persistent,运行netfilter-persistent save;CentOS/RHEL 7+ 用service iptables save或直接写入/etc/sysconfig/iptables - 给规则加日志便于排查 :
iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP-DENIED: ",日志出现在/var/log/messages或journalctl -k | grep HTTP-DENIED - 用 tcpdump 辅助验证 :比如
tcpdump -i eth0 port 22看 SSH 包是否真被拦截,再对比 iptables 计数器变化(- v 输出里的 pkts 字段) - 注意规则顺序!:- A 是追加到末尾,- I 是插入开头。想让某规则优先生效,用
iptables -I INPUT 1 ……插到第 1 位
基本上就这些。规则不在多,在准;不求炫技,但求可读、可维护、可回滚。真正上线前,在测试机上模拟攻击(如用 nmap 扫端口、hydra 试爆 SSH)、关掉再开网络服务验证连通性,比背一百条命令都管用。