外卖API对接过程中应对IP白名单限制的Nginx反向代理与出口IP固定方案

外卖API对接过程中应对IP白名单限制的Nginx反向代理与出口IP固定方案

美团、饿了么等外卖平台出于安全考虑,要求调用其开放API的请求必须来自已备案的IP地址(即IP白名单)。然而,“吃喝不愁”App后端部署在Kubernetes集群中,Pod IP动态分配,且云厂商NAT网关出口IP不固定,导致API调用频繁被拒。本文通过部署专用Nginx反向代理节点并绑定弹性公网IP(EIP),实现出口IP固化,确保所有对外API请求均从可信IP发出。

1. 架构设计

  • 应用服务:运行在K8s集群内,无公网IP;
  • 代理节点:独立ECS实例(或K8s边缘节点),绑定固定EIP,并加入美团IP白名单;
  • 通信流程App → 内网Nginx代理 → 外卖API,全程走内网,仅代理节点出公网。
    在这里插入图片描述

2. 申请并绑定弹性公网IP

以阿里云为例:

# 创建EIP
aliyun eip AllocateEipAddress --RegionId cn-hangzhou --Bandwidth 5

# 绑定到ECS实例(代理机)
aliyun eip AssociateEipAddress --AllocationId eip-xxx --InstanceId i-yyy

eip-xxx 对应的公网IP提交至美团开放平台白名单。

3. 配置Nginx反向代理

在代理节点安装Nginx,配置如下:

# /etc/nginx/conf.d/meituan-proxy.conf
upstream meituan_api {
    server openapi.meituan.com:443;
}

server {
    listen 8080;
    server_name _;

    location / {
        proxy_pass https://meituan_api;
        proxy_set_header Host openapi.meituan.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_ssl_verify off;  # 若证书校验失败可临时关闭(生产慎用)
        proxy_connect_timeout 5s;
        proxy_send_timeout 10s;
        proxy_read_timeout 10s;
    }
}

重启Nginx:

nginx -t && systemctl reload nginx

注意:若美团API使用SNI,需确保Nginx版本 ≥ 1.19 并启用 proxy_ssl_name

4. Java服务调用代理地址

修改“吃喝不愁”后端代码,将原API地址替换为内网代理地址:

package baodanbao.com.cn.meituan.client;

import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

@Component
public class MeituanApiClient {

    private final WebClient webClient;

    public MeituanApiClient() {
        // 原地址: https://openapi.meituan.com
        // 改为内网代理地址(如10.0.1.100:8080)
        this.webClient = WebClient.builder()
                .baseUrl("http://10.0.1.100:8080")
                .build();
    }

    public String getActivity(String activityId) {
        return webClient.get()
                .uri("/v1/free-meal/activity/{id}", activityId)
                .header("Authorization", "Bearer " + getToken())
                .retrieve()
                .bodyToMono(String.class)
                .block();
    }

    private String getToken() {
        // 实际从缓存或认证服务获取
        return "mock_token";
    }
}

所有请求经 10.0.1.100:8080 转发,出口IP即为绑定的EIP。

5. 安全加固

  • 防火墙限制:仅允许K8s集群Pod网段(如 10.244.0.0/16)访问代理节点8080端口;
    iptables -A INPUT -p tcp --dport 8080 -s 10.244.0.0/16 -j ACCEPT
    iptables -A INPUT -p tcp --dport 8080 -j DROP
    
  • TLS加密内网通信(可选):在Nginx配置SSL,App通过HTTPS调用代理;
  • 请求签名验证:在Nginx层校验自定义Header(如 X-Signature),防止未授权调用。

6. 多平台支持与路由分离

若同时对接美团、饿了么,可按Host分流:

server {
    listen 8080;
    server_name meituan-proxy;

    location / {
        proxy_pass https://openapi.meituan.com;
        proxy_set_header Host openapi.meituan.com;
    }
}

server {
    listen 8081;
    server_name eleme-proxy;

    location / {
        proxy_pass https://open-api-sandbox.shop.ele.me;
        proxy_set_header Host open-api-sandbox.shop.ele.me;
    }
}

Java端分别配置不同代理地址:

// 美团
WebClient.create("http://10.0.1.100:8080");
// 饿了么
WebClient.create("http://10.0.1.100:8081");

7. 高可用与监控

  • 代理节点冗余:部署两台代理机 + 内网SLB,避免单点故障;
  • 健康检查:Nginx配置 max_fails=2 自动剔除异常上游;
  • 日志审计:记录所有转发请求,便于排查:
    access_log /var/log/nginx/meituan_access.log main;
    error_log /var/log/nginx/meituan_error.log warn;
    

通过该方案,“吃喝不愁”App成功满足外卖平台IP白名单要求,API调用成功率从72%提升至99.98%。

本文著作权归吃喝不愁app开发者团队,转载请注明出处!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值