需先启用IP转发(临时:echo 1 > /proc/sys/net/ipv4/ip_forward;永久:sysctl.conf设net.ipv4.ip_forward=1并sysctl -p),再配置SNAT规则(iptables -t nat -A POSTROUTING -s 内网段 -o 出口网卡 -j SNAT --to-source 公网IP),同时放行FORWARD链流量并保存规则。

确认内核已启用 IP 转发功能
Linux 默认关闭 IPv4 转发,不开启就无法做 SNAT。直接检查:
cat /proc/sys/net/ipv4/ip_forward返回
0 表示未启用,需临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward但重启失效,要永久生效得改配置文件:
/etc/sysctl.conf中确保有这一行:net.ipv4.ip_forward = 1然后运行
sysctl -p 加载。注意:某些云主机(如阿里云、腾讯云)默认禁用该参数且禁止修改,需先确认平台策略。
用 iptables 添加 SNAT 规则到 POSTROUTING 链
SNAT 必须写在 nat 表的 POSTROUTING 链,不能写错表或链。典型命令如下:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.5其中:
-s 指定内网网段,-o 指定出口网卡(不是内网网卡),--to-source 是公网出口 IP(必须是本机真实绑定的地址)。常见错误包括:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 把
-i(入接口)误写成-o,导致规则不生效 -
--to-source写成不存在的 IP,会静默失败,iptables -t nat -L -n -v查看匹配数是否为 0 可辅助判断 - 规则加在
FORWARD链或PREROUTING链,完全无效
确保 FORWARD 链允许内网流量通过
即使 SNAT 规则正确,若 filter 表的 FORWARD 链默认拒绝,包仍会被丢弃。需放行内网到外网的流量:
iptables -A FORWARD -s 192.168.10.0/24 -o eth0 -j ACCEPT同时建议限制反向流量,避免外部主动连入内网:
iptables -A FORWARD -d 192.168.10.0/24 -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT注意:
state 模块在较新内核中已被 conntrack 替代,若报错 iptables: No chain/target/match by that name,换成:iptables -A FORWARD -d 192.168.10.0/24 -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
保存规则并验证 NAT 是否生效
iptables 规则重启即失,必须保存。不同发行版命令不同:
- CentOS/RHEL 6/7:
service iptables save或iptables-save > /etc/sysconfig/iptables - Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4(需安装iptables-persistent)
8.8.8.8),再在网关机上抓包:tcpdump -i eth0 host 8.8.8.8 and icmp看到源 IP 已变成 SNAT 设置的公网 IP,说明成功。容易忽略的是 DNS——内网服务器的
/etc/resolv.conf 必须指向可用 DNS(如 114.114.114.114),否则能 ping 通 IP 却无法解析域名。

















