V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0x0208v0
V2EX  ›  程序员

请教各位一个 HTTP 代理问题:项目里调用第三方 API 拿数据,在 A 机器上直接 http 请求 API,和把 A 机器当作 HTTP 代理,在 B 机器请求 API,效果是一样的吗?第三方 API 会不会查出来是用来代理?

  •  
  •   0x0208v0 · 2023-01-08 23:14:59 +08:00 · 1395 次点击
    这是一个创建于 472 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题。因为某些原因,需要调用 API 的时候,IP 是固定的。
    大家讨论了一下,有两个方案产出:
    1. 直接在 IP 对应的 A 机器上请求   
    2. 把 IP 对应的 A 机器当作 HTTP 代理服务器,真正调用在 B 机器上 

    由于不太确定 HTTP 代理的机制,不知道第三方会不会能查到用了代理

    所以请教各位。  

    PS:由于时间有限,最后用了方案1,比较保守。但方案1需要在A机器上部署代码,比较繁琐。。。

    11 条回复    2023-01-09 12:32:33 +08:00
    xuanbg
        1
    xuanbg  
       2023-01-08 23:19:42 +08:00
    代理和直接访问还是有区别的。既然对方限制访问 IP ,估计简单代理是不行的。不过对于固定的 API ,完全可以在 A 机器上运行一个调用第三方 API 的服务,这服务部署好了就不需要动,还是可以接受的。
    CEBBCAT
        2
    CEBBCAT  
       2023-01-08 23:23:57 +08:00
    可以复习一下计算机网络。API 他能拿到的无非是 HTTP 请求。侧信道就是请求时间、频率等。

    HTTP 请求有请求头和请求体,最显眼的是 UA 。

    你要不还是写一个业务代理吧,就是类似“请求网关”这样的概念。需要调用 API 的时候请求 A 上的内部服务,让它构造一个请求,发到 API ,然后再把报文返回。
    CEBBCAT
        3
    CEBBCAT  
       2023-01-08 23:25:53 +08:00
    @xuanbg #1 有点不解,既然都用 HTTP 代理了,又如何用 IP 限制到 B 呢?这时候通过 TCP 层面,只能看到 A 的 IP 吧。

    你说的是 HTTP 代理服务器会加 Header 这种情况是吗?
    xuanbg
        4
    xuanbg  
       2023-01-08 23:31:05 +08:00
    @CEBBCAT 你抓个包就知道区别了呀。
    CEBBCAT
        5
    CEBBCAT  
       2023-01-08 23:38:54 +08:00
    @xuanbg #4 虽然抓包有点麻烦,但也不是不行,请问对于问题复现你有没有要求的 HTTP 代理实现版本号?或者我找一个流行实现就可以。

    但我还是觉得,最好还是直接说道理比较快捷。
    ragnaroks
        6
    ragnaroks  
       2023-01-09 00:21:57 +08:00
    代理依据泄露客户端信息的多少分为透明代理、匿名代理、精英代理。

    透明代理:服务端知道客户端在使用代理,并且知道代理和客户端是两个独立。

    匿名代理:服务端知道客户端在使用代理,但是只能看到代理的信息,看不到客户端的信息。

    精英代理:服务端不知道客户端在使用代理。

    按你的需求,透明代理就行了,常见实现就是 A 开个 socks5 服务端,B 直接在请求时附加代理即可。不确定你使用何种技术栈,但是主流标准库库或框架都可以实现类似于 httpClient.setSocksProxy(address,port) 的代理附加。
    ragnaroks
        7
    ragnaroks  
       2023-01-09 00:24:47 +08:00
    上文有些字词有多个意思,而且代理本身也分正向代理和反向代理,且针对你的需求来说正向反向都能实现。我的建议时先不要考虑那么多,直接起个 socks5 用着,接口那边找过来再改。
    IvanLi127
        8
    IvanLi127  
       2023-01-09 00:28:51 +08:00 via Android
    A 机器用高匿代理一般就不会知道了。HTTP 头不传 forward 字段应该就差不多了。或者你直接用三层及以下的代理,应该就无感了
    lcy630409
        9
    lcy630409  
       2023-01-09 09:10:39 +08:00   ❤️ 1
    给你一个最简单的办法
    A 机器 直接
    firewall-cmd --add-forward-port=port=443:proto=tcp:toport=443:toaddr=1.1.1.1 --permanent

    unco020511
        10
    unco020511  
       2023-01-09 10:37:35 +08:00
    很简单,你把「 A->API 服务器」和「 A ->B -> API 服务器」的 http 请求抓取出来一对比,就知道是否有区别,如果有区别,API 服务器就有可能识别,或者你可以想办法处理成无区别
    mango88
        11
    mango88  
       2023-01-09 12:32:33 +08:00
    nginx 反代 API
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1189 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:22 · PVG 02:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.