配置linux nat需同时满足三条件:启用ip转发(修改sysctl.conf并运行sysctl -p)、正确选用masquerade(动态ip)或snat(静态ip)规则并限制源地址、确保iptables规则插入postrouting链首行且forward链放行流量。

配置 Linux 的 NAT,核心是让内网设备能通过这台机器访问外网,关键不在“加条规则”,而在于三个环节必须同时到位:IP 转发得开、连接跟踪得稳、iptables 规则位置和写法得准。
开启并持久化 IPv4 转发
内核默认关闭转发,不启用就完全不通。临时开只是应急,重启即失效,必须做持久化。
- 检查当前状态:
cat /proc/sys/net/ipv4/ip_forward,返回 1 才算开 - 立即启用:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:编辑
/etc/sysctl.conf,确保含net.ipv4.ip_forward = 1,再执行sysctl -p - 某些系统(如 RHEL 8+/Ubuntu 22.04+)还依赖
systemd-sysctl.service,改完后建议确认该服务已启用并运行
选对 MASQUERADE 还是 SNAT
绝大多数场景下,用 MASQUERADE 更安全可靠;SNAT 只适合出口 IP 固定且你愿意手动维护的环境。
-
MASQUERADE:自动取出口网卡当前 IP,适合 DHCP、PPPoE、云主机弹性 IP 等动态场景
示例:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE -
SNAT:需硬编码公网 IP,IP 变更后规则立即失效,且无报错提示
示例:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to-source 203.0.113.5 - 务必限制源地址(如
-s 192.168.100.0/24),否则可能把本机 SSH 流量也做了 NAT,导致远程断连 - 别混写:
MASQUERADE不接受--to-source参数,写了会报错
规则必须插在 POSTROUTING 链最前面
NAT 规则如果被前面的 ACCEPT 或 DROP 拦截,包根本到不了转换环节——看起来“规则加了”,实则完全不生效。
- 正确做法是插入第 1 行:
iptables -t nat -I POSTROUTING 1 -s 192.168.100.0/24 -o eth0 -j MASQUERADE - 检查顺序:
iptables -t nat -L POSTROUTING -n --line-numbers,确认规则在第 1 行 - 目标接口(
-o)必须是你真正的出口网卡(如eth0),不是桥接或虚拟接口 - 如果 FORWARD 链已有放行规则(如
-A FORWARD -i eth1 -o eth0 -j ACCEPT),它会在 NAT 前就放行流量,导致 POSTROUTING 根本不触发
配套设置:放行转发 + 内网网关指向
NAT 是个协作流程,只配 nat 表远远不够。
- 允许转发流量:
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT(假设 eth1 是内网口,eth0 是外网口)
还要加返回规则:iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT - 内网设备必须把默认网关设为这台 Linux 的内网 IP,比如 Linux 内网口是
192.168.100.1,那 Windows 或手机的网关就得填这个地址 - 如果内网已有路由器(如 OpenWrt),要关掉它的 DHCP,或设为纯交换模式,否则设备会拿到错误网关
- 验证方法:在内网机器上运行
ip route show default(Linux)或route print(Windows),确认网关指向正确











