核心是配置snat或masquerade实现源地址转换:先启用ip转发(临时echo 1 > /proc/sys/net/ipv4/ip_forward,永久修改/etc/sysctl.conf并sysctl -p),再根据出口ip是否固定选择iptables -t nat -a postrouting -s 内网段 -o 外网接口 -j snat --to-source 公网ip或masquerade,同时配置forward链放行内网出向及回程流量,并确保内网设备默认网关指向linux网关。

要让内网设备通过一台Linux主机共享上网,核心是配置SNAT(源地址转换),本质是把内网机器发出的数据包的源IP替换成Linux网关的公网IP,使数据能被互联网路由器接收并返回。
必须先开启IP转发功能
Linux默认不转发数据包,需手动启用:
- 临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.ip_forward = 1,再执行sysctl -p
选择SNAT还是MASQUERADE
- 如果你有固定公网IP(如202.0.0.2),用SNAT:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.0.0.2 - 如果是拨号、PPPoE或动态公网IP(比如ADSL、家庭宽带),用MASQUERADE更稳妥:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
它会自动读取出口网卡当前的IP,无需手动更新规则。
确保内网设备路由正确
每台内网主机必须把Linux网关设为默认网关,例如:ip route add default via 192.168.1.1
或在网卡配置中写入 GATEWAY=192.168.1.1
补充必要的FORWARD链放行规则
若防火墙默认策略是DROP,还需允许转发流量:
- 允许内网发起的连接出去:
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT - 允许已建立连接的响应回来:
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
验证是否生效
- 在内网机器上执行
curl ifconfig.me,看返回的是否是你的公网IP - 在Linux网关上执行
iptables -t nat -L -n -v,检查POSTROUTING链是否有命中计数
不复杂但容易忽略











