iptables规则未生效主因是链选错或位置不当:input处理入本机包,output处理本机发出包,forward处理转发包;-a追加末尾,-i插入指定位置;默认策略、持久化配置、规则顺序任一疏忽均致失效。

iptables 添加规则时为什么没生效?
添加规则后网络不通或规则不匹配,大概率是链(chain)选错了,或者规则位置不对。iptables 默认按顺序匹配,INPUT、OUTPUT、FORWARD 三链作用对象不同:INPUT 处理进本机的包,OUTPUT 处理本机发出的包,FORWARD 处理经本机转发的包。新手常误把本机服务访问规则加到 FORWARD 链。
另外,-A 是追加到链尾,-I 才能插到开头(默认插第 1 条)。很多策略依赖“先允许再拒绝”,如果用 -A 把 DROP 规则加在前面,后面所有规则都失效。
- 查当前规则顺序:
iptables -L INPUT --line-numbers - 在 INPUT 链第 1 位插入允许 SSH:
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT - 追加一条拒绝所有入站(慎用):
iptables -A INPUT -j DROP - 若要放行本机回环通信,必须加在 DROP 前:
iptables -I INPUT 1 -i lo -j ACCEPT
如何安全删除某条 iptables 规则?
直接删错规则可能导致 SSH 断连或服务不可用。最稳妥的方式是先查编号,再按号删——别用 -D 加条件删,条件稍有出入就报 “No chain/target/match by that name” 错误。
- 列出带行号的 INPUT 规则:
iptables -L INPUT --line-numbers - 删第 3 条:
iptables -D INPUT 3 - 删匹配特定端口的规则(需完全一致):
iptables -D INPUT -p tcp --dport 8080 -j ACCEPT(注意空格、大小写、参数顺序) - 删整个链所有规则:
iptables -F INPUT,但不会清空默认策略(POLICY),这点容易被忽略
保存和恢复 iptables 规则为什么总是失效?
iptables 运行时规则存在内存里,重启系统就丢。Linux 发行版对持久化处理不统一:CentOS/RHEL 用 service iptables save 或 iptables-save > /etc/sysconfig/iptables;Ubuntu/Debian 默认没装 iptables-persistent,得手动装并用 iptables-save > /etc/iptables/rules.v4。
- 临时保存当前规则(推荐先备份):
iptables-save > /root/iptables-backup-$(date +%s) - CentOS 7+ 若用 firewalld,
iptables命令改的规则会被 firewalld 覆盖,得先停:systemctl stop firewalld - Debian 系统装持久化工具:
apt install iptables-persistent && netfilter-persistent save - 检查是否启用开机加载:
systemctl is-enabled netfilter-persistent(非iptables服务名)
修改默认策略(POLICY)有哪些风险?
iptables -P INPUT DROP 看似“安全”,实则极易锁死自己。一旦执行,且没提前放行 SSH 或控制台访问,远程连接立即中断。更麻烦的是,默认策略无法用行号删除,只能用 -P 覆盖回 ACCEPT,而你可能已经连不上了。
- 设默认策略前,务必确保已有明确放行规则(如 SSH、lo 接口)
- 测试时建议用定时任务自动回滚:
(sleep 60; iptables -P INPUT ACCEPT) & -
FORWARD链默认是ACCEPT,但做网关或 Docker 主机时,常被意外影响——Docker 启动会自动往FORWARD加规则,若你设了DROP策略又没配好,容器就上不了网 - 查看当前默认策略:
iptables -L INPUT | head -1(输出类似Chain INPUT (policy DROP))
iptables -S 看全量规则,比凭记忆敲命令靠谱得多。











