如何通过特定 IP 路由 API 请求?

Posted

技术标签:

【中文标题】如何通过特定 IP 路由 API 请求?【英文标题】:How to route API Requests through a specific IP? 【发布时间】:2019-08-02 20:30:15 【问题描述】:

我正在制作一个 iosandroid 应用程序。我们需要应用程序中的充值功能。我们正计划使用一家公司提供的 Recharge API。

出于安全原因,API 仅允许通过特定 IP 列入白名单的 IP 地址进行请求。

理想情况下,此 IP 地址应该是我们服务器的 IP。

但我们在我们的应用中使用 Firebase 作为数据库以及存储和身份验证。

那么我们如何才能使我们的用户通过应用程序发出的 API 请求能够通过并且不会导致错误,因为用户的 IP 地址不会被列入白名单?

【问题讨论】:

您需要将来自您的应用的请求代理到充值 API。您不应直接从您的应用程序调用 API,而应通过具有列入白名单的 IP 地址的代理。根据 API 的性质,您可以使用现成的解决方案,如 nginx 或 HAProxy,或使用您选择的任何语言编写自定义服务器 你能给我一些参考链接告诉我如何做到这一点? 您需要一个具有公共 IP 地址的服务器。您可以从 DigitalOcean、Linode 或 Vultr 获得一个,然后安装 HAProxy。如果您可以管理 Linux,我可以在答案部分中指导如何使用 HAProxy 执行此操作。 是的,我可以管理 Linux,而且我知道如何部署服务器。 【参考方案1】:

这是 nginx 的面包和黄油。

这样的位置块会将请求代理到上游;

    location / 
        proxy_redirect          off;
        proxy_pass_header       Server;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Scheme $scheme;
        proxy_set_header        Host upstream-host.com.au;
        proxy_set_header        X-NginX-Proxy true;
        proxy_connect_timeout   5;
        proxy_read_timeout      240;
        proxy_intercept_errors  on;

        proxy_pass      upstream-host.com.au:443;
    

这对我来说效果很好。真的很容易设置,我发现 HAProxy 在配置中有点挑剔,因为这非常容易。

【讨论】:

【参考方案2】:

您需要代理来自您的用户的 API 请求,这样,对于您的 API 提供商,所有请求似乎都来自同一个静态 IP 地址,该地址将被列入白名单。

代理是一种被动软件组件,它本质上是在一端接收请求,然后将它们转发到另一端的 API 服务器。换句话说,它代表您的用户进行 API 调用。

您可以使用 NGINX、HAProxy 或任何可用的反向代理,或者使用您选择的语言编写自定义代理 - 因为这不是一项困难的任务。

这里是如何在 Linux 机器上使用 HAProxy 设置反向代理。

首先,从 linux 终端安装haproxy

apt update && apt install haproxy

然后导航到文件夹/etc/haproxy

cd /etc/haproxy

将默认配置文件重命名为haproxy.cfg.backup

mv haproxy.cfg,.backup

现在,创建一个新的配置文件,haproxy.cfg

nano haproxy.cfg

用下面的内容,然后保存修改。

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend api_proxy
    bind *:8080
    mode http
    default_backend remote_api_server

backend remote_api_server
    #replace 10.10.10.10 with the actual Ip address
    server server1 10.10.10.10:443 ssl

10.10.10.10替换为API提供者IP地址,将443替换为实际端口。

如果 API 未使用 HTTPS,请删除 ssl 选项

8080 是您的用户将连接到的端口。随意更改。

现在,使用以下命令启动 haproxy:

haproxy -D -f haproxy.cfg

您可以验证 haproxy 正在侦听端口 8080

telnet localhost 8080

将您的应用配置为通过代理 URL 调用充值 API,即:

http://your_server_ip_address:8080/your/api/url

不过,您需要在生产环境中配置 HTTPS。

查看下面的链接,了解如何使用 haproxy 配置 SSL

https://www.ibm.com/support/knowledgecenter/en/SSTPQH_1.0.0/com.ibm.cloudant.local.install.doc/topics/configure_haproxy.html

如果这有帮助,请告诉我。

【讨论】:

是的。谢谢你。我试试这个。 不客气。如果您需要任何帮助,请告诉我 我从谷歌计算引擎配置了一个 Ubuntu 实例。 SSH 进入我的 ubuntu 服务器并完成了您编写的所有配置。苏。这是我用于检索值的 API 链接。 joloapi.com/api/… 说 25.25.199.190 是我在 Google Compute Engine 上的服务器 IP 地址。如何通过这些值创建代理 url? 将最后一行替换为server server1 joloapi.com:80 我们如何使用 nginx 来达到目的@bentesha【参考方案3】:

部署您选择的服务器可以是 Ubuntu 或 Windows,使用您选择的语言可以将您的请求路由到所需的第 3 方 API。

因此,理想情况下,来自您客户端的所有请求都将发送到您的服务器,然后您的服务器会将请求解析给第 3 方并回复您的客户端。

您可以查看一个示例 NodeJS/Express REST 实现,该实现可以针对您所需的用例进行扩展。

https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4

【讨论】:

以上是关于如何通过特定 IP 路由 API 请求?的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS Tomcat重新路由请求

如何只允许从某些IP地址访问API

如何重新组合tcpdump为特定设备IP看到的IP分段数据包

如何限制特定 API 网关路由的有效负载大小

如何保护 laravel api 路由免受外部 GET 请求的影响

我怎样才能通过在请求中传递特定参数来获取它们? SpringBoot API