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
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()
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")
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")
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()
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))
(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()
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
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