iptables路由转发需三要素:开启ip_forward、FORWARD链策略非DROP、DNAT后配精确放行规则;缺一即导致流量静默丢弃,且必须配合SNAT/DNAT与conntrack状态跟踪协同工作。

iptables 实现路由转发与防火墙规则的集成,核心在于启用内核转发 + 精确控制 FORWARD 链 + 合理搭配 NAT 表。它不是简单打开转发就完事,而是让数据包在“被转发”这个关键路径上,按需接受过滤、地址转换和状态检查。
必须开启 IP 转发功能
Linux 默认禁止 IPv4 转发,这是安全基线。iptables 无法绕过这一限制——即使 FORWARD 链写了允许规则,若内核不转发,报文根本不会抵达 FORWARD 链。
- 临时启用:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:在
/etc/sysctl.conf中设置net.ipv4.ip_forward = 1,再执行sysctl -p - 验证是否生效:
sysctl net.ipv4.ip_forward返回1即成功
FORWARD 链是转发流量的唯一过滤入口
当报文目标不是本机、且内核决定转发时,它只会经过 PREROUTING → FORWARD → POSTROUTING 流程。INPUT 和 OUTPUT 链对转发流量完全无效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 默认策略建议设为 DROP:
iptables -P FORWARD DROP,然后显式放行所需流量 - 典型放行逻辑常包含三类匹配:
– 源/目的网段(如-s 192.168.1.0/24 -d 10.0.0.0/24)
– 连接状态(-m state --state ESTABLISHED,RELATED -j ACCEPT)
– 协议与端口(如-p tcp --dport 80) - 注意顺序:状态 RELATED/ESTABLISHED 规则应放在具体服务规则之前,确保返回流量能顺利通过
NAT 表与 filter 表协同工作
单纯放行转发还不够——内网主机要访问外网,通常需 SNAT;外部要访问内网服务,则需 DNAT。这些不在 filter 表处理,而由 nat 表在特定链完成:
-
SNAT(出向地址伪装):写在 POSTROUTING 链,修改源 IP。例如:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE -
DNAT(入向端口映射):写在 PREROUTING 链,修改目的 IP 和端口。例如:
iptables -t nat -A PREROUTING -d 203.0.113.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 - DNAT 后,该报文的目标变成内网地址,后续会进入 FORWARD 链——所以必须在 FORWARD 中同步放行对应流量,否则仍被 DROP
连接跟踪(conntrack)是状态化控制的基础
iptables 的 state 或 conntrack 模块依赖内核连接跟踪子系统。它让 FORWARD 链能区分“新建连接”和“已有连接的响应”,从而实现单向放行、双向通行。
- 放行 ESTABLISHED,RELATED 是安全又实用的关键实践,避免为每个响应端口单独写规则
- 若使用 raw 表关闭某类流量的连接跟踪(如高吞吐 UDP),则无法再用
--state匹配,需改用其他条件(如 IP+端口范围) - 连接跟踪表有默认大小限制,大规模并发连接时可能需调优
net.netfilter.nf_conntrack_max


















