Подтвердить что ты не робот

DNS через прокси?

В последние несколько дней я вытягивал свои волосы, оглядываясь вокруг, чтобы найти хорошее решение для предотвращения утечки DNS через прокси-сервер socks4/5.

Я просмотрел модуль SocksiPy (-branch) и попытался обернуть несколько вещей (urllib, urllib2, dnstools), но все они все еще испытывают утечку DNS-запросов. Так же pyCurl.

Я знаю, что proxychains/proxyresolv может передавать DNS-запросы через прокси-сервер socks4/5, и он делает все возможное с некоторыми библиотеками LD_PRELOAD для функций сокета-патча monkey-patch, как и SocksiPy, но я не могу показаться почему он не отправляет DNS через прокси-сервер socks4 или socks5.

Я полагаю, что для linux я могу использовать CTypes с libproxychains.so для выполнения моего разрешения, но я ищу что-то многоплатформенное, поэтому я думаю, что обезьяна-исправление модуля сокета - это путь.

Кто-нибудь придумал хороший способ обойти это? Я хочу сделать все это в коде для удобства переносимости, и я не хочу прибегать к запуску другого прокси-сервера!

Спасибо!

4b9b3361

Ответ 1

Хорошо, я понял это. Вам нужно установить свой прокси-сервер по умолчанию, прежде чем вы начнете использовать сокет (например, перед тем, как импортировать все, что его использует). Вам также нужно обезвредить часть getaddrinfo сокета, тогда все будет хорошо.

import socks
import socket

# Can be socks4/5
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,'127.0.0.1', 9050)
socket.socket = socks.socksocket

# Magic!
def getaddrinfo(*args):
    return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]
socket.getaddrinfo = getaddrinfo

import urllib

Это работает и проксирует все запросы DNS через любой модуль, который вы импортируете вместо urllib. Надеюсь, это поможет кому-то там!

EDIT: вы можете найти обновленный код и прочее на моем блоге