diff --git a/client/main.py b/client/main.py index 5ebfeee..cba3dde 100644 --- a/client/main.py +++ b/client/main.py @@ -23,21 +23,20 @@ def generate_key(): # Convert keys to bytes private_key_bytes = private_key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=serialization.NoEncryption() + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.NoEncryption() ) public_key_bytes = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) - - # Encode bytes as base64 + + # Encode bytes as base64 private_key_base64 = base64.b64encode(private_key_bytes).decode('utf-8') public_key_base64 = base64.b64encode(public_key_bytes).decode('utf-8') - - return private_key_base64,public_key_base64 + return private_key_base64, public_key_base64 # # Encrypt a message using the public key @@ -64,4 +63,4 @@ def generate_key(): if __name__ == '__main__': print("Welcome to my xiaomiao tor network") domain = generate_domain() - private_key_base64,public_key_base64 = generate_key() + private_key_base64, public_key_base64 = generate_key() diff --git a/node/main.py b/node/main.py index e69de29..31e56f0 100644 --- a/node/main.py +++ b/node/main.py @@ -0,0 +1,2 @@ +import yaml + diff --git a/node/proxy.py b/node/proxy.py new file mode 100644 index 0000000..a7e2b90 --- /dev/null +++ b/node/proxy.py @@ -0,0 +1,55 @@ +import socket +import socketserver +import struct +import select + +class ThreadingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): + pass + +class Socks5Handler(socketserver.BaseRequestHandler): + VERSION = 5 + + def handle(self): + # 客户端发送版本和方法 + version, nmethods = struct.unpack('!BB', self.request.recv(2)) + self.request.recv(nmethods) + + # 发送版本和方法响应 + self.request.sendall(struct.pack('!BB', self.VERSION, 0)) + + # 获取请求详情 + version, cmd, _, address_type = struct.unpack('!BBBB', self.request.recv(4)) + if address_type == 1: # IPv4 + address = socket.inet_ntoa(self.request.recv(4)) + else: + raise NotImplementedError('Only IPv4 is supported.') + port = struct.unpack('!H', self.request.recv(2))[0] + + # 发送响应 + self.request.sendall(struct.pack('!BBBBIH', self.VERSION, 0, 0, 1, + int(socket.inet_aton('0.0.0.0').hex(), 16), 0)) + + # 建立连接 + if cmd == 1: # CONNECT + remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + remote.connect((address, port)) + self.exchange_loop(self.request, remote) + else: + raise NotImplementedError('Only CONNECT is supported.') + + def exchange_loop(self, client, remote): + while True: + # Simple data exchange between client and remote + rlist, _, _ = select.select([client, remote], [], []) + if client in rlist: + data = client.recv(4096) + if remote.send(data) <= 0: + break + if remote in rlist: + data = remote.recv(4096) + if client.send(data) <= 0: + break + +if __name__ == '__main__': + with ThreadingTCPServer(('0.0.0.0', 1080), Socks5Handler) as server: + server.serve_forever() diff --git a/server/main.py b/server/main.py index 2071250..cb84afe 100644 --- a/server/main.py +++ b/server/main.py @@ -11,5 +11,5 @@ if __name__ == '__main__': API_port = config['API']['port'] API_listen_host = config['API']['listen_host'] - DNSServer = xiaomiandns.DNSServer(listen_host, DNS_port, db_file) + DNSServer = xiaomiandns.DNSServer(DNS_listen_host, DNS_port, db_file) DNSServer.run()