设置NAT转发以通过网关服务器实现内网访问外网

由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:9 个月前

内网服务器启动上网服务

场景如下:一个小HPC有一个master节点, 1个 node1 节点, master节点可以上网冲浪, node1节点无法冲浪

方案:使用NAT转发使node1通过master上网冲浪

步骤一:IP转发

在master节点编辑 /etc/sysctl.conf 文件,在该文件中确保以下行取消注释并设置为 1,以允许IP转发:

1
net.ipv4.ip_forward=1

然后执行 sysctl -p 应用更改。

步骤二:配置NAT规则

在master节点使用 iptables 设置NAT规则来将 node1 的流量转发至外网。你需要选择哪个网络接口连向外网(举例使用 eth0):

1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这行命令会把所有经过 master 节点的流量都进行源地址转换(即,伪装成 master 节点),使得 node1 的流量看起来像是从 master 节点发起的。
将规则保存到一个文件,如 /etc/iptables/rules.v4,然后在 /etc/rc.local 或其他启动脚本中通过 iptables-restore 来加载它们:

1
sudo iptables-save > /etc/iptables/rules.v4

并在启动脚本中添加:

1
sudo iptables-restore < /etc/iptables/rules.v4

PS: 如何判断 master 节点上的网络接口是连接外网的

  • 查看接口配置和连接的网络:
    常用的命令是 ip addr show 或者 ifconfig(如果系统上安装了)。这些命令列出了所有接口的IP地址及其状态。一般来说,连接到外网的接口通常拥有公网IP地址或者动态分配的私网IP地址,并且这个地址能够通过路由器访问到互联网。

  • 检查路由表:
    使用 ip route show 或者 route -n 命令来查看系统的路由表。默认路由(0.0.0.0/0 或者 just default)指向的接口通常就是用于连接到外网的接口。

  • 测试网络连接:
    可以尝试使用 ping 命令测试不同的接口与外网通信。对于每个网络接口,可以使用 ping -I 8.8.8.8 来测试。能够成功发送和接收数据包的接口很可能就是连接到外网的。

步骤三:配置防火墙规则(如果有防火墙的话)

如果你的系统使用防火墙,比如 UFW 或 Firewalld,你需要确保它们配置成允许流量转发:

在 master 节点, 对于UFW,可能要编辑 /etc/default/ufw 文件:

1
DEFAULT_FORWARD_POLICY="ACCEPT"

然后,配置UFW规则来允许流量通过,或者直接用 iptables。

步骤四:在 node1 上配置网关

在 node1 节点上,你可能需要配置默认网关指向 master 节点的内网IP,这样所有默认路由的外网流量才会通过 master 节点。你可以使用 route 或者 ip route 命令来设置这个:

1
sudo route add default gw master内网IP地址

或者

1
sudo ip route add default via master内网IP地址

步骤五:测试配置

完成配置后,从 node1 尝试ping外网地址,比如:

1
ping 8.8.8.8

如果可以ping通,再尝试解析域名,这可以确认DNS解析是否也正常工作:

1
ping baidu.com

如果所有步骤操作正确,node1 应该能够通过 master 节点访问外网。

PS:DNS 配置:

  • 检查 node1 上的 /etc/resolv.conf 文件,确保它包含正确的 DNS 服务器信息:

    1
    cat /etc/resolv.conf

    里面应该列出至少一个 nameserver,例如:

    1
    2
    nameserver 8.8.8.8
    nameserver 8.8.4.4

    这里 8.8.8.8 和 8.8.4.4 是 Google 的公共 DNS 服务器。

  • 尝试使用公共 DNS 服务器:
    如果 resolv.conf 没有列出 DNS 服务器,或者列出的 DNS 服务器不工作,你可以尝试更换为公共 DNS,如 Google 的 DNS:

    1
    echo 'nameserver 8.8.8.8' | sudo tee /etc/resolv.conf > /dev/null

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!