我们的测试部门经常需要在淘宝的工具页面上测试api接口调用情况。但是淘宝对api调用有一个白名单限制,一个appkey只允许相应的白名单里的ip地址去调用。所以我们必须伪装一下自己的请求,让它看起来是来自于白名单里的IP。
最简单的方式就是走http代理了。但是在测试中发现,走代理后,淘宝依然能解析到真实IP。这是由于http代理服务器转发请求的时候,会加入一些 X-FORWARDED 相关的字段,标明原始请求IP。淘宝可能是通过这个来发现我们的真实IP的。所以我们需要设置一下http代理去掉这个字段。
但问题在于,在做这种设置后,只有通过淘宝SDK 做的调用才正常,通过淘宝tool工具页面调用的依然提示ip地址不允许。
通过分析请求发现, sdk 调用的请求数据比较精简,只包含api业务相关的信息(比如 appkey,secret等),这样的话,走不走代理淘宝检测不出来(当然,这里指的是在代理服务器不加入一些X-FORWARDED等信息字段的情况下),所以顺利调用了。
而工具页面的请求数据比较复杂,有很多不明字段,可能这些字段里的信息帮助淘宝解析到我们的请求走过代理?不过这次它解析出的ip也不是我们的真实IP了,而是淘宝的内部IP。。所以也可能是一个淘宝的bug。
只好换一种方法。实际上只要请求过去的时候源 ip 是淘宝允许的地址就行,这个可以通过 linux 的 iptables 来做到。
比如: 在我们的白名单服务器 223.5.20.18 ( dmz到内部ip 192.168.100.1) 上配置两条规则:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 110.75.26.154
iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 110.75.0.0/16 -j SNAT --to-source 192.168.100.1
然后,在办公室的路由器上做一条域名转发,把 api.taobao.com 解析到 223.5.20.18 。
做好后应该就可以在工具页面正常调用了。
具体过程是:请求发送到 223.5.20.18 服务器的 80 端口, 服务器根据 iptables 的DNAT规则把请求目标地址改成 110.75.26.154 (淘宝的api服务器), 然后根据SNAT规则把 请求源地址 换成 服务器本身的ip ( 由于dmz的关系,这里是192.168.100.1 )。淘宝接到请求,发现源ip是 223.5.20.18,在白名单里头,顺利通过,返回响应给 223.5.20.18,之前的路径反过来走一遍,调用成功。