linux中用iptables -t nat实现多公网ip轮询出口,核心是基于statistic模块的snat轮询:通过-m statistic --mode nth按新建连接顺序依次分配不同源ip(如10.10.0.196–199),配合--every与--packet参数实现严格4路轮询,需禁用rp_filter、启用ip_forward,并用conntrack替代已废弃的state模块以提升兼容性与健壮性。

在Linux中用iptables -t nat实现多公网IP轮询出口,核心是让不同新建连接(NEW状态)依次使用不同的源IP发出,对外呈现为“多个出口IP交替使用”,从而分散流量、提升带宽利用率和抗单点故障能力。这不是传统意义上的服务器后端负载均衡,而是本机出向流量的源地址轮询调度,适用于代理、爬虫、API调用、多ISP出口等场景。
前提条件与基础配置
确保系统已启用IPv4转发,并关闭反向路径过滤(rp_filter),否则多路径出口容易丢包:
- 执行sysctl -w net.ipv4.ip_forward=1并写入/etc/sysctl.conf
- 对所有接口禁用rp_filter:sysctl -w net.ipv4.conf.all.rp_filter=0,同时设eth0、eth1等外网接口对应项也为0
- 确认服务器已绑定多个公网IP(如10.10.0.196–199),且路由可达
基于statistic模块的SNAT轮询规则
使用-m statistic --mode nth按新建连接顺序轮询分配源IP。假设你有4个出口IP,需添加4条POSTROUTING链规则,顺序不能错:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -o eth0 -m statistic --mode nth --every 4 --packet 0 -j SNAT --to-source 10.10.0.196
- iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -o eth0 -m statistic --mode nth --every 2 --packet 0 -j SNAT --to-source 10.10.0.197
- iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -o eth0 -m statistic --mode nth --every 2 --packet 1 -j SNAT --to-source 10.10.0.198
- iptables -t nat -I POSTROUTING -m state --state NEW -p tcp -o eth0 -m statistic --mode nth --every 4 --packet 3 -j SNAT --to-source 10.10.0.199
说明:第一条匹配每第1、5、9…个新连接;第二条匹配剩余中每第1、3、5…个(即总序号2、6、10…);第三条匹配剩余中每第2、4、6…个(即总序号3、7、11…);第四条兜底匹配所有未被前3条捕获的新连接(即总序号4、8、12…)。这样就实现了严格4路轮询。
适配UDP与全协议的补充建议
TCP新建连接较易识别,但UDP无连接状态,需结合其他标记或扩展匹配。稳妥做法是统一处理所有协议的新建会话:
- 将上述规则中的-p tcp替换为-p all(若内核支持)或分别添加-p udp版本
- 更健壮的方式是先用-m conntrack --ctstate NEW替代-m state(后者已废弃),兼容性更好
- 如需区分应用(如仅对curl/wget出口轮询),可加-m owner --uid-owner xxx限定用户
持久化与验证方法
重启后规则丢失,必须保存:
- Ubuntu/Debian:iptables-save > /etc/iptables/rules.v4
- CentOS/RHEL 7+:service iptables save 或用iptables-persistent包
- 验证轮询效果:循环执行curl -s http://httpbin.org/ip | grep origin,观察返回的源IP是否按预期顺序切换
- 查看命中计数:iptables -t nat -L POSTROUTING -v -n,各规则packets列应大致均等增长










