SOCKS-коннектор для TCP-сокетов Python
Выберите коннектор с поддержкой прокси и держите его область действия отдельно от общепроцессной реализации сокетов Python.
Сырой сокет 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 может затронуть посторонние импорты и библиотеки. Если созданием сокетов владеет другая библиотека, используйте её документированную фабрику соединений или опцию прокси; словарь, который она никогда не читает, не изменит это соединение.