PycURL отправляет трафик DNS через определенный интерфейс - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть несколько интерфейсов на коробке, и я хочу форсировать трафик через определенный интерфейс, используя python.

Этот поток отвечает, как это сделать для трафика HTTP.Но когда я смотрю на tcpdump, DNS-запросы не учитывают настройки интерфейса.libcurl предоставляет опции для форсирования DNS-трафика через определенный интерфейс, используя опции CURLOPT_DNS_INTERFACE и CURLOPT_DNS_LOCAL_IP4

Я пытался использовать то же самое через C, и кажется, что он соблюдает интерфейс, когда libcurlпостроен с поддержкой c-ares.

Но при использовании тех же опций в версии pycurl возникают следующие ошибки:

AttributeError: DNS_INTERFACE
AttributeError: DNS_LOCAL_IP4

Я пытаюсь использовать патч обезьяны, предложенный в этом потоке .Но, основываясь на комментариях, другие люди уже сообщили, что это не работает.Спасибо.

[править] Протестировав вышеупомянутое исправление обезьян с помощью bind, tcpdump по-прежнему показывает трафик через другой интерфейс.Исправлено форматирование.

1 Ответ

0 голосов
/ 12 февраля 2019

Ошибка AttributeError происходит, поскольку PycURL поддерживает только параметры curl, перечисленные в src / module.c .Можно добавить поддержку CURLOPT_DNS_INTERFACE, отразив, как она поддерживает CURLOPT_INTERFACE - добавив

    insint_c(d, "DNS_INTERFACE", CURLOPT_DNS_INTERFACE);

и

    case CURLOPT_DNS_INTERFACE:

в src / module.c и src / easyopt.c после строко CURLOPT_INTERFACE, я мог бы создать версию, которая поддерживает DNS_INTERFACE.Я использовал python setup.py install для сборки (см. документы ), столкнулся с двумя ошибками, которые были решены с помощью этих ответа и make src/docstrings.c (см. GitHub ).

Вот пример из документов с добавленным DNS_INTERFACE:

import pycurl
from StringIO import StringIO

buffer = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.DNS_INTERFACE, "enp9s0")
c.perform()
c.close()

body = buffer.getvalue()
print(body)

В настоящее время он дает мне pycurl.error: (4, '') на c.setopt(c.DNS_INTERFACE, "enp9s0"), но эта ошибка будет вероятно для вас не произойдет, так как вы создали libcurl с поддержкой c-ares.

...