iptables是linux内核自带的包过滤防火墙工具,规则直接作用于netfilter框架;其核心是四表五链结构——filter表处理过滤、nat表负责地址转换、mangle表修改包头、raw表跳过连接跟踪,各表仅在对应链生效;input链规则须按“本地回环→已建立连接→服务端口→兜底拒绝”顺序配置,-a追加末尾、-i插入首行;操作需遵循“先查(-l --line-numbers)→再改→后保存(iptables-save)”闭环,否则重启失效。

iptables 是 Linux 内核自带的包过滤防火墙工具,不依赖守护进程,规则直接生效于 netfilter 框架。掌握基础规则编写,关键在于理清表链结构、匹配顺序和常用动作,而不是死记命令。下面从实际配置出发,讲清楚怎么写、为什么这么写、容易错在哪。
理解四表五链:别往错的表里加规则
iptables 不是“一张大表”,而是按职责划分的四个核心表,每张表只处理特定类型的操作:
- filter 表(默认表):专注“放行还是拒绝”,日常防护基本都在这里操作,含 INPUT、FORWARD、OUTPUT 链
- nat 表:只管地址转换,比如端口映射(DNAT)或出口改源地址(SNAT),用在 PREROUTING、POSTROUTING、OUTPUT 链
- mangle 表:修改数据包头字段(如 TTL、TOS),普通安全策略极少用到
- raw 表:用于跳过连接跟踪(NOTRACK),常见于高性能服务(如 UDP 转发)优化
误把 SSH 放行规则写进 nat 表,或在 mangle 表里设 DROP,规则根本不会生效——因为数据包根本不经过那条链。
INPUT 链基础规则顺序:先允再限最后拒
绝大多数主机防护集中在 INPUT 链。规则按顺序逐条匹配,一旦命中就执行动作并停止后续检查。因此顺序决定逻辑成败:
- 允许本地回环:
iptables -A INPUT -i lo -j ACCEPT(必须最先或早于所有限制) - 放行已建立连接:
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT(确保响应流量不被拦) - 按需开放服务端口,例如 SSH:
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT - 最后加兜底拒绝:
iptables -A INPUT -j DROP(放在末尾,否则前面规则无效)
注意:-A 是追加到链尾,-I 是插入到链首。比如想优先拦截某个恶意 IP,就得用 -I INPUT -s 1.2.3.4 -j DROP,插在最前面才管用。
查、删、保存:三步闭环,避免配完就失联
配置防火墙最怕“改完连不上”。每次操作前先看现状,改完及时固化:
-
查看当前规则:用
iptables -L -n -v --line-numbers,带行号和详细计数,方便定位 -
删错规则不伤全局:用行号删比清空更安全,例如
iptables -D INPUT 3删除 INPUT 链第 3 条;也可精确匹配删除iptables -D INPUT -p tcp --dport 22 -j ACCEPT -
保存必须手动执行:规则默认只存内存。CentOS/RHEL 用
iptables-save > /etc/sysconfig/iptables;Debian/Ubuntu 用iptables-save > /etc/iptables/rules.v4,否则重启即失效
几个易忽略但关键的细节
有些小点不写进教程,但线上出问题往往就卡在这儿:
- 默认策略(
iptables -P INPUT DROP)比末尾加 DROP 更彻底,但调试阶段建议先设为 ACCEPT,确认规则有效后再收紧 - 状态模块名随内核版本变化:旧系统用
-m state --state ESTABLISHED,新系统推荐-m conntrack --ctstate ESTABLISHED - ICMP(ping)要单独放行:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT,否则无法诊断连通性 - 若服务器有多个网卡(如 eth0 和 docker0),规则中指定
-i eth0可避免误拦容器或本地通信











