人生苦短
一起搞机
justhost
aws
ptgidc
recloud
spinservers

如何让没有外网IP的云主机服务器拥有外网访问能力

360proxy
racknerd

云上企业集群环境,不可能为所有云主机都配备外网IP,所以会有一部分机器没有外网能力。然而不是所有的云厂商都提供内网的yum服务,当需要安装软件的时候,会比较麻烦。如下图所示,只有B机器能访问外网。

云服务器无外网IP

此时,若我们想要A和C都能访问外网,要怎么办呢?想想家庭网络环境,一条光纤,一个外网IP,一个路由器,家里所有的电脑、手机都能上网了。所以这里我们缺少一个路由器。现在我们让B机器来兼职下路由器。

linux架设简易路由器访问外网

直接在B机器上运行下面的脚本:

#!/bin/bash
#Auth:dige
#Blog:https://hqidi.com
#Time:2018-10-2  09:40:47
#Name:route.sh
#Version:V1.0
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.13.110.198 -o eth0 -j SNAT --to-source 10.13.185.186
iptables -t nat -A POSTROUTING -s 10.13.80.128 -o eth0 -j SNAT --to-source 10.13.185.186 

脚本解析:
echo 1 > /proc/sys/net/ipv4/ip_forward
这条命令是在打开linux系统的路由转发功能,这是临时生效的(系统重启后失效)若要永久生效,编辑/etc/sysctl.conf文件,添加一行 net.ipv4.ip_forward=1 (centos6默认有此配置行,不过值是0,得修改为1)

iptables -t nat -A POSTROUTING -s 10.13.110.198 -o eth0 -j SNAT --to-source 10.13.185.186

拆解下这条长长的命令:
iptables -t nat :对iptables的nat表进行操作,这个表是用来做网络地址转换的。
-A POSTROUTING :在POSTROUTING链添加一条规则。
-s 10.13.110.198 :当来源IP是10.13.110.198的时候。
-o eth0 :把数据从eth0转发出去。
-j SNAT :做SNAT操作。
–to-source 10.13.185.186 :把原本是从10.13.110.198发出来的数据包的源地址修改为10.13.185.186。
整合起来就是这样的:
当A机器访问internet的数据包到达B机器的时候,B机器上的iptables把数据包从eth0向外转发,并把数据包的源地址修改为10.13.185.186 (正常情况下,应修改为B机器的外网IP的,现在云服务商都没有直接把外网ip绑定在centos系统内,就是说B机器外面还有一层NAT)
若觉得太复杂,我们可以改成一个比较简单的脚本:

#!/bin/bash
#Auth:dige
#Blog:https://hqidi.com
#Time:2018-10-2 09:47:47
#Name:route.sh
#Version:V2.0
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

这个脚本的转发性能没有上面那个高,但简单,不用管什么外网IP,源地址,目的地址。
执行脚本:
./route.sh
然后把A和C机器的默认路由设为B机器的内网IP就行了,刚开始A和C机器吵着“我要上网,我要上网”上不了,当你把默认路由设为B机器后,相当于你答复A和C机器说,你们要上网的话去找B机器,他知道路。在A和C机器上执行:
route add default gw 10.13.185.186 eth0
此时,A和C机器都能连通互联网了。图中最上面的绿色箭头已通。但是,外网用户若要访问C机器,要怎么办呢?若C机器提供web服务,那好说,直接在B机器上装nginx做反向代理,若想从外网直接ssh登录C机器呢,现在我们解决图中最下面的蓝色箭头。
只需要在B机器上操作:

iptables -t nat -A PREROUTING -d 106.115.15.86 -p tcp --dport 22128 -j DNAT --to-destination 10.13.80.128:22

当有请求访问外网的22128端口的时候,把请求转发到内网10.13.80.128的22端口上。此时图中最右边的用户访问C机器应该是 10.13.80.128 加端口 22128的形式访问。

采购云服务商NAT网关访问外网

古语有云:万事加钱可及
刚刚我们自己做了个路由器,很折腾,下面讲简单的方法,买一个路由器

配置服务器路由器

云服务商专门提供了一个产品“NAT网关”来实现我们上面的需求。
阿里云NAT 网关 :https://help.aliyun.com/product/44413.html
腾讯云NAT 网关 :https://cloud.tencent.com/product/nat
UCloud优刻得NAT网关 :https://console.ucloud.cn/vpc/natgw
把原本绑定在B机器上的EIP解绑,然后绑定到NAT网关上。
出外网模式选择白名单模式,然后添加所有没外网IP的机器:

nat网关添加白名单管理

这样,第一张图中的绿色箭头就通了。
配置下端口转发,用以实现外网ssh连接:

配置端口转发规则

这样,第二张图中的蓝色箭头就通了。

转载自笛声

未经允许不得转载:老刘测评 » 如何让没有外网IP的云主机服务器拥有外网访问能力