| import socket |
| import threading |
| import select |
| import sys |
|
|
| |
| PROXY_HOST = '0.0.0.0' |
| PROXY_PORT = 8888 |
| BUFFER_SIZE = 4096 |
|
|
| def handle_client(client_socket): |
| |
| data = client_socket.recv(BUFFER_SIZE) |
| |
| |
| try: |
| if data.startswith(b'CONNECT'): |
| |
| target = data.split(b' ')[1].split(b':')[0].decode() |
| port = int(data.split(b':')[2].split(b' ')[0]) |
| else: |
| |
| target = data.split(b'Host: ')[1].split(b'\r\n')[0].decode() |
| port = 80 |
| except Exception: |
| client_socket.close() |
| return |
|
|
| |
| try: |
| remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| remote_socket.connect((target, port)) |
| |
| |
| if data.startswith(b'CONNECT'): |
| client_socket.send(b'HTTP/1.1 200 Connection Established\r\n\r\n') |
| else: |
| remote_socket.send(data) |
| except Exception as e: |
| client_socket.close() |
| return |
|
|
| |
| sockets = [client_socket, remote_socket] |
| while True: |
| try: |
| read_sockets, _, _ = select.select(sockets, [], []) |
| for sock in read_sockets: |
| data = sock.recv(BUFFER_SIZE) |
| if not data: |
| break |
| if sock is client_socket: |
| remote_socket.send(data) |
| else: |
| client_socket.send(data) |
| except Exception: |
| break |
| |
| client_socket.close() |
| remote_socket.close() |
|
|
| def start_proxy(): |
| proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| proxy_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| proxy_socket.bind((PROXY_HOST, PROXY_PORT)) |
| proxy_socket.listen(50) |
| |
| print(f"[*] Прокси запущен на {PROXY_HOST}:{PROXY_PORT}") |
| |
| while True: |
| client_socket, addr = proxy_socket.accept() |
| print(f"[>] Подключено: {addr[0]}:{addr[1]}") |
| proxy_thread = threading.Thread( |
| target=handle_client, |
| args=(client_socket,) |
| ) |
| proxy_thread.daemon = True |
| proxy_thread.start() |
|
|
| if __name__ == "__main__": |
| start_proxy() |