要让iptables具备连接状态感知能力,需启用state或conntrack模块以识别new、established、related、invalid四类状态,按顺序配置规则链,优先放行established/related,再允许特定new连接,记录并丢弃invalid包,最后设默认策略为drop,并可结合limit和recent模块增强防护。

要让 iptables 具备连接状态感知能力,核心是启用并正确使用 state(或更现代的 conntrack)模块,使防火墙能区分“新建连接”“已建立连接”“关联连接”等状态,从而实现精准放行与严格拦截。
理解四种关键连接状态
iptables 的 state 模块识别以下常用状态:
- NEW:数据包试图发起一个全新连接(如客户端第一次发 SYN)
- ESTABLISHED:属于某个已成功建立的双向连接(如服务器返回的 SYN-ACK 或后续数据)
- RELATED:与现有连接逻辑相关的新连接(如 FTP 数据连接、ICMP 错误报文触发的重传)
- INVALID:无法归类到任何已知连接,通常为伪造、碎片或异常包,应默认丢弃
基础状态感知规则链结构
典型安全策略中,INPUT 链推荐按如下顺序组织(自上而下匹配):
- 放行所有
ESTABLISHED,RELATED流量(必须靠前,否则响应包被拦) - 显式允许特定服务的新建连接(如 SSH、HTTP)
- 可选:记录并丢弃
INVALID状态包(便于排查) - 最后设置默认策略为
DROP或REJECT
示例命令:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "INVALID: "
iptables -A INPUT -m state --state INVALID -j DROP
iptables -P INPUT DROP
注意模块兼容性与语法演进
较新内核(≥4.18)默认使用 nf_conntrack,state 模块已被标记为遗留。推荐改用 ctstate(需加载 xt_conntrack):
- 替代写法:
-m conntrack --ctstate ESTABLISHED,RELATED - 确保模块已加载:
modprobe nf_conntrack - 检查是否启用连接追踪:
cat /proc/sys/net/netfilter/nf_conntrack_enabled(值为 1 表示开启)
配合状态做防御增强
仅靠状态识别还不够,需结合速率控制防暴力或泛洪:
- 限制每秒新建连接数(防 SYN Flood):
-m state --state NEW -m limit --limit 10/second -j ACCEPT - 对频繁新建连接的 IP 临时封禁:
-m state --state NEW -m recent --name badips --rcheck --seconds 60 --hitcount 20 -j DROP - 再加一条记录首次新建请求:
-m state --state NEW -m recent --name badips --set -j ACCEPT











