Сырой сокет Python не согласует прокси только потому, что существует http_proxy. Для приложения, говорящего на собственном протоколе TCP, используйте коннектор, который понимает сервис на стороне прокси.

Если PySocks уже доступен, создайте соединение явно:

import socks

with socks.socksocket() as connection:
    connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
    connection.settimeout(10)
    connection.connect(('example.com', 12345))
    # Exchange the destination protocol here.

Замените документационный адрес и порт назначения. Для разрешённого публичного назначения выбирайте кандидата из списка SOCKS5-прокси, только убедившись, что он разрешает целевой порт приложения. Проверьте установленный пакет, поддерживаемые методы и требования к эндпоинту по интерфейсу PySocks.

Остальная часть приложения обменивается своим протоколом через это установленное соединение. Если этот протокол использует TLS, запускайте его после согласования с прокси и проверяйте реальное имя хоста назначения. Аутентификация на прокси устанавливает маршрут; она не даёт вход в пункт назначения или шифрование.

Слушателю SOCKS требуется согласование SOCKS. HTTP-сервису нужен коннектор с поддержкой CONNECT для произвольного TCP-назначения, и он может запретить свой порт. Выбирайте коннектор по фактически предлагаемому сервису, а не меняйте адрес, оставляя неверное рукопожатие.

Держите замену локальной. Назначение класса socket.socket может затронуть посторонние импорты и библиотеки. Если созданием сокетов владеет другая библиотека, используйте её документированную фабрику соединений или опцию прокси; словарь, который она никогда не читает, не изменит это соединение.

Похожие статьи