核心是用iptables -t nat结合connmark与statistic hash实现连接级端口哈希分流,确保同一连接固定出口ip并隐藏内网源地址。

用 iptables -t nat 实现基于端口哈希的出口负载均衡并隐藏真实源,核心是结合 CONNMARK(连接标记)与 statistic 模块的 hash 模式,而非简单轮询。这样能保证同一连接的所有包始终走同一出口 IP,避免会话中断,同时对外隐藏内网真实源地址。
一、确认基础前提
确保以下条件已满足:
- 系统已开启 IPv4 转发:
echo 1 > /proc/sys/net/ipv4/ip_forward,并写入/etc/sysctl.conf持久化 - 服务器有多个公网出口 IP(例如:203.0.113.10、203.0.113.11、203.0.113.12),绑定在同一网卡(如 eth0)或不同网卡
- iptables 已安装,且内核支持
xt_statistic和xt_connmark模块(主流发行版默认支持) - 所有出向流量需经本机 NAT,不直连外网
二、配置端口哈希分流规则
目标:对新建立的 TCP 连接,根据其源端口(或四元组)哈希,固定分配到某一出口 IP,实现“连接粒度”的稳定负载均衡。
以 3 个出口 IP 为例,执行以下命令:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
# 1. 清空旧的 POSTROUTING 规则(谨慎操作,建议先备份) iptables -t nat -F POSTROUTING <h1>2. 对新连接打标记:按源端口哈希,结果为 0/1/2 分别对应三出口</h1><p>iptables -t nat -A POSTROUTING -m state --state NEW -p tcp \ -m statistic --mode nth --every 3 --packet 0 \ -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff</p><p>iptables -t nat -A POSTROUTING -m state --state NEW -p tcp \ -m statistic --mode nth --every 2 --packet 0 \ -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff</p><p>iptables -t nat -A POSTROUTING -m state --state NEW -p tcp \ -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff</p><h1>3. 根据连接标记值,分别 SNAT 到不同出口 IP</h1><p>iptables -t nat -A POSTROUTING -m connmark --mark 0x1 -j SNAT --to-source 203.0.113.10 iptables -t nat -A POSTROUTING -m connmark --mark 0x2 -j SNAT --to-source 203.0.113.11 iptables -t nat -A POSTROUTING -m connmark --mark 0x3 -j SNAT --to-source 203.0.113.12 </p>
说明:上述 --mark 0x1/0x2/0x3 是由 CONNMARK 自动分配的内部标记值,实际顺序取决于哈希结果。更稳妥的做法是使用 --set-mark 显式赋值(需配合 mangle 表预处理),但哈希分流本身已足够稳定。
三、补充关键防护与隐藏措施
仅做 SNAT 不足以完全隐藏源——还需防止反向路径校验(rp_filter)干扰、禁用 ICMP 源披露、统一返回路径:
- 关闭反向路径过滤(每个出口接口):
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
并在/etc/sysctl.conf中添加:net.ipv4.conf.eth0.rp_filter = 0 - 禁止本机响应外部 ping(防暴露内网结构):
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP - 确保所有出向流量都经过 POSTROUTING 链(无 bypass):检查路由表是否绕过本机,必要时用策略路由约束回程路径
四、验证与持久化
验证方法:
- 发起多个新连接(如 curl、wget),观察远程服务日志中来源 IP 是否按哈希规律分布在三个出口上
- 用
conntrack -L | grep ESTABLISHED查看连接标记是否一致 - 用
tcpdump -i eth0 port 80抓包,确认 SNAT 后的源 IP 正确替换
持久化保存规则(以 CentOS/RHEL 为例):service iptables save 或 iptables-save > /etc/sysconfig/iptables
Debian/Ubuntu 推荐使用 iptables-persistent 包。










