iptables的statistic模块仅支持无状态轮询(nth)和随机(random)两种负载均衡模式,不维护连接状态、不感知时间或后端健康,适用于高并发低延迟场景;轮询需配合--state new确保连接首包分发,随机模式则通过概率实现大样本均衡。

iptables 的 statistic 模块是实现无状态、轻量级后端负载均衡的核心工具。它不依赖连接跟踪(conntrack),不维护会话状态,也不感知时间或后端健康状况,完全基于数据包到达顺序或随机概率做决策,因此天然适合高并发、低延迟场景下的简单分发。
下面以两台后端服务器(192.168.1.10 和 192.168.1.11)承载公网 80 端口流量为例,说明如何用 statistic 实现无状态负载。
✅ 前提条件必须满足
- Linux 主机已开启 IP 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward # 并写入 /etc/sysctl.conf 保证重启生效
- 后端服务器能响应请求,且默认网关指向该负载均衡器(或已配置 SNAT/MASQUERADE)
- iptables 已安装,
xt_statistic内核模块可用(现代内核默认启用)
? 方式一:轮询(nth 模式)——严格按包序号分发
适用于希望连接均匀、可预测分布的场景(注意:不是按连接,而是按包;TCP 连接中多个包可能被分到不同后端,除非配合 --state NEW):
# 将新连接的第一个包(SYN)轮询分发:每2个新连接中第1个去 192.168.1.10 iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.10:80 # 剩余的新连接全部去 192.168.1.11 iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 192.168.1.11:80
⚠️ 注意:
--state NEW是关键,确保只对连接首包做分流,避免同一连接后续包被错误重定向。
? 方式二:随机(random 模式)——概率均分
更接近“连接级”负载,因每个新连接独立触发一次随机判定:
# 50% 概率将新连接导向 192.168.1.10 iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.10:80 # 其余新连接(自动落到此规则)导向 192.168.1.11 iptables -t nat -A PREROUTING -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 192.168.1.11:80
✅ 优势:无需计数,无累积偏差;适合突发流量场景。
❗ 缺点:短时间可能不均,但大样本下趋近 1:1。
? 补充必要规则(不可省略)
仅 DNAT 不够,还需放行转发并处理回程路径:
# 允许转发到后端服务器 iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT iptables -A FORWARD -p tcp -d 192.168.1.11 --dport 80 -j ACCEPT # 回程 NAT(若后端网关不指向本机) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.10 -j SNAT --to-source 192.168.1.1 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.11 -j SNAT --to-source 192.168.1.1 # 或更通用的 MASQUERADE(推荐用于动态内网) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.1.0/24 -j MASQUERADE
? 规则持久化(Ubuntu/Debian 推荐)
sudo apt install iptables-persistent netfilter-persistent sudo netfilter-persistent save
查看当前规则是否生效:
iptables -t nat -L PREROUTING -v --line-numbers
不复杂但容易忽略











