iptables按源地址转发本质是通过NAT表在PREROUTING链(DNAT)或POSTROUTING链(SNAT)改写IP,需开启IP转发并配合FORWARD链放行规则。

iptables 实现“根据源地址转发数据流”,本质是结合 NAT 表 与 路由决策前/后时机,配合 IP 转发开启 和 精确匹配条件 来完成。它不是传统意义上的“路由选择”,而是通过 DNAT 或 SNAT 在关键链上改写目标或源 IP,从而引导流量走向特定路径。
必须先启用 IP 转发
Linux 默认关闭内核的包转发功能。不打开,所有转发规则都无效:
- 临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:编辑
/etc/sysctl.conf,确保含net.ipv4.ip_forward = 1,再运行sysctl -p
用 DNAT 实现“按源地址重定向目标”
适用于外部请求需按来源(如不同客户网段)分发到不同内网服务器的场景。动作发生在 PREROUTING 链,即路由判断之前。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 将来自
192.168.10.0/24的访问,全部转发到10.0.0.10: iptables -t nat -A PREROUTING -s 192.168.10.0/24 -j DNAT --to-destination 10.0.0.10- 若需指定端口(如只转 HTTP):
-p tcp --dport 80加在条件中 - 注意:DNAT 后必须允许 FORWARD 链放行对应流量,否则包会被 filter 表默认策略丢弃
用 SNAT 实现“按源地址指定出口路径”
适用于多出口网关,希望不同源网段使用不同公网 IP 出站(比如财务部走专线,销售部走宽带)。
- 来自
172.16.5.0/24的流量,统一用203.0.113.5作为源地址出 eth1: iptables -t nat -A POSTROUTING -s 172.16.5.0/24 -o eth1 -j SNAT --to-source 203.0.113.5- 若出口 IP 是动态获取(如 DHCP),建议用
MASQUERADE替代SNAT: iptables -t nat -A POSTROUTING -s 172.16.5.0/24 -o eth1 -j MASQUERADE
组合策略:源地址 + 接口 + 协议精细化控制
实际环境中常需叠加多个条件。例如:只对从 eth0 进、且源为 192.168.2.0/24、TCP 协议、目标端口为 22 的 SSH 流量做 DNAT。
iptables -t nat -A PREROUTING -i eth0 -s 192.168.2.0/24 -p tcp --dport 22 -j DNAT --to-destination 192.168.1.100:2222- 这条规则会把该来源的 SSH 请求,转发到内网另一台机器的 2222 端口
- 务必同步在 filter 表的 FORWARD 链中放行:
iptables -A FORWARD -i eth0 -o eth1 -s 192.168.2.0/24 -d 192.168.1.100 -p tcp --dport 2222 -j ACCEPT
















