Esempio n. 1
0
    def check(self):
        timeNumber = struct.unpack("i", self.localProxy.recv(4))[0]

        checkA = self.localProxy.recv(32)
        checkB = hashlib.md5("%s%d" % (DDDProxyConfig.remoteServerAuth, timeNumber)).hexdigest()
        timeRange = 3600
        baseServer.log(1, self.threadid, "check:", checkA, checkB, timeNumber, timeRange, time.time())
        if timeNumber < time.time() - timeRange or timeNumber > time.time() + timeRange or checkA != checkB:
            return False
        return True
Esempio n. 2
0
	def serverToSource(self):
		baseServer.log(1, self.threadid, "-<")
		try:
			for data in DDDProxySocketMessage.recv(self.remoteSocket):
				self.source.send(data)
				self.markActive()
				self.domainAnalysisAddData("outgoing", len(data))
		except:
			pass
		baseServer.log(1, self.threadid, "->")
		self.close()
	def connRemoteProxyServer(self,host,port,auth):
		self.remoteServer = host
		DDDProxyConfig.fetchRemoteCert(host, port)
		
		self.remoteSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self.remoteSocket = ssl.wrap_socket(self.remoteSocket, ca_certs=DDDProxyConfig.SSLLocalCertPath(host,port),
										 cert_reqs=ssl.CERT_REQUIRED)		
		self.remoteSocket.connect((host,port))
		randomNum = math.floor(time.time())
		self.remoteSocket.send(struct.pack("i", randomNum))
		checkA = hashlib.md5("%s%d" % (auth, randomNum)).hexdigest()
		self.remoteSocket.send(checkA)
		baseServer.log(1, self.threadid, checkA, randomNum)
	def serverToSource(self):
		threading.currentThread().name = "worker%s-%s-recv"%(self.threadid,self.addr)
		baseServer.log(1, self.threadid, "-<")
		try:
			count = 0
			for data in DDDProxySocketMessage.recv(self.remoteSocket):
				self.source.send(data)
				self.markActive()
				length = len(data)
				self.dataCountRecv += length
				count += length
				if self.domainAnalysisAddData("outgoing", count):
					count = 0
		except:
			pass
		threading.currentThread().name = "worker%s-IDLE-recv"%(self.threadid)
		baseServer.log(1, self.threadid, "->")
		self.close()
Esempio n. 5
0
	def run(self):
		if not self.AgreeConnIp(self.addr):
			baseServer.log(2, self.threadid, "not agree ip %s connect!" % (self.addr))
			return;

		baseServer.log(1, self.threadid, "..... threadid start")
		self.connRemoteProxyServer()
		DDDProxySocketMessage.sendOne(self.remoteSocket, "[%d]" % (self.threadid))
		baseServer.log(1, self.threadid, "threadid mark")
		thread.start_new_thread(self.sourceToServer, tuple())
		threading.currentThread().name = "%d-%s-recv"%(self.threadid,self.addr)
		self.serverToSource()
		baseServer.log(1, self.threadid, "!!!!! threadid end")
	def run(self):
		if not self.AgreeConnIp(self.addr):
			baseServer.log(2, self.threadid, "not agree ip %s connect!" % (self.addr))
			return;

		baseServer.log(1, self.threadid, "..... threadid start")
		host,port,auth = setting[settingConfig.remoteServerKey]
		self.connRemoteProxyServer(host,port,auth)
		mark = "[%s,%s]" % (self.addr,self.threadid)
		DDDProxySocketMessage.sendOne(self.remoteSocket,mark )
		baseServer.log(1, self.threadid, "threadid mark")
		
		mainThreadPool.callInThread(self.sourceToServer)
# 		thread.start_new_thread(self.sourceToServer, tuple())
		
		self.serverToSource()
		baseServer.log(1, self.threadid, "!!!!! threadid end")
Esempio n. 7
0
    def run(self):
        try:
            if self.check():
                self.localProxyMark = DDDProxySocketMessage.recvOne(self.localProxy)
                baseServer.log(1, self.threadid, "self.localProxyMark", self.localProxyMark)

                thread.start_new_thread(self.sourceToServer, tuple())
                self.serverToSource()
        except:
            baseServer.log(3)
        self.close()

        baseServer.log(1, self.threadid, "!!!!! threadid end")
Esempio n. 8
0
def AutoGFWListThread():
	retryTime = 1
	while True:
		fecthUrl = None
		for i in gfwListFetchUrl:
			if fecthUrl is None or i[1] < fecthUrl[1] :
				fecthUrl = i
		hostList = []
		try:
			baseServer.log(2,"fetch gfw list from: %s"%(fecthUrl[0]))
			hostList = getGFWHost(fecthUrl[0])
		except:
			baseServer.log(3,"fetch gfw list error,retry in next %ds"%(retryTime))
			time.sleep(retryTime)
			retryTime += 2
			fecthUrl[1]+=1
			continue
		retryTime = 1
		baseServer.log(2,"fetch gfw list %d hosts"%(len(hostList)))
		for host in hostList:
			domainConfig.config.addDomain(host,formGwflist=True)
		domainConfig.config.save()
		time.sleep(3600*24)
	def sourceToServer(self):
		baseServer.log(1, self.threadid, "}}}}", "<")
		threading.currentThread().name = "worker%s-%s-send"%(self.threadid,self.addr)
		try:
			socetParser = socetMessageParser()
			count = 0
			while self.source != None:
				tmp = self.source.recv(DDDProxyConfig.cacheSize)
				if not tmp:
					break
				baseServer.log(1, "}}}}", tmp)
				length = len(tmp)
				self.dataCountSend += length;
				count += length;
				DDDProxySocketMessage.send(self.remoteSocket, tmp)
				
				#以下数据是为了时统计用
				if socetParser is not None:
					socetParser.putMessage(tmp)
					if socetParser.messageStatus():
						self.httpMessage = socetParser.httpMessage()
						host, port = hostParser.parserUrlAddrPort(self.httpMessage[1] if self.httpMessage[0] != "CONNECT" else "https://" + self.httpMessage[1])
						threading.currentThread().name = "worker%s-%s-%s:%d-send"%(self.threadid,self.addr,host,port)
						self.hostPort = (host, port)
						
						
						#代理host黑名单
						ipAddr = re.match("(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})", host)
						foundIp = False
						if ipAddr:
							ipAddr = ipAddr.groups()
							mathIp = "%s.%s.%s" % (ipAddr[0], ipAddr[1], ipAddr[2]);
							for i in self.blockHost:
								if i.startswith(mathIp):
									foundIp = True
									break
						if foundIp or host in self.blockHost:
							baseServer.log(2, self.threadid, "block", host)
							break
						
						baseServer.log(2, self.addr, self.httpMessage)
						self.domainAnalysisAddData("connect", 1)
						socetParser = None
		
				if self.domainAnalysisAddData("incoming", count):
					count = 0
				self.markActive()
		except socket.timeout:
			pass
		except:
			baseServer.log(3, self.threadid, "}}}} error!")
# 		sendPack.end(self.remoteSocket)
		threading.currentThread().name = "worker%s-IDLE-send"%(self.threadid)
		baseServer.log(1, self.threadid, "}}}}", ">")
		self.close()
Esempio n. 10
0
	def finish(self, chunk=None):
		BaseHandler.finish(self, chunk=chunk)
		baseServer.log(2,self.request.remote_ip, (self.request.method,self.request.host,self.request.uri,
				self.request.headers["User-Agent"] if "User-Agent" in self.request.headers else ""),
					(self._status_code,self._headers))
Esempio n. 11
0
	(r"/pac", pacHandler),
	(r"/", helpHandler),
	(r"/admin/get_real_ip_p.php", testPac),
	(r"/admin", adminHandler),
	(r"/status", statusPage),
	(r"/static/(.+)", tornado.web.StaticFileHandler, {"path": "./static"}),
], **settings)

if __name__ == '__main__':
	remoteServerIp = None if len(sys.argv) < 2 else sys.argv[1];
	DDDProxyConfig.remoteServerAuth = None if len(sys.argv) < 3 else sys.argv[2];
	if not remoteServerIp or not DDDProxyConfig.remoteServerAuth:
		exit("please use \"python localServer.py [remoteServerHost] [passWord]\"")
	
	if remoteServerIp:
		if remoteServerIp.find(':') > 0:
			DDDProxyConfig.remoteServerHost,DDDProxyConfig.remoteServerListenPort = remoteServerIp.split(':')
		else:
			DDDProxyConfig.remoteServerHost = remoteServerIp
	try:
		localProxyServer = baseServer(DDDProxyConfig.localServerListenIp, DDDProxyConfig.localServerProxyListenPort, proxyServerHandler)
		localProxyServer.start(True)
	except:
		logging.error(sys.exc_info())
	
	domainConfig.domainAnalysis.startAnalysis()
	autoProxy.AutoFetchGFWList()
	baseServer.log(2,"pac server start on %s:%d!" % (DDDProxyConfig.localServerListenIp, DDDProxyConfig.localServerAdminListenPort));
	application.listen(DDDProxyConfig.localServerAdminListenPort, DDDProxyConfig.localServerListenIp)
	tornado.ioloop.IOLoop.instance().start()
Esempio n. 12
0
    def sourceToServer(self):
        try:
            # 接收消息头
            socetParser = socetMessageParser()
            hasData = False
            for data in DDDProxySocketMessage.recv(self.localProxy):
                baseServer.log(1, self.threadid, ">>>>>", data, len(data))
                socetParser.putMessage(data)
                if socetParser.messageStatus():
                    self.httpMessage = socetParser.httpMessage()
                    hasData = True
                    break
                self.markActive("recv header")

            if not hasData:
                return False

                # 连接原始服务器
            self.method, path, protocol = self.httpMessage
            if self.method:
                baseServer.log(2, "httpMessage", self.threadid, self.method, path, protocol)
            if self.method == "CONNECT":
                self.httpData = False
                self.openOrignConn("https://" + path)
                baseServer.log(1, self.threadid, "CONNECT ", path)
                DDDProxySocketMessage.send(self.localProxy, "HTTP/1.1 200 OK\r\n\r\n")
            else:
                self.httpData = True
                baseServer.log(1, self.threadid, ">>>>>", "openOrignConn")
                self.openOrignConn(path)
                baseServer.log(1, self.threadid, ">>>>>", socetParser.messageData())
                self.orignConn.send(socetParser.messageData())

            self.lock.put("ok")

            # 转发原始请求到原始服务器
            for data in DDDProxySocketMessage.recv(self.localProxy):
                self.orignConn.send(data)
                self.markActive("localProxy recv")

            self.close()
            return True
        except TypeError:
            pass
        except:
            baseServer.log(3, self.threadid, "sourceToServer error!!!")
        self.lock.put("error")
        self.close()
        return False
Esempio n. 13
0
 def serverToSource(self):
     error = False
     baseServer.log(1, self.threadid, "----", "<")
     if self.lock.get() == "ok":
         try:
             count = 0
             while True:
                 if self.orignConn is None:
                     break
                 baseServer.log(1, self.threadid, "orignConn", "recv")
                 tmp = self.orignConn.recv(DDDProxyConfig.cacheSize)
                 if not tmp:
                     break
                 count += len(tmp)
                 baseServer.log(1, self.threadid, "localProxy", "send", tmp)
                 DDDProxySocketMessage.send(self.localProxy, tmp)
                 baseServer.log(1, self.threadid, "localProxy", "send", "end")
                 self.markActive("orignConn recv")
         except socket.timeout:
             pass
         except:
             baseServer.log(3, self.threadid, "serverToSource error!!!")
             error = True
     baseServer.log(1, self.threadid, "----", ">")
     return not error