如题。因为某些原因,需要调用 API 的时候,IP 是固定的。
大家讨论了一下,有两个方案产出:
1. 直接在 IP 对应的 A 机器上请求
2. 把 IP 对应的 A 机器当作 HTTP 代理服务器,真正调用在 B 机器上
由于不太确定 HTTP 代理的机制,不知道第三方会不会能查到用了代理
所以请教各位。
PS:由于时间有限,最后用了方案1,比较保守。但方案1需要在A机器上部署代码,比较繁琐。。。
1
xuanbg 2023-01-08 23:19:42 +08:00
代理和直接访问还是有区别的。既然对方限制访问 IP ,估计简单代理是不行的。不过对于固定的 API ,完全可以在 A 机器上运行一个调用第三方 API 的服务,这服务部署好了就不需要动,还是可以接受的。
|
2
CEBBCAT 2023-01-08 23:23:57 +08:00
可以复习一下计算机网络。API 他能拿到的无非是 HTTP 请求。侧信道就是请求时间、频率等。
HTTP 请求有请求头和请求体,最显眼的是 UA 。 你要不还是写一个业务代理吧,就是类似“请求网关”这样的概念。需要调用 API 的时候请求 A 上的内部服务,让它构造一个请求,发到 API ,然后再把报文返回。 |
3
CEBBCAT 2023-01-08 23:25:53 +08:00
@xuanbg #1 有点不解,既然都用 HTTP 代理了,又如何用 IP 限制到 B 呢?这时候通过 TCP 层面,只能看到 A 的 IP 吧。
你说的是 HTTP 代理服务器会加 Header 这种情况是吗? |
5
CEBBCAT 2023-01-08 23:38:54 +08:00
|
6
ragnaroks 2023-01-09 00:21:57 +08:00
代理依据泄露客户端信息的多少分为透明代理、匿名代理、精英代理。
透明代理:服务端知道客户端在使用代理,并且知道代理和客户端是两个独立。 匿名代理:服务端知道客户端在使用代理,但是只能看到代理的信息,看不到客户端的信息。 精英代理:服务端不知道客户端在使用代理。 按你的需求,透明代理就行了,常见实现就是 A 开个 socks5 服务端,B 直接在请求时附加代理即可。不确定你使用何种技术栈,但是主流标准库库或框架都可以实现类似于 httpClient.setSocksProxy(address,port) 的代理附加。 |
7
ragnaroks 2023-01-09 00:24:47 +08:00
上文有些字词有多个意思,而且代理本身也分正向代理和反向代理,且针对你的需求来说正向反向都能实现。我的建议时先不要考虑那么多,直接起个 socks5 用着,接口那边找过来再改。
|
8
IvanLi127 2023-01-09 00:28:51 +08:00 via Android
A 机器用高匿代理一般就不会知道了。HTTP 头不传 forward 字段应该就差不多了。或者你直接用三层及以下的代理,应该就无感了
|
9
lcy630409 2023-01-09 09:10:39 +08:00 1
|
10
unco020511 2023-01-09 10:37:35 +08:00
很简单,你把「 A->API 服务器」和「 A ->B -> API 服务器」的 http 请求抓取出来一对比,就知道是否有区别,如果有区别,API 服务器就有可能识别,或者你可以想办法处理成无区别
|
11
mango88 2023-01-09 12:32:33 +08:00
nginx 反代 API
|