关键规则是iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT,需配合默认DROP策略、lo接口放行及NEW连接显式授权,缺一不可。

要让 Linux 防火墙只允许已建立连接(ESTABLISHED)的返回流量通过,关键不是单独依赖 iptables -m state,而是结合连接跟踪(conntrack)机制,用 -m conntrack 或现代推荐的 -m state(仅限旧内核)配合状态匹配规则,并确保策略逻辑正确。
理解 ESTABLISHED 的实际含义
ESTABLISHED 状态指该数据包属于一个双方都已交换过数据的连接(如 TCP 已完成三次握手并有数据传输,或 UDP 有双向通信记录)。它不表示“刚建立”,而是“已有活跃通信”。防火墙靠内核的 conntrack 模块自动识别和维护这些状态。
配置只放行 ESTABLISHED 返回包的核心规则
典型做法是:对出站连接放行(如允许本机访问外网),再对入站设置默认拒绝,仅放开 ESTABLISHED/RELATED 流量。示例如下:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
清空现有规则(测试前慎用):
iptables -F INPUT -
设置 INPUT 默认策略为 DROP:
iptables -P INPUT DROP -
允许本地回环:
iptables -A INPUT -i lo -j ACCEPT -
放行已建立和关联连接的入包(关键):
• 使用现代写法(推荐,内核 ≥ 2.6.39+):iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
• 使用传统写法(兼容老系统):iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -
(可选)允许新连接发起(如 SSH):
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
为什么不能只写 ESTABLISHED?
RELATED 状态必须同时放行——它涵盖 FTP 数据连接、ICMP 错误报文(如“端口不可达”)、DNS 响应等与原始连接逻辑相关的辅助流量。漏掉 RELATED 会导致部分服务异常(如 FTP 被动模式失败、traceroute 不显示中间跳数)。
验证与排错要点
运行后检查规则是否生效:
- 查看当前规则:
iptables -vnL INPUT(-v 显示匹配包计数,-n 避免 DNS 解析延迟) - 确认 conntrack 模块已加载:
lsmod | grep nf_conntrack - 查看当前连接跟踪表:
conntrack -L | head -10,观察是否有 ESTABLISHED 条目 - 若 SSH 断连,检查是否漏加 NEW 规则或 lo 接口规则;若网页打不开,确认 OUTPUT 链未被意外限制(通常设为 ACCEPT 即可)
不复杂但容易忽略细节。核心就是 INPUT 链默认 DROP,再用 conntrack 匹配 ESTABLISHED 和 RELATED,其他一律拦截。这样既安全,又保障合法响应能回来。

















