核心是启用IP转发并配置POSTROUTING规则:先执行sysctl -w net.ipv4.ip_forward=1(永久改/etc/sysctl.conf),再根据外网IP是否固定选择SNAT(--to-source指定静态IP)或MASQUERADE(自动适配动态IP)。

iptables -t nat 配置 SNAT 实现局域网共享上网,核心就两件事:**打开内核转发 + 一条 POSTROUTING 规则**。其他规则不是必须的,加了反而容易出错。
必须先启用 net.ipv4.ip_forward
不打开这个,Linux 默认丢弃非本机目的地址的数据包,NAT 根本没机会生效。
- 临时生效:
sysctl -w net.ipv4.ip_forward=1 - 永久生效:改
/etc/sysctl.conf里这行 →net.ipv4.ip_forward = 1,再执行sysctl -p - 验证是否生效:
cat /proc/sys/net/ipv4/ip_forward输出1才算成功
SNAT 和 MASQUERADE 怎么选
关键看外网接口 IP 是固定还是动态:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 外网 IP 固定(比如服务器有静态公网 IP)→ 用
SNAT:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.42 - 外网 IP 动态(比如 ADSL 拨号、DHCP 获取、云主机弹性 IP)→ 必须用
MASQUERADE:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE -
MASQUERADE会自动读取出口网卡当前 IP,SNAT写死 IP;写错--to-source值会导致回包失败
为什么只配 POSTROUTING 就够了
因为 SNAT 只修改“发出”数据包的源地址,发生在路由之后、发包之前,POSTROUTING 是唯一合法位置。
-
SNAT只能用于nat表的POSTROUTING链,其他链加了也无效 - 不需要在
FORWARD链额外加ACCEPT—— 如果你没把FORWARD策略设为DROP,默认就是放行 - 如果已设
iptables -P FORWARD DROP,才需补两条基础放行:iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPTiptables -A FORWARD -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
内网客户端配置常被忽略的点
网关和 DNS 不配对,即使 NAT 规则全对,也上不了网。
- 内网机器网关必须指向 Linux 网关的内网 IP(比如
192.168.1.1),不能是外网 IP - DNS 推荐配成公网 DNS(如
8.8.8.8或114.114.114.114),别依赖网关转发 DNS —— 多数 Linux 网关默认不开启 DNS 代理 - 验证方法:在内网机器上
ping 192.168.1.1(通)→ping 203.0.113.42(通)→ping www.baidu.com(不通?大概率是 DNS 问题)
192.168.1.0/24 的流量从 eth0 出去时,源 IP 都会被替换成网关的外网地址。这个替换是一次建立、全程维持的,不用每包判断 —— 但前提是连接未超时、连接状态未被内核清理。长时间空闲的 TCP 连接可能因 conntrack 超时断开,这不是规则问题,是内核行为。

















