核心思路是默认DROP、先放行ESTABLISHED/RELATED、再精准放行NEW连接。需按序执行:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT;iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT;iptables -A INPUT -m state --state INVALID -j DROP;iptables -P INPUT DROP。

要在 Linux 中用 iptables -m state 实现基于连接状态的单向入站安全策略,核心思路是:只允许外部主动发起的“新连接”在明确授权的服务端口上建立(如 SSH、HTTP),其余所有入站新连接一律拒绝;同时放行所有“已建立”(ESTABLISHED)和“相关联”(RELATED)的连接回包,确保合法通信能持续完成。这不是简单地开几个端口,而是利用内核连接跟踪机制(conntrack)识别数据流状态,实现更精准、更安全的控制。
理解 state 模块与连接状态含义
-m state 是 iptables 的状态匹配模块,依赖内核 nf_conntrack 子系统对连接进行动态跟踪。它识别四种关键状态:
- NEW:数据包试图发起一个全新连接(如客户端第一次发 SYN)
- ESTABLISHED:属于一个已成功建立的双向连接(如 TCP 三次握手完成后,后续的数据包)
- RELATED:与现有连接逻辑相关的新连接(如 FTP 的数据连接、ICMP 错误报文对应原连接)
- INVALID:无法归类到任何已知连接,或连接信息损坏的数据包(通常为异常/攻击流量)
构建单向入站策略的关键规则顺序
iptables 规则按从上到下顺序匹配,一旦命中即停止。因此顺序至关重要:
- 先放行所有 ESTABLISHED 和 RELATED 流量(保障已有会话不中断)
- 再显式放行特定端口的 NEW 连接(如
-p tcp --dport 22 -m state --state NEW -j ACCEPT) - 最后用
-m state --state INVALID -j DROP拦截异常包 - 确保 INPUT 链默认策略为
DROP(iptables -P INPUT DROP),兜底拒绝所有未明确允许的入站 NEW 包
典型配置示例(命令行逐条执行)
以下命令构建最小可行单向入站策略(仅开放 SSH):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT iptables -A INPUT -m state --state INVALID -j DROP iptables -P INPUT DROP
说明:第一行确保你 SSH 进去后不会被断连;第二行只让外部能新建 SSH 连接;第三行丢弃可疑无效包;第四行是安全基线——没有显式放行的 NEW 连接一律拒绝。若需加 HTTP,只需追加一行:iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT。
保存规则并确认生效
临时规则重启后丢失,必须保存:
- CentOS/RHEL 系统:
service iptables save(规则写入/etc/sysconfig/iptables) - Debian/Ubuntu 系统:
iptables-save > /etc/iptables/rules.v4 - 验证当前规则:
iptables -L INPUT -v -n --line-numbers,重点检查 ESTABLISHED/RELATED 规则是否排在最前,且默认策略为 DROP











