linux上iptables实现公网负载均衡式端口映射,本质是通过dnat基于连接新建(--state new)将同一公网端口流量轮询或哈希分发至多个内网后端(如192.168.1.10–12:80),需开启ip转发、配置prerouting dnat、forward放行及postrouting snat/masquerade,并持久化规则。

在 Linux 上用 iptables -t nat 实现公网负载均衡式端口映射,本质是通过 DNAT 随机或轮询分发入站连接到多个内网后端节点。它不是传统意义上的“智能负载均衡器”,但能基于连接新建(state --state NEW)配合地址范围或哈希实现基础分发,适合轻量级、无会话保持要求的场景。
必须开启并确认 IP 转发
这是所有 NAT 转发的前提,否则数据包直接被丢弃:
- 临时启用:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:编辑
/etc/sysctl.conf,确保含net.ipv4.ip_forward = 1,然后运行sysctl -p - 验证:
cat /proc/sys/net/ipv4/ip_forward返回 1
配置 DNAT 随机分发规则(推荐)
适用于将同一公网端口(如 80)流量分散到多个内网服务器(如 192.168.1.10–192.168.1.12),无需额外模块:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 命令示例(映射公网 IP 的 80 端口到三台内网 Web 服务器):
iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 192.168.1.10-192.168.1.12:80 - 注意:
--to-destination后支持 IP 段(如192.168.1.10-192.168.1.12),iptables 会自动按连接哈希或随机方式分配 - 该规则仅作用于新连接(
--state NEW),避免影响已有连接状态
补充必要 FORWARD 规则与 SNAT(可选)
仅配置 DNAT 不够,还需允许转发并处理回程路径:
- 放行目标为内网集群的转发流量:
iptables -A FORWARD -p tcp -d 192.168.1.10 -m tcp --dport 80 -j ACCEPTiptables -A FORWARD -p tcp -d 192.168.1.11 -m tcp --dport 80 -j ACCEPTiptables -A FORWARD -p tcp -d 192.168.1.12 -m tcp --dport 80 -j ACCEPT - 若后端服务器默认网关不指向本机,需添加 SNAT 让响应包经原路返回:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.10 -j SNAT --to-source 192.168.1.1(假设本机内网 IP 是 192.168.1.1) - 更通用做法是使用 MASQUERADE(尤其当内网网段动态或不确定时):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24 -j MASQUERADE
保存规则并验证
重启后规则丢失,需持久化;同时确认规则已生效:
- 查看当前 NAT 规则及行号:
iptables -t nat --list --line-numbers - Ubuntu 推荐保存至:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL 推荐:
service iptables save或iptables-save > /etc/sysconfig/iptables - 测试:从外网访问
公网IP:80,用tcpdump -i any port 80在本机抓包,观察目的 IP 是否在多个后端间变化










