核心是三步:开启ip转发(临时echo 1 > /proc/sys/net/ipv4/ip_forward或永久配置/etc/sysctl.conf)、明确内外网接口及内网网段、在nat表postrouting链添加snat(固定ip用--to-source)或masquerade(动态ip)规则。

要在Linux上用iptables -t nat配置基于SNAT的局域网共享上网,核心是让内网设备发出的数据包源IP被统一替换成网关服务器的外网IP,并确保系统开启IP转发。关键不在于堆砌规则,而在于三步到位:开转发、定出口、做SNAT。
开启IPv4转发功能
这是前提,否则数据包到达网关后直接被丢弃:
- 临时启用(重启失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:
编辑 /etc/sysctl.conf,确认或添加这一行:
net.ipv4.ip_forward = 1
然后运行 sysctl -p 加载生效
识别内外网网卡及地址段
必须明确哪块网卡连外网(如 eth0)、哪块连内网(如 eth1),以及内网使用的网段(例如 192.168.10.0/24):
- 查网卡和IP:
ip addr show 或 ifconfig - 确认内网网段无误(比如内网机器都配在 192.168.10.0/24,网关设为 192.168.10.1)
- 外网网卡(如 eth0)必须已获取有效公网IP或可路由IP(非 169.254.x.x 或 127.x.x.x)
配置SNAT规则
在nat表的POSTROUTING链中添加规则,把指定内网网段的出站流量源地址替换为外网接口的IP:
- 有固定外网IP时(推荐,更稳定):
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.45
(把 203.0.113.45 换成你实际的外网IP) - 外网IP动态获取(如PPPoE拨号)时:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
MASQUERADE会自动取出口网卡当前IP,适合DHCP或拨号场景
验证与保存
配置完立即测试,再固化规则防止重启丢失:
- 从内网机器ping外网地址(如 ping -c 3 8.8.8.8),再试域名(curl -I http://baidu.com)
- 检查规则是否生效:
iptables -t nat -L -n -v | grep POSTROUTING - 保存规则(不同发行版方式略有差异):
CentOS/RHEL:service iptables save 或 iptables-save > /etc/sysconfig/iptables
Ubuntu/Debian:iptables-save > /etc/iptables/rules.v4(需安装iptables-persistent)











