Выбор исходного адреса IPv6 в Linux

Чтобы получить назначение, полученное из имени хоста, или применить алгоритм выбора адреса назначения (согласно RFC 3484), у нас есть библиотека API getaddrinfo(). Если вы будете искать в сети, вы обнаружите, что тот же API можно использовать для выбора исходного адреса. Но когда я тестировал это практически этого не происходит.

Когда я сделал некоторую домашнюю работу, я обнаружил, что в Linux ядро ​​​​само определяет подходящий исходный адрес в зависимости от адреса назначения, применяя эти правила (согласно RFC 3484). Это делается ядром в методе fib6_rule_action(), это делается при отправке данных (например, в sendto()).

Мой вопрос: есть ли какой-либо библиотечный API или системный вызов, который мог бы сделать это для меня на более раннем этапе, то есть перед отправкой данных.


person rahul09    schedule 07.05.2014    source источник
comment
Чтобы убедиться, что я правильно понял: вы хотите отправить кому-то UDP-пакет и указать исходный адрес?   -  person Jonathon Reinhart    schedule 07.05.2014
comment
Неясно, чего вы на самом деле хотите, но если вы подключите() к сокету, вы получите исходный адрес с помощью getsockname(). (Если в будущем таблица маршрутизации ядра изменится, адрес источника тоже может измениться — по крайней мере, для UDP).   -  person nos    schedule 07.05.2014
comment
да, это то, что я хочу, но поскольку у меня есть несколько адресов ipv6, как мне принять решение, с какого IP-адреса источника я должен отправлять данные. есть ли какой-либо библиотечный API, который фактически дал бы мне отсортированный список исходных IP-адресов в соответствии с IP-адресом назначения.   -  person rahul09    schedule 07.05.2014


Ответы (1)


Вы можете получить эту информацию через сокеты маршрутизации Linux, также известные как rtnetlink. В частности, это RTA_SRC, который вы ищете.

Предупреждаю: сокеты (rt)netlink — не самый простой в использовании протокол, и, кроме исходного кода, не так много актуальной документации. страница википедии для netlink может помочь вам начать работу. Некоторые из внешних ссылок кажутся хорошими, а связанный документ содержит больше ссылок.

Я предлагаю использовать библиотеку, если вы можете ее найти, и ваш код, связанный с netlink, длиннее, чем запрос адреса одного источника. Libnl или libmnl может подойти. У первого также есть хорошая страница о сокетах маршрутизации.

В качестве теста вы можете получить ту же функциональность с помощью команды пользовательского пространства ip -6 route get <dst_addr>, например ip -6 route get 2a00:1450:4010:c04::63.

person thuovila    schedule 07.05.2014
comment
Я не был так ясен, когда упоминал вопрос, я думаю. Если вы увидите мой комментарий к ответу Джонатона-Рейнхарта, вы получите то, что я хочу. Чтобы уточнить немного больше, я хочу, чтобы из нескольких IPv6-адресов IP (у меня есть) система давала мне наиболее предпочтительный адрес в зависимости от адреса назначения, куда я хочу отправить данные. Есть ли какой-то механизм для этого. И под наиболее предпочтительным адресом я подразумевал применение правил, определенных в RFC3484. (Опять же, мне нужен адрес источника, а не адрес назначения, потому что для пункта назначения у нас есть getaddrinfo) - person rahul09; 07.05.2014
comment
Мой ответ указывает способ сделать именно то, что вы просите. Хотя это не API как таковой, а протокол. - person thuovila; 07.05.2014
comment
@thouvila ip — это утилита, но я думаю, что она доходит до уровня маршрута. Я узнал по этой ссылке (linux- hacks.blogspot.in/2008/07/), что выбор исходного адреса появляется после алгоритмов маршрутизации. Это правда или я иду не в том направлении???? - person rahul09; 09.05.2014
comment
ip это только утилита, да. Я поместил команду в ответ, чтобы помочь вам получить представление о том, какую информацию возвращает сокет rtnetlink. Ни в коем случае не рекомендую вызывать ip прямо из вашей программы. Используйте сокеты netlink для получения той же информации. Сообщение на rtnetlink вернет исходный адрес, который был бы выбран в linux FIB, т.е. та же логика, которую описывает ваша ссылка. - person thuovila; 09.05.2014
comment
Я попробовал это с помощью rtnetlink. Теперь я достиг стадии, когда я могу видеть всю таблицу маршрутизации. Но все же, когда я даю адрес назначения в качестве атрибута сообщения netlink, я застреваю. Можете ли вы помочь мне с этим. Также было бы хорошо, если бы мы могли понять, как работает ip route get внутри, тогда это можно будет решить. - person rahul09; 15.05.2014
comment
Вы можете получить ip исходники, выполнив git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git главную страницу проекта по адресу linuxfoundation.org/collaborate. /рабочие группы/сеть/iproute2 - person thuovila; 15.05.2014
comment
@thuovilla Спасибо за помощь. Наконец-то сделал это. Спасибо за помощь - person rahul09; 19.05.2014