Задать вопрос
@Dark_bear

Как пробросить локальный порт через SOCKS5 с логином/паролем для Selenium?

Мне нужно настроить локальный прокси-порт (например, localhost:12345), через который будет идти трафик в браузере Selenium. То есть, при обращении к 127.0.0.1:12345 трафик должен перенаправляться через внешний SOCKS5-прокси с логином и паролем.

Задача:

Прокси: socks5://user:pass@proxy_ip:proxy_port

Локальный порт: 127.0.0.1:12345

Чтобы Selenium подключался к этому локальному адресу, а трафик шёл через внешний SOCKS5.

Вопросы:
  1. Какое ПО можно использовать для такой задачи?
  2. Как настроить перенаправление трафика через SOCKS5 с авторизацией? Только при обращении на порт.

Что пробовал:

Использовал redsocks. Ввел такие команды:
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

sudo iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS


Перестал работать вай фай)
  • Вопрос задан
  • 153 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@Dark_bear Автор вопроса
import socket
import threading
import socks


def handle_connect(client_socket, target_host, target_port, proxy_config):
    try:
        remote_socket = socks.socksocket()
        remote_socket.set_proxy(
            socks.SOCKS5,
            proxy_config['host'],
            proxy_config['port'],
            True,
            proxy_config['user'],
            proxy_config['pass']
        )
        remote_socket.connect((target_host, target_port))
        client_socket.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")

        threading.Thread(target=pipe, args=(client_socket, remote_socket)).start()
        threading.Thread(target=pipe, args=(remote_socket, client_socket)).start()
    except Exception as e:
        print(f"[!] Ошибка подключения к SOCKS5: {e}")
        client_socket.close()


def pipe(source, dest):
    try:
        while True:
            data = source.recv(4096)
            if not data:
                break
            dest.sendall(data)
    except:
        pass
    finally:
        source.close()
        dest.close()


def parse_host_port(request_line):
    try:
        parts = request_line.split()
        if len(parts) >= 2:
            host_port = parts[1]
            host, port = host_port.split(':')
            return host, int(port)
    except Exception as e:
        print(f"[!] Ошибка разбора хоста: {e}")
    return None, None


def handle_client(client_socket, proxy_config):
    try:
        request = client_socket.recv(4096)
        if not request:
            client_socket.close()
            return

        request_line = request.decode(errors='ignore').split('\r\n')[0]
        method = request_line.split(' ')[0]

        if method == 'CONNECT':
            target_host, target_port = parse_host_port(request_line)
            if target_host and target_port:
                print(f"[>] CONNECT {target_host}:{target_port}")
                handle_connect(client_socket, target_host, target_port, proxy_config)
            else:
                print("[!] Не удалось разобрать хост и порт.")
                client_socket.close()

        elif method in ['GET', 'POST', 'HEAD', 'PUT', 'DELETE', 'OPTIONS']:
            headers = request.decode(errors='ignore').split('\r\n')
            host_line = next((h for h in headers if h.lower().startswith('host:')), None)
            if host_line:
                host = host_line.split(':', 1)[1].strip()
                if ':' in host:
                    target_host, target_port = host.split(':')
                    target_port = int(target_port)
                else:
                    target_host = host
                    target_port = 80

                print(f"[>] {method} {target_host}:{target_port}")

                remote_socket = socks.socksocket()
                remote_socket.set_proxy(
                    socks.SOCKS5,
                    proxy_config['host'],
                    proxy_config['port'],
                    True,
                    proxy_config['user'],
                    proxy_config['pass']
                )
                remote_socket.connect((target_host, target_port))
                remote_socket.sendall(request)

                while True:
                    data = remote_socket.recv(4096)
                    if not data:
                        break
                    client_socket.sendall(data)

                remote_socket.close()
                client_socket.close()
            else:
                print("[!] Host-заголовок не найден.")
                client_socket.close()
        else:
            print(f"[!] Метод {method} не поддерживается.")
            client_socket.sendall(b"HTTP/1.1 405 Method Not Allowed\r\n\r\n")
            client_socket.close()

    except Exception as e:
        print(f"[!] Ошибка клиента: {e}")
        client_socket.close()


def start_proxy_with_config(SOCKS5_HOST, SOCKS5_PORT, SOCKS5_USER, SOCKS5_PASS, LISTEN_PORT):
    LISTEN_HOST = '127.0.0.1'  # фиксировано

    proxy_config = {
        'host': SOCKS5_HOST,
        'port': SOCKS5_PORT,
        'user': SOCKS5_USER,
        'pass': SOCKS5_PASS,
    }

    print(f"[*] Прокси-сервер запущен на http://{LISTEN_HOST}:{LISTEN_PORT}")
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((LISTEN_HOST, LISTEN_PORT))
    server.listen(100)

    try:
        while True:
            client_sock, addr = server.accept()
            threading.Thread(target=handle_client, args=(client_sock, proxy_config)).start()
    except KeyboardInterrupt:
        print("[*] Завершение работы...")
    finally:
        server.close()

start_proxy_with_config(SOCKS5_HOST='ИП',
                        SOCKS5_PORT=ПОРТ,
                        SOCKS5_USER='ПОЛЬЗОВАТЕЛЬ ПРОКСИ',
                        SOCKS5_PASS= 'ПАРОЛЬ ПРОКСИ',
                        LISTEN_PORT= 6577 (Порт на котором развернуты прокси) 
                        )


Всем спасибо решение нашел с помощью питона
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы