import socket import threading LISTEN_HOST = "127.0.0.1" LISTEN_PORT = 18007 TARGET_HOST = "192.168.41.184" TARGET_PORT = 8007 def pipe(src: socket.socket, dst: socket.socket) -> None: try: while True: data = src.recv(65536) if not data: break dst.sendall(data) except OSError: pass finally: for sock in (src, dst): try: sock.shutdown(socket.SHUT_RDWR) except OSError: pass try: sock.close() except OSError: pass def handle_client(client: socket.socket) -> None: upstream = socket.socket(socket.AF_INET, socket.SOCK_STREAM) upstream.connect((TARGET_HOST, TARGET_PORT)) threading.Thread(target=pipe, args=(client, upstream), daemon=True).start() threading.Thread(target=pipe, args=(upstream, client), daemon=True).start() def main() -> None: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((LISTEN_HOST, LISTEN_PORT)) server.listen() while True: client, _ = server.accept() threading.Thread(target=handle_client, args=(client,), daemon=True).start() if __name__ == "__main__": main()