调用淘宝接口有每IP数量/时间限制-负载均衡解决
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用淘宝接口有每IP数量/时间限制-负载均衡解决相关的知识,希望对你有一定的参考价值。
其实标题不太准确,不过原理是一样。
这里要解决的问题是:调用淘宝接口有每IP数量/时间限制,但是我们的调用量较大,有可能超过这个限制,从而导致可能被淘宝屏蔽一小段时间。为了解决这个问题,我们需要用多个公网ip去掉接口。而实现这一点的最好地方就是在路由器这一级别。
简要做法如下:
1)做一台linux路由器,它负责接受内网对淘宝的调用请求,然后平均分发到多个公网接口。具体是两个步骤:a)使用iptables标记(FWMARK)数据包;b)然后根据这个标记匹配不同的策略路由来分发到不同网卡接口。
2)内部其他需要调用淘宝接口的机器把这台路由器设置为网关(或者至少是 到淘宝服务器的下一跳)。这样,对淘宝接口的请求都会发给上述路由器。
具体操作:
1)配置路由器:
路由器需要三块网卡,一块网卡连接内网(LAN),两块网卡连接外网(WAN1 和 WAN2 )。这里假设
LAN IP 为 192.168.10.9 , 接口是eth0
WAN1 223.5.20.22 eth1
WAN2 223.5.20.29 eth2
a) 标记数据包
iptables -A PREROUTING -t mangle -m state --state new -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 0x22
iptables -A PREROUTING -t mangle -m state --state new -m statistic --mode nth --every 2 --packet 1 -j CONNMARK --set-mark 0x29
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
大致解释一下:
i) 第一行的意思是 每两个发起新连接的包中的一个 标记为 22(数字是任意的,这里是为了方便起见,设置为和接口ip相似)。
注意: 发起新连接 这一限制非常重要,因为如果没有这个限制的话会变成:每两个数据包中的一个标记为22,这意味着 同一个连接(会话)的多个数据包的源IP会在多个地址之间来回变动,导致无法与远端服务器正常通信。
ii) 第二行同上,每两个发起新连接的包中的一个 标记为29。
iii) 刚刚说过,只有发起新连接的数据包会被标记,后续的属于同一个连接的数据包也要标记成一样。这就是第三句的作用:它会查看每一个数据包是否属于一个相关的连接,如果是,查看该连接的mark,然后该mark标记这个数据包。
接下来是路由部分:
一般情况下,路由都是根据数据包的目的地址进行匹配分发。但是在这个例子中,需要根据数据包的标记进行匹配,这就需要用到另外一种路由:策略路由。
这里策略路由的最终目的是:把不同标记的包发到不同的网卡接口。
b) 配置策略路由
一般情况下,linux有三个默认路由表 local, main, default。可以使用命令查看:
[[email protected] xxx]# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
每行最前面的数字代表优先级,数字越小,优先级越高。from all代表 来自于任意地址, 也就是说不论数据包的源地址是多少, 都会 lookup (查找) 后面的表。直到找一条匹配的路由,然后路由过程结束。
所以,为了让不同的标记匹配不同的路由,需要创建两个新路由表:
echo 200 link22 >> /etc/iproute2/rt_tables
echo 201 link29 >> /etc/iproute2/rt_tables
注:link22, link29 名字是任意的
为两个路由表各添加一条普通路由:
ip route add default via 223.5.20.22 dev eth1 table link22
ip route add default via 223.5.20.29 dev eth2 table link29
然后,添加两条策略路由:
ip rule add fwmark 0x22 table link22
ip rule add fwmark 0x29 table link29
至此,路由部分就完成了。
注:要使得上述策略路由生效,还有一个重要参数必须设置:reverse path filtering (反向路径过滤)。系统默认设置为1,需要把相关接口的该参数设置为0。
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
c) 源地址转换
我们的这台linux机器是作为内部网络的网关路由器来使用的,所以,还需要在路由器上做一个源地址路由:把数据包中内网机器的IP替换成其出站网卡接口的IP地址。这样才能正确收到响应。
iptables -A POSTROUTING -t nat -o eth1 -j SNAT --to-source 223.5.20.22
iptables -A POSTROUTING -t nat -o eth2 -j SNAT --to-source 223.5.20.29
2) 在内网机器上配置网关
route add -net 0.0.0.0/0 gw 192.168.10.9
注:192.168.10.9 是路由器的内网地址。
以上是关于调用淘宝接口有每IP数量/时间限制-负载均衡解决的主要内容,如果未能解决你的问题,请参考以下文章
IIS 7 - 通过负载均衡器后面的 IP 地址限制应用程序