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