必须用MASQUERADE而非SNAT实现动态NAT,因其自动适配DHCP/PPPoE等动态公网IP;同时须开启并持久化IP转发、限定源地址段、保存iptables规则、放行FORWARD链,否则流量不通或真实IP暴露。

用 iptables 配置 SNAT 来隐藏内网真实 IP,核心是让内网流量出站时把源地址替换成网关的公网 IP。但实际生效必须满足三个前提:开启 IP 转发、正确添加 NAT 规则、持久化保存规则。否则即使命令敲对了,也可能 ping 得通网关却上不了网,或重启后全失效。
确认并启用 IP 转发
Linux 默认不转发数据包,必须显式开启: ```bash # 临时生效(重启丢失) echo 1 > /proc/sys/net/ipv4/ip_forward永久生效(推荐)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
验证是否成功: ```bash sysctl net.ipv4.ip_forward # 输出应为 1
注意:某些新版系统(如 RHEL 8+/CentOS 8+)默认用 nftables,可能绕过 iptables 规则。可检查并切换回 legacy 模式:
update-alternatives --config iptables
选择 MASQUERADE 还是 SNAT?
- 如果外网接口 IP 是**固定**的(如云服务器绑死的弹性公网 IP),可用 SNAT: ```bash iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens3 -j SNAT --to-source 203.0.113.5 ``` - 如果外网接口 IP **动态获取**(如家庭宽带 PPPoE、DHCP 分配),必须用 `MASQUERADE`: ```bash iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens3 -j MASQUERADE ``` 关键区别:`SNAT` 需硬编码公网 IP,IP 变更后规则立即失效;`MASQUERADE` 自动读取出口网卡当前 IP,无需人工干预。务必限定源地址和出口网卡
不要写成无条件的全局伪装,否则本机管理流量、容器流量等也会被误改: - ✅ 正确(只处理指定内网段、指定出口): ```bash iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens3 -j MASQUERADE ``` - ❌ 错误(没限定源、没指定出口、漏 `-t nat`): ```bash iptables -A POSTROUTING -j MASQUERADE # 写进 filter 表,完全无效 ```放行 FORWARD 链并保存规则
NAT 规则只改地址,但数据包仍需经过 `FORWARD` 链。若防火墙默认 DROP,流量会在这里被拦下: ```bash iptables -A FORWARD -i ens37 -o ens3 -j ACCEPT # 允许内网→外网 iptables -A FORWARD -i ens3 -o ens37 -m state --state ESTABLISHED,RELATED -j ACCEPT # 回包放行 ``` 最后必须保存,否则重启清空: - Ubuntu/Debian: ```bash apt install iptables-persistent iptables-save > /etc/iptables/rules.v4 ``` - CentOS 7+/RHEL 7+: ```bash yum install iptables-services service iptables save # 自动存到 /etc/sysconfig/iptables systemctl enable iptables ```不复杂但容易忽略


















