Почему так много сообщений NETLINK rtm_newlink при запуске контейнера docker - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над приложением анализатора пакетов и настроил его так, чтобы для каждого интерфейса существовал один поток захвата (в отличие от одного потока, который захватывает «все»). Он работает нормально, но код должен прослушивать изменения в списке интерфейсов, чтобы он мог управлять потоками захвата.

Я написал небольшую функцию, которая делает то, что я хочу, используя netlink api, используя RTMGRP_LINK в nl_groups поле и, в частности, действует на типы сообщений RTM_DELLINK и RTM_NEWLINK. Он работает, как и ожидалось, но я не совсем понимаю logi c, когда контейнер docker запускается с точки зрения сообщений, получаемых от ядра.

Например, запуск docker run -it centos:7 /bin/bash создает следующий поток сообщений:

RTM_NEWLINK NAME: vethaec0b80 MAC: a2:a1:2c:48:72:f4
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: docker0 MAC: 02:42:0d:8f:a2:f9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: docker0 MAC: 02:42:0d:8f:a2:f9
RTM_DELLINK NAME: vethaec0b80 MAC: a2:a1:2c:48:72:f4
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: docker0 MAC: 02:42:0d:8f:a2:f9

и при выходе из контейнера генерируется:

RTM_NEWLINK NAME: vethaec0b80 MAC: 02:42:ac:11:00:02
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_DELLINK NAME: vethaec0b80 MAC: 02:42:ac:11:00:02
RTM_NEWLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_DELLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: docker0 MAC: 02:42:0d:8f:a2:f9
RTM_DELLINK NAME: vethb4ca0db MAC: fe:e8:79:7a:ce:d9
RTM_NEWLINK NAME: docker0 MAC: 02:42:0d:8f:a2:f9

Как видно из запуска контейнера, сообщение RTM_NEWLINK получено для 2 виртуальных интерфейсов (один из которых разрушен) и мост docker, который уже был запущен и работает. Завершение контейнера имеет аналогичную ситуацию; Создано 2 виртуальных интерфейса (оба уничтожены после того, как RTM_NEWLINK снова вызвал их).

Вопросы

1) Почему созданы 2 виртуальных интерфейса и сохраняется только один при запуске контейнера ?

2) Почему сообщения RTM_NEWLINK отправляются так много раз?

3) При завершении контейнера, почему он отправляет так много сообщений RTM_NEWLINK перед отправкой сообщения RTM_DELLINK?

1 Ответ

0 голосов
/ 16 марта 2020

1) Почему при запуске контейнера созданы 2 виртуальных интерфейса и только один сохранен?

Предположение: Docker создает пару подключенных интерфейсов, затем перемещает один внутрь контейнер, который является отдельным сетевым пространством имен. Поскольку вы смотрите в пространстве имен по умолчанию, вы видите, что оно исчезает. Если бы вы находились в пространстве имен контейнера, вы бы увидели его.

2) Почему сообщения RTM_NEWLINK отправляются так много раз?

3) При завершении контейнера, почему перед отправкой сообщения RTM_DELLINK он отправляет столько сообщений RTM_NEWLINK?

RTM_NEWLINK отправляется не только при создании интерфейса. Он также отправляется при изменении интерфейса.

...