如何通过特定 IP 路由 API 请求?
Posted
技术标签:
【中文标题】如何通过特定 IP 路由 API 请求?【英文标题】:How to route API Requests through a specific IP? 【发布时间】:2019-08-02 20:30:15 【问题描述】:我正在制作一个 ios 和 android 应用程序。我们需要应用程序中的充值功能。我们正计划使用一家公司提供的 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 请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何重新组合tcpdump为特定设备IP看到的IP分段数据包