Главная » 2017 » Ноябрь » 18 » man 7 rtnetlink
21:31
man 7 rtnetlink

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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



ОБЗОР


#include <asm/types.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.

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

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; /* область адреса */
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 адрес raw-протокола адрес интерфейса
IFA_LOCAL адрес raw-протокола локальный адрес
IFA_LABEL строка asciiz название интерфейса
IFA_BROADCAST адрес raw-протокола широковещательный адрес
IFA_ANYCAST адрес raw-протокола адрес 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; /* адресное семейство маршрута */
unsigned char rtm_dst_len; /* длина назначения */
unsigned char rtm_src_len; /* длина источника */
unsigned char rtm_tos; /* фильтр TOS */

unsigned char rtm_table; /* ID таблицы маршрутизации */
unsigned char rtm_protocol; /* протокол марш-ции; см. ниже */

RTN_UNICAST шлюз или прямой маршрут
RTN_LOCAL маршрут локального интерфейса
RTN_BROADCAST локальный широковещательный маршрут
(широковещательная отправка)
RTN_ANYCAST локальный широковещательный маршрут
(однонаправленная отправка)
RTN_MULTICAST многоадресный маршрут
RTN_BLACKHOLE маршрут для отброса пакетов
RTN_UNREACHABLE недостижимый пункт назначения
RTN_PROHIBIT маршрут для отклонения пакетов
RTN_THROW продолжение поиска маршрута в другой таблице
RTN_NAT правило трансляции сетевого адреса
RTN_XRESOLVE ссылка на внешний определитель (не
реализовано)

rtm_protocol Происхождение маршрута
─────────────────────────────────────────────────
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 и до
RTA_OIF int индекс выходного интерфейса
RTA_GATEWAY адрес протокола шлюз маршрута
RTA_PRIORITY int приоритет маршрута
RTA_pFSRC
RTA_METRICS int метрика маршрута
RTA_MULTIPATH
RTA_PROTOINFO
RTA_FLOW
RTA_CACHEINFO

Заполнить эти значения!

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.

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 specific стат-ка по опр. модулю
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.



ДЕФЕКТЫ


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



СМОТРИТЕ ТАКЖЕ


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



Категория: (7) Различные описания, соглашения и прочее | Просмотров: 585 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar