在阿里云、腾讯云等云平台购买多台服务器时,出于成本考虑,不会为每台服务器配置公有IP。这就带来了一个问题,没有公网IP的服务器无法访问外网。本文介绍了一种未绑定公网IP的服务器访问外网的可选方案,前提是购买的服务器中至少有一台绑定了公网IP。
这里先介绍一下基本原理和步骤。对网络比较了解的朋友可能一眼就知道是怎么回事了。然后后面详细介绍具体操作流程。
基本原理使用与公共IP绑定的服务器作为代理转发网络。
基本步骤假设有两台服务器:
操作步骤如下:
本文以云平台购买的两个节点实例为例:
主节点与公网IP绑定,可以访问外网,工作节点没有与公网IP绑定,不能访问外网。
用ip route show命令查看两台主机的路由表,有如下记录:
默认通过192.168.0.253 dev eth0
也就是说,两台主机都默认使用192.168.0.253作为路由转发请求,因此我们可以大致猜测网络拓扑如下:
当然,真实的网络拓扑会更复杂,所以这里我们只对购买的两台主机做一个简化。
我们现在要做的是,worker1节点可以通过主节点作为代理访问外网。
第一步:建立 master 节点到 worker1 节点的隧道因为两台机器在一个内网,可以互相通信,所以我们可以通过默认网卡在两台主机之间建立隧道。
在主节点上执行以下命令
#创建一个IPIP类型的虚拟网卡 # IP tun add[虚拟网卡名称]mode ipip remote[peer IP address]local[local IP address] IP tunnel add worker 1 _ tunnel mode IP remote 192 . 168 . 0 . 196 local 192 . 168 . 0 . 197 #启动刚刚创建的虚拟网卡 IP link set worker 1 _ tunnel up 绑定IP地址 peer[对端要绑定的IP地址]dev[本地要绑定的虚拟网卡名称] IP add add 192 . 168 . 3 . 100 peer 192 . 168 . 3 . 101 dev worker 1 _
可以看到网卡绑定了IP: 192.168.3.100。
类似地,在worker1节点上执行以下命令
ip隧道添加master_tunl模式ipip remote 192 . 168 . 0 . 197 local 192 . 168 . 0 . 196 IP link set master _ tunl up ipadd 192 . 168 . 3 . 101 Peer 192 . 168 . 3 . 100 dev master _ TUNL执行ip addr show命令,看到worker1节点有以下网卡:
可以看到网卡绑定了IP: 192.168.3.101。
现在让我们验证隧道是否已经成功建立,并且在主节点上执行ping 192.168.3.101。
类似地,在worker1节点执行ping 192.168.3.100。
可以看出,两台主机已经可以通过设置的IP相互访问,从而两台主机之间的隧道成功建立。
第二步:在 worker1 节点修改路由表,让 master 节点作为 worker1 节点默认路由的网关我们可以首先执行ip route show来检查当前的默认路由。
此路由显示,worker1节点上的默认路由使用192.168.0.253作为默认网关。
首先,执行ip route del default删除默认网关。
然后,通过192.168.3.100 Devmaster _ TUNL设置执行IP路由添加默认,以使用主节点作为默认网关。注意,创建的master_tunl虚拟网卡在这里被用作网络设备。
第三步:在 master 节点通过 iptables 工具,对通过我们创建的隧道过来的请求进行 SNAT 转换因为来自worker1的请求的源地址是内部网络地址192.168.3.101,所以来自外部网络的请求在没有nat转换的情况下无法到达worker1节点。
我们执行以下命令来设置nat
#我们设置的隧道网段是192.168.3.0/24。以下设置会将源地址在网段192.168.3.0/24中的请求发送到snat。 #源地址会伪装成出口网卡的IP地址 iptables-tnat-a posting-s192..
在worker1节点ping Baidu.com
您可以看到worker1节点可以访问外部网络。
问题检查主节点是否开启路由转发功能。该方案要求转发节点开启转发功能。
打开模式: