- bullseye-backports 4.18.1-1~bpo11+1
- testing 4.18.1-1
- unstable 4.18.1-1
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):
- RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
- Создание, удаление и получение информации об определённом сетевом интерфейсе. Эти сообщения содержат структуру 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_STATS — struct rtnl_link_stats (в Linux 2.4 и старее — struct net_device_stats).
- RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
- Добавление, удаление или получение информации об 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 информация об адресе
- RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
- Создание, удаление или получение информации о сетевом маршруте. Эти сообщения содержат структуру 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>.
- Заполнить эти значения!
- RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
- Добавление, удаление или получение информации о записи соседей по таблице (например, запись 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.
- RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
- Добавление, удаление или получение правила маршрутизации. Содержит struct rtmsg.
- RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
- Добавление, удаление или получение планирования очереди. В сообщении содержится 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. Дополнительную информацию можно получить из соответствующих заголовочных файлов.
- RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
- Добавление, удаление или получение класса трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.
- RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
- Добавление, удаление или получение информации о фильтре трафика. В этих сообщениях содержится структура struct tcmsg, описанная ранее.
ВЕРСИИ¶
Свойство rtnetlink появилось в Linux 2.2.
ДЕФЕКТЫ¶
Данная справочная страница не полна.
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта 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 |