2016-10-28 4 views
2

Я использую getaddrinfo() для получения IP-адреса, соответствующего серверу с использованием URL-адреса. Он по существу отправляет DNS-запрос на DNS-сервер. Я хочу иметь возможность отправлять этот запрос из определенного исходящего интерфейса. В основном у меня есть несколько интерфейсов, через которые можно отправить запрос DNS. В настоящее время getaddrinfo() не имеет способа определить, какой интерфейс он должен использовать для отправки запроса DNS. Единственная возможность изменить процедуру getaddrinfo()? Кто-нибудь знает о других способах достижения этого?Связывание getaddrinfo с конкретным интерфейсом (исходный IP)

+1

Это, кажется, больше вопроса имени распознавателя и сетевой стек (маршрутизация), чем все, что вы должны иметь дело с вашим программным кодом. Почему это вообще проблема? –

ответ

0

Интерфейс, выбранный для доступа к данному IP-адресу, продиктован таблицами маршрутизации.

Поскольку у вас предположительно есть IP-адрес DNS-сервера, к нему будет доступен любой интерфейс, который таблица маршрутизации говорит для использования для этого IP-адреса, независимо от того, какое приложение отправляет запрос.

Вам нужно будет изменить таблицу маршрутизации, чтобы заставить трафик по определенному интерфейсу. Если только DNS-сервер должен использовать фиксированный интерфейс, вы добавили бы маршрут для этого конкретного IP-адреса в таблицу маршрутизации для требуемого интерфейса.

В Linux вы можете изменить таблицу маршрутизации с помощью инструмента командной строки .

+0

Спасибо dbush. Да, но в моем случае у меня есть маршрут с несколькими путями по нескольким интерфейсам (в основном 2 или более). Я хотел бы отправить dns-запрос из каждого из этих интерфейсов, но вам нужно будет контролировать, какой запрос использует интерфейс A vs interface N. Следовательно, необходимо контролировать, какой исходный интерфейс выбрать при вызове getaddrinfo(). Я проверил аргументы подсказок, но не кажется, что есть опция – caliuser

0

Основная проблема заключается в том, что вы, кажется, ожидаете, что getaddrinfo будет работать только с DNS, а затем для точной настройки особенностей поиска DNS. Однако это не то, что он делает - он будет использовать все средства разрешения имен в системе, что обычно означает, что он выполнит поиск файла hosts и все, что еще настроено в nsswitch.conf, которое обычно является DNS. Для некоторых из этих не-DNS-запросов привязка исходного адреса может не иметь никакого смысла, поэтому она не является частью интерфейса наименьшего общего знаменателя.

Если вы знаете, что для вашей конкретной цели вам никогда не понадобится отклик поиска имени из любого места, кроме DNS, то вместо этого вы можете использовать специфичную для DNS функцию, которая позволит вам делать такой вид штрафа -tuning.

Есть несколько примеров библиотек DNS C перечисленных в gethostbyname dual network interfaces, select which one to use