当开发遇到了IP白名单限制

前言

不知道有没有小伙伴在开发的过程中遇到过:第三方服务提供的接口,只能通过在其IP白名单池里的IP才能访问?

面对这个痛点,有以下几种可能的方案:

申请将本地开发环境的IP地址加入到第三方的IP白名单池里

优点:本地环境无需做额外配置

缺点:本地环境IP地址变更频繁,需要频繁申请将IP加入到白名单中,沟通协调成本高

本地只进行代码开发,将服务部署到线上环境进行第三方接口调试

优点:无需进行额外的申请或者配置

缺点:开发效率低,功能完成后需要先部署上线再调试,不利于问题的排查和解决

使用远程代理,实现本地IDE <--> 远程代理 <--> 第三方接口

优点:开发效率高,在本地IDE里,一边进行代码开发,一边进行第三方接口调试。符合常规开发方式

缺点:需要进行额外的配置

可以看到,方案1和方案2的缺点都是比较明显和难以被忍受的,在实际工作中无法满足我们的需求。而方案3,虽然需要进行一些额外的配置和花费一定的成本,但确是比较合理和容易实现的方案。

所以,本文会用方案3来解决我们开发过程中遇到的这个白名单痛点。

基本思路

在本地IDE和第三方服务器之间架设一个代理服务器。

该代理服务器需要有一个固定的公网IP地址,并申请将该IP地址加入到第三方的IP白名单池里。

配置本地IDE环境,使其请求通过该代理服务器转发到第三方服务器上。如下图所示:

所以,从上面的思路来看,需要完成以下几点:

有一台具备公网固定IP的服务器作为代理服务器(可以在各大公有云提供商上申请一台,不赘述)向第三方申请将该固定IP加入其访问白名单池(非技术问题,不赘述)在代理服务器上配置代理,这里使用的代理软件是Squid本地IDE环境下,配置必要参数来连接代理服务器,这里使用的本地IDE是IntelliJ IDEA

具体实现

3.1 在代理服务器上安装配置Squid

Squid Cache(简称为Squid)是HTTP代理服务器软件。Squid用途广泛,可以作为缓存服务器,可以过滤流量帮助网络安全,也可以作为代理服务器链中的一环,向上级代理转发数据或直接连接互联网。

3.1.1 安装Squid(基于Centos系统)

安装:

$ yum install squid -y

$ yum install httpd-tools -y

启动:

$ systemctl start squid.service

关闭

$ systemctl stop squid.service

开机自启动

$ systemctl enable squid.service

3.1.2 配置Squid

打开Squid的配置文件:

$ vi /etc/squid/squid.conf

修改squid.conf文件,这里以只允许通过Squid代理访问juejin.cn为例:

# 只允许代理访问 juejin.cn

acl juejin_url url_regex juejin.cn

http_access allow juejin_url

http_access deny all

# Deny request for original source of a request(让第三方服务器认为请求来自公网IP)

follow_x_forwarded_for deny all

# 3128为默认端口号,建议修改

http_port 0.0.0.0:3128

其他保持默认配置即可。

需要注意的是: 由于本地IDE配置代理不支持密码方式(不确定?如果支持,请不吝赐教),所以squid.conf配置文件里没有加入密码相关的配置

3.2 在本地IDE里配置代理

点击Edit Configurations, 点击左边栏Spring Boot,找到启动类xxxApplication,编辑Environment里的VM options。假设代理服务器的公网IP为:123.123.123.123, 监听的端口号为:3128 (在squid.conf已经指定), 那么在VM options栏填写:

-DproxyHost=123.123.123.123 -DproxyPort=3128