1. 程式人生 > >調用淘寶接口有每IP數量/時間限制-負載均衡解決

調用淘寶接口有每IP數量/時間限制-負載均衡解決

net

其實標題不太準確,不過原理是一樣。

這裏要解決的問題是:調用淘寶接口有每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數量/時間限制-負載均衡解決