iptables双向防火墙需input和output链均设为drop并分别配置:input仅放行必要服务端口(如22、80、443)且限new状态,output按需放开dns、ntp等,并对established/related流量显式放行;forward链须成对设置请求与响应规则;依赖conntrack状态跟踪简化管理,规则顺序须将established/related置于最前,确保双向会话畅通。

iptables 实现双向防火墙策略,核心在于明确区分“入向”和“出向”流量,并为两者分别设置合理规则。只设 INPUT 不管 OUTPUT,或默认全放行 OUTPUT,都可能留下安全隐患。真正的双向控制,是让每条允许的连接都有来有回——请求能出去,响应才被放行;服务能进来,应答才被认可。
INPUT 和 OUTPUT 链必须独立配置
很多人误以为只要放行 INPUT 的 SSH 或 HTTP,就等于服务可用,却忽略 OUTPUT 默认 ACCEPT 可能导致敏感信息外泄或反弹 Shell 成功。正确做法是:
- INPUT 默认 DROP,仅开放必要端口(如 --dport 22、80、443),且限定状态为 NEW
- OUTPUT 默认也设为 DROP,再按需放开:本地 DNS 查询(udp --dport 53)、时间同步(ntp udp --dport 123)、系统更新源(如 apt 仓库 IP+端口)
- 对已建立连接(ESTABLISHED,RELATED)在 INPUT 和 OUTPUT 中都显式放行,确保会话双向畅通
FORWARD 链要严格匹配源/目标与协议方向
当主机充当网关或桥接设备时,FORWARD 是关键。双向意味着:内网发请求出去 + 外网回包回来,两条规则缺一不可。
- 允许 PC1 访问外网 Web:一条 FORWARD 规则放行 内网→外网 TCP 80 出向请求
- 同时必须加另一条:放行 外网→内网 TCP 80 回向响应(注意用 --sport 80,不是 --dport)
- ICMP 同理:echo-request 允许出,echo-reply 才允许进;否则 ping 看似通了,实际只单向
- 避免用 -j ACCEPT 无条件放行整个子网,应精确到 IP+端口+协议+状态
状态跟踪是双向策略的基石
靠手动写“请求+响应”两条规则易漏、难维护。启用连接状态跟踪可大幅简化逻辑:
- 加载 state 模块:
modprobe nf_conntrack(现代内核通常已加载) - 在 INPUT 和 OUTPUT 链开头添加:
-m state --state ESTABLISHED,RELATED -j ACCEPT - 这样只需为 NEW 连接设白名单(如 SSH、DNS 查询),后续所有关联流量自动放行
- 注意:UDP 和 ICMP 无连接概念,但 conntrack 仍能跟踪其会话,RELATED 可覆盖 DNS 响应、FTP 数据通道等场景
规则顺序与默认策略协同生效
iptables 按顺序匹配,一旦命中即停止。双向策略失效常因顺序错位:
- 默认策略(-P)是兜底,应在所有具体规则之后起效;若先设 -P INPUT DROP,再追加规则,新规则可能被跳过
- 把“允许已建立连接”放在最前,再放“允许新服务”,最后才是拒绝类规则
- 避免混用 -A(追加)和 -I(插入):批量配置建议先清空(-F)、再用 -I 从顶部插入关键规则,保证执行顺序可控
- 测试时临时加 LOG 规则(如
-j LOG --log-prefix "DROPPED:"),观察日志确认是哪条规则拦截了回包











