proxy / main.py
Starchik1's picture
Create main.py
1bda23f verified
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)
# Анализ запроса (HTTP или HTTPS)
try:
if data.startswith(b'CONNECT'):
# HTTPS CONNECT запрос
target = data.split(b' ')[1].split(b':')[0].decode()
port = int(data.split(b':')[2].split(b' ')[0])
else:
# HTTP запрос
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))
# Для HTTPS отправляем подтверждение
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()