Администратор тестов сети
Администратор тестов сети отслеживает входящие и исходящие сетевые пакеты в системе (информация пакета интерпретируется модулем bpf в AIX). Спецификация теста позволяет указывать фильтры BPF (пакетный
фильтр Berkeley), аналогичные выражениям фильтров
программы tcpdump для более точного отслеживания.
Можно использовать встроенные переменные для чтения заголовка и полезной нагрузки пакета для интернет-протоколов. Например, протоколов IPv4, IPv6, TCP, UDP, ICMP, IGMP и ARP.
Администратор тестов сети сообщает о важных событиях протокола (например, изменение состояния TCP, время оборота пакета, повторные передачи, переполнение буфера UDP).
Администратор тестов сети используется главным образом в следующих случаях:
- Предоставление модулю bpf следующей информации о пакете на основе IP-адреса и портов:
- Отслеживание входящих и исходящих данных для соединения.
- Для чтения заголовка протокола и полезной нагрузки предусмотрены следующие
встроенные переменные.
- Флаги TCP (SYN, FIN), последовательность TCP и число подтверждения.
- IPv4/IPv6 (IP-адреса, типы протоколов: tcp, udp, icmp, igmp и т. д.)
- ICMP (тип пакета: ECHO REQUEST, ECHO RESPONSE и т. д.).
- Обеспечение доступа к полному исходному содержимому сетевого пакета для обработки сценарием теста.
- Информирование о следующих событиях протокола:
- Отслеживание событий заполнения буфера отправителя и получателя TCP.
- Переход соединения TCP из состояния SYN-SENT в состояние ESTABLISHED или из состояния ESTABLISHED в состояние CLOSE.
- Мониторинг времени перехода между состояниями (например, сколько времени занял переход из состояния SYN-SENT в состояние ESTABLISHED).
- Обнаружение получателей (информация о соединении), отклоняющих соединения из-за переполнения очереди.
- Обнаружение повторных передач (вторая и последующие повторные передачи пакета) для соединений TCP.
- Обнаружение потери пакетов сокетом UDP из-за слишком маленького буфера приема.
Спецификация теста
Спецификация теста для администратора тестов сети состоит из трех или пяти кортежей, разделенных двоеточием (:). Первый кортеж всегда @@net.
Администратор тестов сети поддерживает две основные категории спецификаций: одна предназначена для сбора информации о пакете, другая - для сбора информации о протоколе.
- Формат для сбора информации о пакете:
@@net:bpf:<интерфейс-1>|<интерфейс-2>|…..:<протокол>:<фильтр> - Формат для сбора информации о протоколе
@@net:tcp:<имя-события>@@net:udp:<имя-события>
Подтип теста
Второй кортеж обозначает подтип теста, указывающий уровень сетевого стека AIX, содержащий тест. Этот кортеж может иметь одно из следующих значений (* нельзя указывать):
| Второй кортеж (подтип) | Описание |
|---|---|
| bpf | Этот тест запускается на уровне сетевого интерфейса, когда пакет соответствует определенному фильтру. |
| tcp | Этот тест запускается для событий протокола TCP. |
| udp | Этот тест запускается для событий протокола UDP. |
Проверка сетевого события или сбор информации о сетевом пакете
Третий кортеж зависит от подтипа (второй кортеж). Его значение не может быть *.
Тесты bpf
Спецификация содержит 5 кортежей для тестов bpf (см. следующую таблицу).
| Второй кортеж (подтип) | Следующие кортежи | Описание |
|---|---|---|
|
bpf |
Третий кортеж - имена интерфейсов | В этом кортеже указывается интерфейс или список интерфейсов, для которых будет собираться информация о пакетах. Возможные значения: enX (например,
en0,en1) и lo0. Значение * не поддерживается для этого кортежа. Можно указать один или несколько интерфейсов, используя символ | в качестве разделителя. |
| Четвертый кортеж - протокол | В этом кортеже указывается протокол для запуска теста. Возможные значения:
ether, arp, rarp, ipv4, ipv6, tcp, udp, icmp4, icmp6 и igmp.
Заполняются встроенные переменные для протокола, доступные из сценария Vue. Например, значение протокола ipv4 заполняет встроенные переменные __ip4hdr.Значение * для этого кортежа указывает, что тест запускается для всех типов протоколов, соответствующих указанному фильтру. Когда протокол - *, встроенные переменные, поддерживаемые администратором
тестов сети, недоступны в сценариях Vue. Исходные данные пакета запрошенного размера можно получить с помощью функции
Vue
copy_kdata() и отобразить на заголовки соответствующих протоколов.Прим.: Значение * может ухудшить производительность, поскольку тест будет запускаться для всех входящих и исходящих пакетов на указанных интерфейсах, которые соответствуют фильтру. Также имеет место копирование, когда информация пакета занимает несколько буферов пакетов.
|
|
| Пятый кортеж - строка фильтра bpf | В этом кортеже указывается выражение фильтра bpf (выражения фильтра имеют такой же синтаксис, как в команде tcpdump). Выражение фильтра должно указываться в двойных кавычках. Выражение фильтра и протокол, указанный в четвертом кортеже, должны быть совместимыми. Значение * не поддерживается в этом кортеже. |
- Формат спецификации для доступа к встроенным переменным, связанным с
заголовком Ethernet (
__etherhdr), заголовком IP (__ip4hdrили__ip6hdr) и заголовком TCP (__tcphdr), из сценария Vue, когда интерфейс en0 принимает или отправляет пакеты через порт 23 (строка фильтра "port 23"):@@net:bpf:en0:tcp:"port 23" - Формат спецификации для доступа ко встроенным переменным,
связанным с заголовком Ethernet (
__etherhdr), IP-заголовком (__ip4hdrили__ip6hdr) и заголовком UDP (__udphdr) из сценария Vue, если система взаимодействует с хостом example.com (строка фильтра “example.com”) через интерфейсы en0 и en1:@@net:bpf:en0|en1:udp:"host example.com" - Формат спецификации для доступа к исходным данным пакета, когда система принимает или отправляет пакеты для "host example.com":
@@net:bpf:en1:*:"host example.com"
bpf использует устройство bpf. Эти устройства
являются общими для ProbeVue, tcpdump и другими программами, которые используют библиотеку libpcap или
bpf для захвата и внедрения пакетов. Число тестов bpf зависит от числа доступных устройств bpf в системе. При запуске теста bpf исходные данные пакета помещаются в переменную __mdata. Исходные данные пакета запрошенного размера можно получить с помощью функции Vue copy_kdata () и отобразить их на структуру ether_header, ip header и т. п. Следующие структуры применяются для извлечения заголовка и полезной нагрузки.
Пример
Сценарий VUE для доступа к исходным данным пакета, когда для протокола указано значение "*".
/* Определение структуры заголовка ether */
struct ether_header {
char ether_dhost[6];
char ether_shost[6];
short ether_type;
};
/* Сценарий ProbeVue для доступа к исходным данным пакета и их интерпретации */
@@net:bpf:en0:*:"port 23"
{
/* определение локальных переменных сценария */
__auto struct ether_header eth;
__auto char *mb;
/* __mdata содержит адрес данных пакета */
mb =(char *) __mdata;
printf("probevue для сети\n");
/*
* Применение функции VUE copy_kdata() для копирования данных
* запрошенного размера (размер структуры ether_header) из mbuf в переменную eth
* (тип ether_header).
*/
copy_kdata (mb, eth);
printf("Тип из исходных данных: %x\n",eth.ether_type);
}
Тесты TCP
Спецификация содержит три кортежа для тестов TCP (см. следующую таблицу).
| Второй кортеж (подтип) |
События (третий кортеж) Значение * не поддерживается в этом кортеже. |
Описание |
|---|---|---|
| tcp | state_change | Этот тест запускается при изменении состояния TCP. |
| send_buf_full | Этот тест запускается при возникновении события заполнения буфера отправки. | |
| recv_buf_full | Этот тест запускается при возникновении события заполнения буфера приема. | |
| retransmit | Этот тест запускается при повторной передаче пакета через соединение TCP. | |
| listen_q_full | Этот тест запускается, когда сервер (сокет получателя запросов) отклоняет новые запросы на установку соединения из-за отсутствия места в очереди получателя. |
Во встроенную переменную __proto_info помещается информация о соединении TCP (локальный IP-адрес, удаленный IP-адрес, локальный порт и удаленный порт) при возникновении события TCP. Удаленный порт и удаленный IP-адрес имеют значение NULL для события listen_q_full.
Пример
Спецификации тестов для изменений состояния протокола TCP:
@@net:tcp:state_changeТесты udp
Для тестов udp спецификация состоит из трех кортежей (см. следующую таблицу).
| Второй кортеж (подтип) | События (третий кортеж) Значение * не поддерживается в этом кортеже. |
Описание |
|---|---|---|
| udp | sock_recv_buf_overflow | Этот тест запускается, когда возникает переполнение дейтаграммы или буфера приема данных сокета UDP. |
Встроенная переменная __proto_info позволяет
получить данные протокола UDP (исходный и целевой IP-адреса и номера
портов), если возникает событие переполнения буфера приема.
@@net:udp:sock_recv_buf_overflowПример
Спецификации тестов для переполнения буфера приема данных сокета UDP:
@@net:udp:sock_recv_buf_overflowВстроенные переменные для сценариев Vue, связанные с тестами сети
Сетевые события можно тестировать с помощью следующих встроенных переменных.
Встроенная переменная __etherhdr
Переменная __etherhdr - это специальная встроенная переменная, позволяющая
получить информацию о заголовке ether из отфильтрованного пакета. Эта
переменная доступна в тестах пакетной информации на уровне интерфейса с одним
из следующих протоколов: ipv4, tcp, udp, icmp4 и rarp. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __etherhdr->элемент.
Значение встроенной переменной __etherhdr состоит из следующих элементов:
| Имя элемента | Введите | Описание |
|---|---|---|
| src_addr |
mac_addr_t |
Исходный MAC-адрес. Тип данных mac_addr_t используется для хранения MAC-адреса. MAC-адрес можно вывести с помощью спецификатора формата "M". |
| dst_addr | mac_addr_t | Целевой MAC-адрес. Тип данных mac_addr_t используется для хранения MAC-адреса. MAC-адрес можно вывести с помощью спецификатора формата "M". |
| ether_type | unsigned short | Это имя указывает на протокол, инкапсулированный в полезной нагрузке кадра Ethernet. Возможные протоколы: IPv4, IPv6, ARP и REVARP. Может совпадать с одним из следующих значений встроенной константы для ether_type:
См. значения ether_type в файлах заголовков |
Переменная __ip4hdr - это специальная встроенная переменная, позволяющая
получить информацию о заголовке IPv4 из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с одним из следующих протоколов:
ipv4, tcp, udp, icmp4 и igmp. И содержит допустимые данные, когда версия протокола IP - IPv4. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __ip4hdr->элемент.
Эта встроенная переменная содержит следующие элементы:
| Имя элемента | Введите | Описание |
|---|---|---|
| src_addr |
ip_addr_t |
Исходный IP-адрес. Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса в десятичном формате с точками используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция. |
| dst_addr | ip_addr_t | Целевой IP-адрес. Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса в десятичном формате с точками используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция. |
| protocol | unsigned short | Этот элемент указывает протокол раздела данных дейтаграммы IP.
Возможные протоколы: TCP, UDP, ICMP, IGMP, FRAGMENTED и пр. Может совпадать с одним из следующих значений встроенной константы для протокола. Значения протоколов определены в заголовочном файле |
| ttl | unsigned short | Время хранения в кэше или ограничение на пересылку. |
| cksum | unsigned short | Контрольная сумма заголовка IP. |
| id | unsigned short | Идентификационный номер. Этот элемент используется в качестве уникального идентификатора группы фрагментов одной дейтаграммы IP. |
| total_len | unsigned short | Суммарная длина. Это значение - полный размер пакета (фрагмента), включая заголовок IP и данные, в байтах. |
| hdr_len | unsigned short | Размер заголовка IP. |
| tos | unsigned short | Тип службы. |
| frag_offset | unsigned short | Смещение фрагмента. Это значение - смещение определенного фрагмента, относительно начала исходной, нефрагментированной, дейтаграммы IP. Первый фрагмент имеет нулевое смещение. Может совпадать с одним из значений флага встроенной константы
Значения флагов определены в заголовочном файле |
Встроенная переменная __ip6hdr
Переменная __ip6hdr - это специальная встроенная переменная, позволяющая
получить информацию о заголовке IPv6 из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса. Эта переменная с любым из протоколов ipv6, tcp, udp и icmp6 содержит допустимые данные, когда версия протокола IP - IPv6. Эта переменная доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __ip6hdr->элемент.
Эта встроенная переменная содержит следующие элементы:
| Имя элемента | Введите | Описание |
|---|---|---|
| src_addr |
ip_addr_t |
Исходный IP-адрес. Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция. |
| dst_addr | ip_addr_t | Целевой IP-адрес. Тип данных ip_addr_t используется для хранения IP-адреса. Для вывода IP-адреса используется спецификатор формата "I", для вывода имени хоста используется спецификатор формата "H". Вывод имени хоста - дорогостоящая операция. |
| protocol | unsigned short | Это значение указывает протокол раздела данных дейтаграммы IP.
Возможные протоколы: TCP, UDP, ICMPv6 и пр. Может совпадать с одним из следующих значений встроенной константы для протокола: IPPROTO_TCP,IPPROTO_UDP, IPPROTO_ROUTING, IPPROTO_ICMPV6,
IPPROTO_NONE, IPPROTO_DSTOPTS, IPPROTO_LOCALЗначения протоколов определены в заголовочном файле |
| hop_limit | unsigned short | Ограничение на пересылку (время хранения в кэше). |
| total_len | unsigned short | Суммарная длина (размер полезной нагрузки). Размер полезной нагрузки, включая заголовки расширений. |
| next_hdr | unsigned short | Тип следующего заголовка. Это поле обычно указывает на протокол транспортного уровня, который используется полезной нагрузкой пакета. Когда в пакете есть заголовки расширений, это поле указывает на следующий заголовок расширения. Значения этого поля такие же, как у соответствующего поля протокола IPv4. |
| flow_label | unsigned int | Метка потока. |
| traffic_class | unsigned int | Класс потока данных. |
Встроенная переменная __tcphdr
Переменная __tcphdr - это специальная встроенная переменная, позволяющая
получить информацию о заголовке tcp из отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом TCP. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __tcphdr->элемент.
Встроенная переменная __tcphdr состоит из следующих элементов:
| Имя элемента | Введите | Описание |
|---|---|---|
| src_port | unsigned short | Исходный порт пакета. |
| dst_port | unsigned short | Целевой порт пакета. |
| flags | unsigned short | Биты, указывающие на передачу управляющей информации. По 1 биту на флаг. Может совпадать с одним из значений флага встроенной константы. Значения флагов должны быть побитовыми и содержать значение флага встроенной константы для проверки наличия конкретного флага.
Дополнительную информацию об этих флагах можно найти в документации протокола TCP, значения флагов определены в заголовочном файле |
| seq_num | unsigned int | Порядковый номер. |
| ack_num | unsigned int | Число подтверждения. |
| hdr_len | unsigned int | Длина заголовка TCP |
| cksum | unsigned short | Контрольная сумма. |
| window | unsigned short | Размер окна. |
| urg_ptr | unsigned short | Индикатор срочности. |
Встроенная переменная __udphdr
Переменная __udphdr - это специальная встроенная переменная, позволяющая
получить информацию о заголовке udp из отфильтрованного пакета. Эта встроенная переменная доступна в тестах пакетной информации на уровне
интерфейса с протоколом udp. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __udphdr->элемент.
Встроенная переменная __udphdr содержит следующие элементы:
| Имя элемента | Введите | Описание |
|---|---|---|
| src_port | unsigned short | Исходный порт пакета. |
| dst_port | unsigned short | Целевой порт пакета. |
| length | unsigned short | Длина заголовка и данных UDP. |
| cksum | unsigned short | Контрольная сумма. |
Встроенная переменная __icmp
Переменная __icmp - это специальная встроенная переменная, позволяющая
получить информацию о заголовке icmp из отфильтрованного
пакета. Эта встроенная переменная доступна в тестах пакетной информации на
уровне интерфейса с протоколом icmp. Она доступна в тестах подтипа bpf. К ее элементам можно обращаться с помощью следующего синтаксиса: __icmp->элемент.
Эта встроенная переменная содержит следующие элементы:
| Имя элемента | Введите | Описание |
|---|---|---|
| type | unsigned short | Тип сообщения ICMP. Пример: 0 - эхо-ответ, 8 - эхо-запрос, 3 - целевой адрес недоступен. Есть и другие типы. См. документацию на сетевые стандарты. Может совпадать с одним из следующих значений встроенной константы для типов сообщений ICMP: Значения протокола определены в заголовочном файле Прим.: Определены не все возможные значения типов сообщений, поэтому значение может быть и другим.
|
| code | unsigned short | Подтип сообщения ICMP. Для каждого типа сообщений определено несколько разных кодов и подтипов. Например, нет маршрута к целевому адресу, связь с целевым адресом административно запрещена, нет соседнего узла, адрес недоступен, порт недоступен. См. документацию на сетевые стандарты. Может совпадать с одним из следующих значений встроенной константы для подтипов ICMP: ICMP_UNREACH_NET ICMP_UNREACH_HOST ICMP_UNREACH_PROTOCOL ICMP_UNREACH_PORT ICMP_UNREACH_NEEDFRAG ICMP_UNREACH_SRCFAIL ICMP_UNREACH_NET_ADMIN_PROHIBITED ICMP_UNREACH_HOST_ADMIN_PROHIBITED Значения подтипов для типа 4 Значения подтипов для типа 4 следующие: Значения подтипов для типа 6 Значения подтипов для типа 6 следующие: Значения подтипов для типа 7 Значения подтипов для типа 7 следующие: ICMP_PARAMPROB_PTR ICMP_PARAMPROB_MISSING Значения подтипов сообщений определены в заголовочном файле /usr/include/netinet/ip_icmp.h. Примечание: определены не все возможные подтипы сообщений, поэтому значение подтипа сообщения может быть и другим. |
| cksum | unsigned short | Контрольная сумма. |
Встроенная переменная __icmp6
Переменная __icmp6 - это специальная встроенная переменная, содержащая
заголовок icmpv6 отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом icmp6. Она доступна в тестах подтипа bpf. Элементы этой встроенной
переменной доступны посредством синтаксиса "__icmp6->элемент".
__icmp6 состоит из следующих элементов:
| Имя элемента | Введите | Описание |
|---|---|---|
| type | unsigned short | Тип сообщения ICMPV6. Это тип сообщения, определяющий формат остальных данных. Может совпадать с одним из следующих значений встроенной константы для типов ICMPV6. Значения протокола определены в заголовочном файле Прим.: Определены не все возможные значения типов сообщений, поэтому значение может быть и другим.
|
| code | unsigned short | Подтип сообщения ICMPV6. Это значение зависит от типа сообщения. Оно дает дополнительный уровень дискретности сообщения. Может совпадать с одним из следующих значений встроенной константы для подтипов ICMPV6. Значения подтипов сообщений определены в заголовочном файле Прим.: Определены не все возможные значения подтипов сообщений, поэтому значение может быть и другим.
|
| cksum | unsigned short | Контрольная сумма. |
Встроенная переменная __igmp
__igmp - это специальная встроенная переменная, содержащая заголовок
igmp отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом igmp. Эта переменная доступна в тестах подтипа bpf. Ее элементы доступны посредством синтаксиса "__igmp->элемент".
Встроенная переменная __igmp содержит следующие элементы:
| Имя элемента | Введите | Описание |
|---|---|---|
| type | unsigned short |
Тип сообщения IGMP. Пример: Может совпадать с одним из следующих значений встроенной константы для типов сообщений IGMP.
Значения протоколов определены в заголовочном файле Примечание: определены не все возможные значения типов сообщений, поэтому значение может быть и другим. |
| code | unsigned short |
Подтип типа IGMP. Может совпадать с одним из следующих значений встроенной константы для подтипов сообщений IGMP. Значения подтипов для типа 3.
Прим.: Определены не все возможные значения подтипов сообщений, поэтому значение может быть и другим.
|
| cksum | unsigned short | Значение контрольной суммы IGMP. |
| group_addr | ip_addr_t |
Групповой адрес, сообщаемый или запрашиваемый. Этот адрес представляет собой групповой адрес, который запрашивается при отправке запроса, связанного с группой или с группой и источником. Поле имеет нулевое значение, если отправляется общий запрос. Тип данных ip_addr_t используется для хранения IP-адреса группы. IP-адрес можно вывести с помощью спецификатора формата "I". |
Встроенная переменная __arphdr
Переменная __arphdr - это специальная встроенная переменная,
позволяющая получить информацию о заголовке arphdr из
отфильтрованного пакета. Эта переменная доступна в тестах пакетной информации на уровне интерфейса с протоколом arp или rarp. Она доступна в тестах подтипа bpf. К элементам переменной __arphdr можно обращаться посредством синтаксиса __arphdr->элемент.
Встроенная переменная __arphdr состоит из следующих элементов:
| Имя элемента | Введите | Описание |
|---|---|---|
| hw_addr_type | unsigned short | Формат аппаратного типа адреса. Это поле содержит конкретный протокол канала передачи данных, который используется. Может совпадать с одним из следующих значений встроенной константы для протокола передачи данных: Значения протокола определены в заголовочном файле /usr/include/net/if_arp.h. |
| protocol_type | unsigned short | Формат типа адреса протокола. Это поле содержит конкретный сетевой протокол, который используется. Может совпадать с одним из следующих значений встроенной константы для сетевого протокола: Значения протокола определены в заголовочном файле |
| hdr_len | unsigned short | Длина аппаратного адреса или MAC-адреса. |
| proto_len | unsigned short | Длина адреса протокола или IP-адреса. |
| operation | unsigned short | Операция, выполняемая отправителем: 1 - запрос, 2 - ответ. Может совпадать с одним из следующих значений встроенной константы для сетевого протокола: Значения протокола определены в заголовочном файле |
| src_mac_addr | mac_addr_t | MAC-адрес отправителя или исходный MAC-адрес. Аппаратный адрес или MAC-адрес отправителя хранится в типе данных mac_addr_t. Для вывода аппаратного адреса или MAC-адреса отправителя используется спецификатор формата "%M". |
| dst_mac_addr | mac_addr_t | Целевой MAC-адрес. Целевой аппаратный адрес или MAC-адрес хранится в типе данных mac_addr_t. Для вывода целевого аппаратного адреса или MAC-адреса используется спецификатор формата "%M". |
| src_ip | ip_addr_t | Исходный IP-адрес или IP-адрес отправителя. Исходный IP-адрес хранится в типе данных Для вывода IP-адреса отправителя используется спецификатор формата "%I". |
| dst_ip | ip_addr_t | Целевой IP-адрес. Целевой IP-адрес хранится в типе данных Для вывода целевого IP-адреса используется спецификатор формата "%I". |
Пример
Сценарий Vue для тестирования информации заголовков пакетов,
принимаемых или передаваемых через порт 23. Выводит информацию об исходном и целевом узлах, а также длину заголовка
tcp
@@net:bpf:en0:tcp:"port 23"
{
printf("src_addr:%I b dst_addr:%I\n",__ip4hdr->src_addr,__ip4hdr->dst_addr);
printf("src port:%d\n",__tcphdr->src_port);
printf("dst port:%d\n",__tcphdr->dst_port);
printf("tcp hdr_len:%d\n",__tcphdr->hdr_len);
}
Вывод:
# probevue bpf_tcp.e
src_addr:10.10.10.12 и dst_addr:10.10.18.231
src port:48401
dst port:23
tcp hdr_len:20
..................
.................
Встроенная переменная __proto_info
Переменная __proto_info - это специальная встроенная переменная, позволяющая
получить информацию о протоколе (исходные и целевые IP-адреса и порты)
для событий TCP и UDP. Переменная __proto_info доступна в тестах подтипа tcp или udp. К ее элементам можно обращаться с помощью следующего синтаксиса: __proto_info->элемент.
Встроенная переменная __proto_info состоит из следующих элементов:
| Имя элемента | Введите | Описание |
|---|---|---|
| local_port | unsigned short | Локальный порт |
| remote_port | unsigned short | Удаленный порт |
| local_addr | ip_addr_t | Локальный адрес |
| remote_addr | ip_addr_t | Удаленный адрес |
Дополнительная информация для событий TCP
В следующей таблице описываются события изменения состояния TCP:
| Имя | Введите | Описание |
|---|---|---|
| __prev_state | short | Информация о предыдущем состоянии для соединения. |
| __cur_state | short | Информация о текущем состоянии для соединения. |
Может совпадать с одним из следующих значений встроенной константы для состояний TCP:
Значения определены в экспортированном заголовочном файле |
Например:
Следующий сценарий Vue выводит информацию об изменении состояния для определенного соединения:
@@net:tcp:state_change
when(__proto_info->local_addr ==”10.10.10.1” and __proto_info->remote_addr == 10.10.10.2”
and __proto_info->local_port == "8000" and __proto_info->remote_port == "9000")
{
printf("Предыдущее состояние: %d, текущее состояние: %d\n",__prev_state,__cur_state);
}Событие повторной передачи TCP
| Имя | Введите | Описание |
|---|---|---|
| __nth_retransmit | unsigned short | n-я повторная передача |
Примеры
1. В следующем примере обнаруживается получатель, отклоняющий соединения из-за переполнения очереди.
@@net:tcp:listen_q_full
{
printf("IP-адрес получателя: %I и номер порта: %d\n",__proto_info->local_addr, __proto_info->local_port);
}2. В следующем примере обнаруживается соединение, теряющее пакеты из-за переполнения буфера сокета
@@net:udp:sock_recv_buf_overflow
{
printf("Информация о соединении, теряющем пакеты из-за переполнения буфера сокета:\n");
printf("Локальный IP-адрес: %I и удаленный IP-адрес: %I\n",__proto_info->local_addr,__proto_info->remote_addr);
printf("локальный порт: %d и удаленный порт: %d\n",__proto_info->local_port, __proto_info->remote_port);
}3. Обнаружение повторных передач (вторая и последующие повторные передачи пакета) для определенного соединения TCP.
@@net:tcp:retransmit
when (__proto_info->local_addr == "10.10.10.1" &&
__proto_info->remote_addr == "10.10.10.2" &&
__proto_info->local_port == "4000" &&
__proto_info->remote_port == "5000")
{
printf(" %d th re-transmition for this connection\n", _nth_retransmit);
}4. Получение информации о соединении при возникновении события заполнения буфера отправителя.
@@net:tcp:send_buf_full
{
printf("Информация о соединении при возникновении события заполнения буфера:\n");
printf("Локальный IP-адрес: %I и удаленный IP-адрес: %I\n",__proto_info->local_addr,__proto_info->remote_addr);
printf("локальный порт: %d и удаленный порт: %d\n",__proto_info->local_port, __proto_info->remote_port);
}