跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

怎么在Linux利用Iptables-T-Nat配置基于SNAT的局域网共享访问功能

核心是启用IP转发并配置POSTROUTING规则:先执行sysctl -w net.ipv4.ip_forward=1(永久改/etc/sysctl.conf),再根据外网IP是否固定选择SNAT(--to-source指定静态IP)或MASQUERADE(自动适配动态IP)。
iptables -t nat
配置 SNAT 实现局域网共享上网,核心就两件事:**打开内核转发 + 一条
POSTROUTING
规则**。其他规则不是必须的,加了反而容易出错。 必须先启用
net.ipv4.ip_forward
不打开这个,Linux 默认丢弃非本机目的地址的数据包,NAT 根本没机会生效。 临时生效:
sysctl -w net.ipv4.ip_forward=1
永久生效:改
/etc/sysctl.conf
里这行 →
net.ipv4.ip_forward = 1
,再执行
sysctl -p
验证是否生效:
cat /proc/sys/net/ipv4/ip_forward
输出
1
才算成功
SNAT
和
MASQUERADE
怎么选 关键看外网接口 IP 是固定还是动态: 外网 IP 固定(比如服务器有静态公网 IP)→ 用
SNAT
:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.42
外网 IP 动态(比如 ADSL 拨号、DHCP 获取、云主机弹性 IP)→ 必须用
MASQUERADE
:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
MASQUERADE
会自动读取出口网卡当前 IP,
SNAT
写死 IP;写错
--to-source
值会导致回包失败 为什么只配
POSTROUTING
就够了 因为 SNAT 只修改“发出”数据包的源地址,发生在路由之后、发包之前,
POSTROUTING
是唯一合法位置。 通义灵码 Linux版 通义灵码 Linux版是阿里云推出的一款AI智能编码助手,专为Linux开发者设计。它支持在Linux操作系统下的JetBrains IDEs、Visual Studio Code等主流集成开发环境中运行。该工具基于通义大模型,提供代码智能生成、实时续写、单元测试生成、代码优化以及研发智能问答等功能,旨在帮助Linux用户在编码过程中提升效率。 下载
SNAT
只能用于
nat
表的
POSTROUTING
链,其他链加了也无效 不需要在
FORWARD
链额外加
ACCEPT
—— 如果你没把
FORWARD
策略设为
DROP
,默认就是放行 如果已设
iptables -P FORWARD DROP
,才需补两条基础放行:
iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
内网客户端配置常被忽略的点 网关和 DNS 不配对,即使 NAT 规则全对,也上不了网。 内网机器网关必须指向 Linux 网关的内网 IP(比如
192.168.1.1
),不能是外网 IP DNS 推荐配成公网 DNS(如
8.8.8.8
或
114.114.114.114
),别依赖网关转发 DNS —— 多数 Linux 网关默认不开启 DNS 代理 验证方法:在内网机器上
ping 192.168.1.1
(通)→
ping 203.0.113.42
(通)→
ping www.baidu.com
(不通?大概率是 DNS 问题) 实际生效后,所有来自
192.168.1.0/24
的流量从
eth0
出去时,源 IP 都会被替换成网关的外网地址。这个替换是一次建立、全程维持的,不用每包判断 —— 但前提是连接未超时、连接状态未被内核清理。长时间空闲的 TCP 连接可能因 conntrack 超时断开,这不是规则问题,是内核行为。

相关文章