使用代理服务器收敛服务外网IP

在产品研发过程中,免不了遇到要接入外部服务的业务场景,例如:第三方支付、短信发送服务、邮件发送服务等等。这里面,不乏一些至关重要的服务,对安全要求性很高,为了便利,服务提供商,往往提出使用 IP 白名单的形式来进行辅助鉴权。若在过去,非常小的企业里,使用托管服务器作为企业的服务器的时代,这一般不在成为问题,一个是服务器本身数量很小,而且很稳定,另一方面,服务器是物理机器,其 IP 地址也相对稳定得多。

而现在,云计算作为一种价格低廉、扩展容易的形式,极大程度替换了原有的服务器托管形态的 IT 基础架构。在云计算的语境下,为了让资源能更高效利用,降低成本,云计算服务商往往采用动态分配资源,以及虚拟化技术的形式,来为企业提供服务。这就造成了哪怕是很小的企业,也有数量庞大的服务器数量(虽然它们是虚拟的),而且,因为动态分配,还可能造成服务器的 IP 并不稳定(因为,在不需要使用的时候,企业可以通过申请取消资源占用来节省开支,这样,如果再次分配,IP 地址就变化了)。

如此一来,依赖 IP 地址白名单的鉴权,就会给产品部署运维带来烦恼。一是,在某个产品研发的过程中,就需要向第三方服务,上报最终线上环境的 IP 地址,这对于使用云计算的企业,可能并不方便,因为服务器此时可能还没有分配呢;二是,产品在发展过程中,可能会逐步成长扩张,当系统容量受到挑战时候,可能就会考虑扩容,在云计算中,扩容是非常容易且频繁的一种行为,这个时候,一旦忘记了追加白名单,那么新扩容的机器,可能马上因为无法调用第三方服务而导致运营事故。

解决这些问题,其实并不困难。比如,业内常说的微服务,就是一种解决此类问题的架构风格,可以将第三方的服务封装起来,然后以一个内部微服务来重新向内部所有产品提供服务。这样,研发和运维此微服务的团队,可以把维护 IP 白名单,作为此服务的一个特性来维护,也会因为业务的内聚性而集中精力而不容易犯错。

然而微服务的实施,并不是每个企业都有能力去实践的,涉及到服务划分、治理、发现、运维等一系列的问题。对架构能力有很大的挑战。所以,我们在这个问题上,使用了非常简单轻巧的方式来收敛企业对外访问的 IP 地址。

proxy-cluster

如图所示,我们使用云服务器,搭建了一个代理服务器的集群,这个集群的主要功能,就是对外提供一组比较稳定的 IP 地址,供第三方服务去做基于 IP 白名单的鉴权。对内部来说,各种产品,无论处于研发的哪个阶段,在第三方服务需要提供 IP 白名单的时候,只要提供 Proxy 的 IP 地址就可以了。因为功能的单纯,两台机器也不会有太高的负载,还是选用两台,主要是为了避免单点故障。

为了在内部解开耦合,特别选用了免费的内网负载均衡组件,来做到内网 IP 地址的解耦合,并且,为今后的平行扩展做好了准备。其实,云服务还提供了,与特定云服务器并不耦合的对外固定 IP,也可以考虑用上来加强方案的稳定性。这样的代理集群,就比较长久稳定地解决了对外 IP 地址的问题,也不需要因为产品的服务器扩容而忘记加 IP 白名单的问题。内部新的产品需要使用同一第三方服务的时候,也不必重新申请白名单了。

然后,在内部,我们在提供一个外部网络访问的客户端,里面统一预置好代理集群的 IP 地址就好了,就能确保内部访问外网的时候,统一带有固定的 IP 地址。