按照项目对云主机的规划,只有一台主机具有外网IP(下文称A主机),其他主机都只有内网IP(下文称B主机)。换句话说,只有A主机可以访问外网,B主机不行。虽然这是出于安全性和成本等方面的考虑(数据库、后端接口等不宜暴露),但是这样一来,管理B主机都很成问题了,如何解决呢?

索性所有云主机将会位于同一个机房,内网是互通的,因此可以在A主机上,用Linux系统的神器iptables配置端口转发,从而实现从外网对B主机的访问。下面的配置都在A主机上完成。

已知A机器内网IP:192.168.1.68,外网IP:10.0.0.9,B机器内网IP:192.168.1.64,要实现设置当外网访问A机器22681端口时转发至B机器22端口,也即可以使用命令直接从外网登录B主机

1
ssh -p 22681 username(B)@hostname(A)

首先要启用IPv4转发,打开/etc/sysctl.conf文件,将这一行前的注释符号去掉

1
net.ipv4.ip_forward=0

保存后不放心的话可以用这个命令检查一下(p=print)

1
sysctl -p

然后是配置转发,步骤如下:

1
2
3
4
#设置将A机器内网22681端口上的请求转发至B机器上
iptables -t nat -A PREROUTING -d 192.168.1.68 -p tcp –dport 22681 -j DNAT –to-destination 192.168.1.64:22
#将B机器的应答数据返回至A机器
iptables -t nat -A POSTROUTING -s 0.0.0.0/0 -p tcp –dport 22 -j SNAT –to-source 192.168.1.68

最后是保存配置

1
iptables-save

当然,Linux系统中iptables其实是个很复杂的东西,要不然怎么可以称之为“神器”嘛,前面配置的时候一大堆PREROUTING、POSTROUTING、DNAT、SNAT的本文也没有多做解释,有想要详细了解的,我觉着这篇文章分析的还算详细。