Scroll to navigation

RTNETLINK(7) Руководство программиста Linux RTNETLINK(7)

ИМЯ

rtnetlink - сокет маршрутизации IPv4 в Linux

СИНТАКСИС

#include <asm/types.h>
#include <linux/if_link.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>

rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);

ОПИСАНИЕ

Rtnetlink позволяет читать и изменять таблицы маршрутизации ядра. Он используется для взаимодействия различных подсистем внутри ядра (это здесь не описано), а также для взаимодействия пользовательских программ. Сетевыми маршрутами, IP-адресами, параметрами связи (link parameters), настройками соседства (neighbor setups), алгоритмами планирования очереди (queueing disciplines), классификацией трафика и и пакетными классификаторами можно управлять через сокеты NETLINK_ROUTE. Они основываются на сообщениях netlink; подробности смотрите в netlink(7).

Атрибуты маршрутизации

Некоторые сообщения rtnetlink содержат необязательные атрибуты после начального заголовка:


struct rtattr {

unsigned short rta_len; /* длина параметра */
unsigned short rta_type; /* тип параметра */
/* данные … */ };

Этими атрибутами нужно управлять только с помощью макросов RTA_* или libnetlink, смотрите rtnetlink(3).

Сообщения

Rtnetlink поддерживает следующие типы сообщений (в дополнении к стандартным сообщениям netlink):

Создание, удаление и получение информации об определённом сетевом интерфейсе. Эти сообщения содержат структуру ifinfomsg, за которой следует ряд структур rtattr.
struct ifinfomsg {

unsigned char ifi_family; /* AF_UNSPEC */
unsigned short ifi_type; /* тип устройства */
int ifi_index; /* индекс интерфейса */
unsigned int ifi_flags; /* флаги устройства */
unsigned int ifi_change; /* маска изменения */ };
В ifi_flags содержатся флаги устройства, смотрите netdevice(7); в ifi_index — уникальный индекс интерфейса (начиная с Linux 3.7 возможно передать ненулевое значение в сообщении RTM_NEWLINK; в этом случае создаётся связь (link) с заданным ifindex); элемент ifi_change зарезервирован на будущее и его значение всегда должно быть равно 0xFFFFFFFF.
Атрибуты маршрутизации
rta_type тип значения описание
IFLA_UNSPEC - не определено
IFLA_ADDRESS аппаратный адрес адрес интерфейса L2
IFLA_BROADCAST аппаратный адрес широковещательный адрес L2
IFLA_IFNAME строка asciiz имя устройства
IFLA_MTU unsigned int MTU устройства
IFLA_LINK int тип связи
IFLA_QDISC строка asciiz алгоритм очереди
IFLA_STATS смотрите ниже статистика интерфейса
Тип значения для IFLA_STATSstruct rtnl_link_stats (в Linux 2.4 и старее — struct net_device_stats).
Добавление, удаление или получение информации об IP-адресе, назначенном интерфейсу. В Linux 2.2 интерфейс может иметь несколько IP-адресов; эта концепция пришла на смену псевдонимам устройства, использовавшимся в версии 2.0. В Linux 2.2 эти сообщения поддерживают адреса IPv4 и IPv6. В них содержится структура ifaddrmsg, которая может быть указана после атрибутов маршрутизации rtattr.
struct ifaddrmsg {

unsigned char ifa_family; /* тип адреса */
unsigned char ifa_prefixlen; /* длина префикса адреса */
unsigned char ifa_flags; /* флаги адреса */
unsigned char ifa_scope; /* область адреса */
unsigned int ifa_index; /* индекс интерфейса */ };
Поле ifa_family представляет тип адресного семейства (AF_INET или AF_INET6), ifa_prefixlen — длину адресной маски адреса, если это применимо для семейства (в IPv4), ifa_scope — область адреса, ifa_index — индекс интерфейса, которому назначен адрес. Поле ifa_flags — слово флагов: IFA_F_SECONDARY — вторичный адрес (старый псевдоним интерфейса), IFA_F_PERMANENT — постоянный адрес, назначенный пользователем и другие недокументированные флаги.
Атрибуты
rta_type тип значения описание
IFA_UNSPEC - не определено
IFA_ADDRESS адрес неструктурированного протокола адрес интерфейса
IFA_LOCAL адрес неструктурированного протокола локальный адрес
IFA_LABEL строка asciiz название интерфейса
IFA_BROADCAST адрес неструктурированного протокола широковещательный адрес
IFA_ANYCAST адрес неструктурированного протокола адрес anycast
IFA_CACHEINFO struct ifa_cacheinfo информация об адресе
Создание, удаление или получение информации о сетевом маршруте. Эти сообщения содержат структуру rtmsg с необязательными дополнительными структурами rtattr. Для RTM_GETROUTE, если rtm_dst_len и rtm_src_len задать значение 0, то вы получите все записи определённой таблицы маршрутизации. В других полях, кроме rtm_table и rtm_protocol, 0 считается шаблоном (wildcard).
struct rtmsg {

unsigned char rtm_family; /* Address family of route */
unsigned char rtm_dst_len; /* Length of destination */
unsigned char rtm_src_len; /* Length of source */
unsigned char rtm_tos; /* TOS filter */
unsigned char rtm_table; /* Routing table ID;
see RTA_TABLE below */
unsigned char rtm_protocol; /* Routing protocol; see below */
unsigned char rtm_scope; /* See below */
unsigned char rtm_type; /* See below */
unsigned int rtm_flags; };
rtm_type Тип маршрута
RTN_UNSPEC неизвестный маршрут
RTN_UNICAST шлюз или прямой маршрут
RTN_LOCAL маршрут локального интерфейса
RTN_BROADCAST локальный широковещательный маршрут (широковещательная отправка)
RTN_ANYCAST локальный широковещательный маршрут (однонаправленная отправка)
RTN_MULTICAST многоадресный маршрут
RTN_BLACKHOLE маршрут для отброса пакетов
RTN_UNREACHABLE недостижимый пункт назначения
RTN_PROHIBIT маршрут для отклонения пакетов
RTN_THROW продолжение поиска маршрута в другой таблице
RTN_NAT правило трансляции сетевого адреса
RTN_XRESOLVE ссылка на внешний определитель (не реализовано)
Происхождение маршрута
RTPROT_UNSPEC неизвестно
RTPROT_REDIRECT из-за перенаправления полученном по ICMP (не используется)
RTPROT_KERNEL посылается ядром
RTPROT_BOOT при загрузке машины
RTPROT_STATIC указан администратором

Значения больше RTPROT_STATIC не учитываются ядром, они предназначены только для пользовательской информации. Они могут использоваться для пометки источника информации о маршрутизации или для отличения различных служб маршрутизации друг от друга. Уже назначенные идентификаторы для служб маршрутизации можно найти в <linux/rtnetlink.h>.

rtm_scope — расстояние до назначения:
RT_SCOPE_UNIVERSE глобальный маршрут
RT_SCOPE_SITE внутренний маршрут в локальной автономной системе
RT_SCOPE_LINK маршрут на эту связь
RT_SCOPE_HOST маршрут на локальный узел
RT_SCOPE_NOWHERE назначение не существует

Значения от RT_SCOPE_UNIVERSE и до RT_SCOPE_SITE доступны пользователю.

Поле rtm_flags может иметь следующие значения:
RTM_F_NOTIFY если маршрут изменился — уведомить пользователя через rtnetlink
RTM_F_CLONED маршрут склонирован из другого маршрута
RTM_F_EQUALIZE многопутевой уравниватель (не реализовано)

В rtm_table задаётся таблица маршрутизации:

RT_TABLE_UNSPEC таблица маршрутизации не задана
RT_TABLE_DEFAULT таблица по умолчанию
RT_TABLE_MAIN главная таблица
RT_TABLE_LOCAL локальная таблица

Пользователь может назначать произвольные значения от RT_TABLE_UNSPEC и до RT_TABLE_DEFAULT.

Атрибуты
rta_type тип значения описание
RTA_UNSPEC - игнорируется
RTA_DST адрес протокола адрес маршрута назначения
RTA_SRC адрес протокола адрес маршрута источника
RTA_IIF int индекс входного интерфейса
RTA_OIF int индекс выходного интерфейса
RTA_GATEWAY адрес протокола шлюз маршрута
RTA_PRIORITY int приоритет маршрута
RTA_PREFSRC адрес протокола Preferred source address
RTA_METRICS int метрика маршрута
RTA_MULTIPATH Multipath nexthop data br (see below).
RTA_PROTOINFO No longer used
RTA_FLOW int Route realm
RTA_CACHEINFO struct rta_cacheinfo (see linux/rtnetlink.h)
RTA_SESSION No longer used
RTA_MP_ALGO No longer used
RTA_TABLE int Routing table ID; if set, rtm_table is ignored
RTA_MARK int
RTA_MFC_STATS struct rta_mfc_stats (see linux/rtnetlink.h)
RTA_VIA struct rtvia Gateway in different AF (see below)
RTA_NEWDST адрес протокола Change packet destination address
RTA_PREF char RFC4191 IPv6 router preference (see below)
RTA_ENCAP_TYPE short Encapsulation type for lwtunnels (see below)
RTA_ENCAP Defined by RTA_ENCAP_TYPE
RTA_EXPIRES int Expire time for IPv6 routes (in seconds)
RTA_MULTIPATH contains several packed instances of struct rtnexthop together with nested RTAs (RTA_GATEWAY):

struct rtnexthop {

unsigned short rtnh_len; /* Length of struct + length
of RTAs */
unsigned char rtnh_flags; /* Flags (see
linux/rtnetlink.h) */
unsigned char rtnh_hops; /* Nexthop priority */
int rtnh_ifindex; /* Interface index for this
nexthop */ }

There exist a bunch of RTNH_* macros similar to RTA_* and NLHDR_* macros useful to handle these structures.

struct rtvia {

unsigned short rtvia_family;
unsigned char rtvia_addr[0]; };

rtvia_addr is the address, rtvia_family is its family type.
RTA_PREF may contain values ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM, and ICMPV6_ROUTER_PREF_HIGH defined incw <linux/icmpv6.h>.
RTA_ENCAP_TYPE may contain values LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, or LWTUNNEL_ENCAP_IP6 defined in <linux/lwtunnel.h>.
Заполнить эти значения!
Добавление, удаление или получение информации о записи соседей по таблице (например, запись ARP). В сообщении содержится структура ndmsg:
struct ndmsg {

unsigned char ndm_family;
int ndm_ifindex; /* индекс интерфейса */
__u16 ndm_state; /* состояние */
__u8 ndm_flags; /* флаги */
__u8 ndm_type; }; struct nda_cacheinfo {
__u32 ndm_confirmed;
__u32 ndm_used;
__u32 ndm_updated;
__u32 ndm_refcnt; };
В ndm_state содержится битовая маска следующих состояний:
NUD_INCOMPLETE запись кэша в данный момент определяется
NUD_REACHABLE подтверждённая рабочая запись кэша
NUD_STALE устаревшая запись кэша
NUD_DELAY запись ожидает срабатывания таймера
NUD_PROBE запись кэша в данный момент проверяется повторно
NUD_FAILED некорректная запись кэша
NUD_NOARP устройство без кэша назначений
NUD_PERMANENT статическая запись

Допустимые значения ndm_flags:

NTF_PROXY запись прокси arp
NTF_ROUTER маршрутизатор IPv6

Структура rtattr имеет следующие значения для поля rta_type:

NDA_UNSPEC неизвестный тип
NDA_DST кэш адресов назначения соседей на сетевом уровне
NDA_LLADDR кэш адресов соседей на уровне связей
NDA_CACHEINFO статистика кэша

Если значение поля rta_type равно NDA_CACHEINFO, то присутствует заголовок struct nda_cacheinfo.

Добавление, удаление или получение правила маршрутизации. Содержит struct rtmsg.
Добавление, удаление или получение планирования очереди. В сообщении содержится struct tcmsg, а также может быть серия атрибутов.
struct tcmsg {

unsigned char tcm_family;
int tcm_ifindex; /* индекс интерфейса */
__u32 tcm_handle; /* описатель qdisc */
__u32 tcm_parent; /* предок qdisc */
__u32 tcm_info; };
Атрибуты
rta_type тип значения описание
TCA_UNSPEC - не определено
TCA_KIND строка asciiz имя план-ания очереди
TCA_OPTIONS байтовая последовательность есть параметры qdisc
TCA_STATS struct tc_stats статистика qdisc
TCA_XSTATS относится к qdisc стат-ка по опр. модулю
TCA_RATE struct tc_estimator ограничение по скорости

Также, разрешены дополнительные атрибуты модуля qdisc. Дополнительную информацию можно получить из соответствующих заголовочных файлов.

Добавление, удаление или получение класса трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.
Добавление, удаление или получение информации о фильтре трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.

ВЕРСИИ

Свойство rtnetlink появилось в Linux 2.2.

ДЕФЕКТЫ

Данная справочная страница не полна.

СМ. ТАКЖЕ

cmsg(3), rtnetlink(3), ip(7), netlink(7)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Баринов Владимир и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

9 июня 2020 г. Linux