要在Linux上用iptables实现局域网共享上网,核心就是启用IP转发 + 配置SNAT(或MASQUERADE)规则,让内网主机发出的数据包源IP被替换成网关的外网IP,从而能正常访问互联网。

开启IPv4转发功能
这是前提,否则Linux不会转发非本机地址的数据包:
- 临时生效:sysctl -w net.ipv4.ip_forward=1
- 永久生效:编辑/etc/sysctl.conf,确保含net.ipv4.ip_forward = 1,再执行sysctl -p
确认内外网网卡及地址
假设网关服务器有两块网卡:
- eth1接内网(如IP为192.168.10.1/24)
- eth0接外网(如获取到公网IP 203.0.113.45)
内网客户端需将默认网关设为192.168.10.1,DNS可设为公共DNS(如8.8.8.8)。
配置SNAT规则
进入nat表,在POSTROUTING链添加规则:
- 若外网IP固定(推荐):iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.45
- 若外网IP动态(如PPPoE拨号、DHCP):iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
注意:SNAT只能用于POSTROUTING链;MASQUERADE是SNAT的动态版,自动获取出口网卡当前IP,适合IP不固定场景。
验证与保存
测试连通性:
- 从内网主机ping外网地址(如ping 8.8.8.8)
- 若通但无法解析域名,检查DNS设置
- 若不通,用tcpdump -i eth0 icmp在网关上抓包,确认数据是否发出及响应是否返回
保存规则(避免重启丢失):
- CentOS/RHEL:service iptables save 或 iptables-save > /etc/sysconfig/iptables
- Ubuntu/Debian:iptables-save > /etc/iptables/rules.v4


















