搭建NAT网络使局域网内的服务器联网
场景
Node2服务器连接了公网,但是Node1和Node3无法连接公网,他们都在一个局域网内。
原理
Node2允许路由转发,Node1和Node3添加路由表,优先把流量转发给Node2
Node2:
在有网的 node002 上开启路由转发,需要取得root权限。
sudo sysctl -w net.ipv4.ip_forward=1
# 开启 NAT 伪装(假设 eth0 是连外网的网卡)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Node1、Node3
如果你不想删除原有的路由(怕以后还要用),可以给新路由设置一个极小的 metric 值(值越小,优先级越高):
# 假设原有路由的 metric 是 100,我们设为 10
sudo ip route add default via <node002的内网IP> metric 10
计算机网络
这个操作的本质是把 Node002 变成了一个局域网内的“软路由器”。
在默认情况下,Linux 机器像一个孤岛,收到不属于自己的数据包会直接丢弃。通过你的这两步操作,我们打破了这个限制。以下是详细的层级原理说明:
1. Node002 端的原理:从“主机”变身“路由器”
net.ipv4.ip_forward=1 (开启转发门禁)
默认情况下,Linux 内核出于安全考虑,ip_forward 是关闭的(值为 0)。
- 关闭时:如果 Node002 收到一个目标 IP 不是它自己的数据包,它会直接报错丢弃。
- 开启后:Node002 就像一个中转站,收到目标 IP 不是自己的包时,它会查自己的路由表,发现:“哦,这个包要去百度,我有出口,我帮你传过去。”
iptables ... -j MASQUERADE (地址伪装/NAT)
这是最关键的一步,涉及 网络地址转换 (NAT) 技术。
- 问题:Node001 发出的包,源 IP 是局域网私有 IP(如
192.168.1.10)。当这个包通过 Node002 传到公网(比如传给腾讯服务器)时,腾讯服务器想回包,但它无法直接把包发给一个私有 IP,因为公网上有无数个192.168.1.10。 - 解决:
MASQUERADE(伪装)会将 Node001 发出的包里的“源 IP”临时替换成 Node002 的“公网 IP”。 - 回包:当腾讯服务器回包给 Node002 时,Node002 会查一张内部记录表(NAT 表),想起:“这个包其实是刚才 Node001 托我发的”,于是再把目标 IP 改回 Node001 的内网 IP,转发回去。
2. Node001/003 端的原理:重新规划路径
ip route add default via ... (设置下一跳)
这涉及计算机网络的 路由寻址原理。
当你在 Node001 上访问 8.8.8.8 时,系统会执行以下逻辑:
- 查表:目的地
8.8.8.8在我的本地局域网(192.168.1.x)吗? - 判断:不在。那么就看“默认网关”(Default Gateway)。
- 动作:你添加的命令告诉 Node001:“所有不在本地的对象,全部把包丢给 Node002 的内网 IP。”
metric 10 (优先级的博弈)
Linux 路由表可以有多条“默认路径”。Metric 代表距离(权重)。
- 系统总是选择
Metric值最小的那条路。 - 如果你原本的网关 Metric 是 100(不通),你加了一个 Metric 10 的 Node002。系统会认为这条路“更近/更优”,从而无视旧的那条。
3. 完整数据流向示意图
- Node001: 产生请求 查路由表 发现下一跳是 Node002 发给 Node002。
- Node002: 收到包 发现开启了
ip_forward执行MASQUERADE(把源 IP 换成自己的公网 IP) 送入互联网。 - 互联网: 响应数据 发回给 Node002。
- Node002: 收到回包 查 NAT 映射表 发现是 Node001 的包 转发给 Node001。
避坑小贴士
- 持久化:
sysctl命令重启后会失效。如果想永久生效,需要修改/etc/sysctl.conf并添加net.ipv4.ip_forward=1。 - 防火墙策略:如果 Node002 开启了
ufw或firewalld,除了iptables规则,还需要确保FORWARD链是允许通过的(sudo iptables -P FORWARD ACCEPT)。

浙公网安备 33010602011771号