1*de922be4SDavid Wangvip = "10.10.0.1" 2*de922be4SDavid Wangss = [ 3*de922be4SDavid Wang "172.18.1.3", 4*de922be4SDavid Wang "172.18.1.4", 5*de922be4SDavid Wang "172.18.1.5", 6*de922be4SDavid Wang] 7*de922be4SDavid Wang 8*de922be4SDavid Wangprint "*nat" 9*de922be4SDavid Wang 10*de922be4SDavid Wang# iptables -t nat -A myservice -d 10.10.0.1 -m statistic --mode random --probability 0.3333 -j DNAT --to-destination 172.18.1.3 11*de922be4SDavid Wangx, n = 0, 10000 12*de922be4SDavid Wangdef build_chain(s, e): 13*de922be4SDavid Wang n = e-s+1 14*de922be4SDavid Wang if n<=16: 15*de922be4SDavid Wang pass 16*de922be4SDavid Wang else: 17*de922be4SDavid Wang # split 18*de922be4SDavid Wang m = (s+e)/2 19*de922be4SDavid Wang x = "myservice%d_%d" % (s, m) 20*de922be4SDavid Wang print ":%s - [0:0]" % x 21*de922be4SDavid Wang x = "myservice%d_%d" % (m+1, e) 22*de922be4SDavid Wang print ":%s - [0:0]" % x 23*de922be4SDavid Wang build_chain(s, m) 24*de922be4SDavid Wang build_chain(m+1, e) 25*de922be4SDavid Wang 26*de922be4SDavid Wangdef build(s, e, p): 27*de922be4SDavid Wang n = e-s+1 28*de922be4SDavid Wang if n<=16: 29*de922be4SDavid Wang m = n 30*de922be4SDavid Wang for i in range(s, e): 31*de922be4SDavid Wang pp = 1.0/m 32*de922be4SDavid Wang print "-A %s -d %s -m statistic --mode random --probability %.16f -j DNAT --to-destination %s" % (p, vip, pp, ss[i%len(ss)]) 33*de922be4SDavid Wang m-=1 34*de922be4SDavid Wang print "-A %s -d %s -j DNAT --to-destination %s" % (p, vip, ss[i%len(ss)]) 35*de922be4SDavid Wang else: 36*de922be4SDavid Wang # split 37*de922be4SDavid Wang m = (s+e)/2 38*de922be4SDavid Wang x = "myservice%d_%d" % (s, m) 39*de922be4SDavid Wang pp = (m-s+1)*1.0/n 40*de922be4SDavid Wang print "-A %s -m statistic --mode random --probability %.16f -j %s" % (p, pp, x) 41*de922be4SDavid Wang build(s, m, x) 42*de922be4SDavid Wang x = "myservice%d_%d" % (m+1, e) 43*de922be4SDavid Wang print "-A %s -j %s" % (p, x) 44*de922be4SDavid Wang build(m+1, e, x) 45*de922be4SDavid Wang 46*de922be4SDavid Wangbuild_chain(0, n-1) 47*de922be4SDavid Wangbuild(0, n-1, "myservice") 48*de922be4SDavid Wang 49*de922be4SDavid Wangprint "COMMIT" 50