Как присвоить имя существующему пространству имен анонимной сети

I have a question about how to find the installed applications easily in Linux.

После установки пакета вы можете увидеть в выводе

dpkg -l

Это покажет все пакеты и их статус. (Неизвестно/Установить/Удалить/Очистить/Задержать ). Это не только говорит вам о том, что вы установили сdpkg(менеджером пакетов Debian ). как и в Windows, если ваша программа устанавливается путем распаковки на рабочий стол, ничто не будет это отслеживать.

1
11.02.2021, 14:49
1 ответ

На низком -уровне обработки пространств имен не существует фактического имени. Все это обрабатывается обычными действиями или ожиданиями, выполняемыми с каждой командой в наборе iproute2 .

Присвоение имени существующему анонимному сетевому пространству имен на самом деле означает :заставить инструменты iproute2 полагать, что они сделали свои обычные настройки при создании этого сетевого пространства имен.

Так что же на самом деле делает ip netns add foo? Он отменяет общий доступ к новому сетевому пространству имен и, чтобы сохранить это пространство имен существующим даже без использования его процессом, монтирует его. В обычной философии *nix пространство имен имеет номер inode , представляющий псевдо -файл в псевдо -файловой системе nsfs . С файлом (нельзя выполнить почти никаких операций, даже не прочитать его ), но его можно открыть, чтобы использовать в качестве маркера для операций с пространством имен (, например setns(2)), а также можно смонтировать как привязку.

Увы, ссылку nsid нельзя использовать напрямую, :это не глобальное значение, представляющее другое пространство имен, а локальный(локально уникальный, но повторяемый и не глобально уникальный )идентификатор, представляющий связать с другим пространством имен. Несколько значений означают, что :ссылается на несколько других пространств имен,дважды одно и то же значение означает :две ссылки на одно и то же другое пространство имен.

Если вам нужно найти другие пространства имен, начиная только с этого, я приглашаю вас проверить мой ответ в этом другом вопросе/ответе , где я дал ответ по этому поводу. Существует также удобный инструмент сопоставления :plotnetcfg, который может отображать все сетевые пространства имен. Хотя он знает о методах iproute2 , он, по-видимому, не предоставляет идентификатор процесса отдельно, вместо этого он называет пространство имен с PID из него, когда оно не «названо» iproute2 .. Отредактированный пример (, требующий jq), запускаемый как root:

# unshare -n -- sleep 999 &
[1] 677451
#  plotnetcfg -f json | jq '.namespaces[].name'
""
[...]
"PID 268150 (systemd)"
"PID 345878 (systemd)"
[...]
"PID 677451 (sleep)"

Здесь ""представляет начальное пространство имен, два systemdотносятся к двум экземплярам LXC, а также выполняется команда sleep.

Чтобы помочь в двух распространенных случаях:

  • для LXC:

    lxc-info -H -p -n containername
    
  • для Докера:

    docker inspect --format '{{.State.Pid}}' containername
    

Как только вы нашли каким-либо доступным методом процесс в предполагаемом сетевом пространстве имен, вы можете имитировать действия инструментов iproute2 . То, что они точно делают, может зависеть от их точной версии. Из straceмой, похоже,:

mkdir -p /run/netns

, а затем смонтировать его поверх самого себя, чтобы его можно было установить как совместное распространение:

mount --bind --make-shared /run/netns /run/netns

Описанное выше следует выполнять только один раз, если это еще не сделано. Чтобы инструменты делали это за вас (и только при необходимости ), просто создайте и удалите фиктивное пространство имен :

.
ip netns add dummy && ip netns delete dummy

Теперь выберите имя, например foo, создайте пустой файл и измените его режим на 000 (, который не нужен, а имитирует iproute2):

touch /run/netns/foo
chmod 0 /run/netns/foo

И, наконец, смонтировать пространство имен процесса с учетом его PID (, например sleepиз предыдущего :677451):

mount --bind /proc/677451/ns/net /run/netns/foo

Вот именно. Даже если команда sleepзавершится, пространство имен теперь сохранится. Все инструменты iproute2 теперь будут называть его foo .Например, если к нему подключен интерфейс veth , ip linkзаменит номер ссылки nsid на foo.

Если вы хотите удалить это сетевое пространство имен, ip netns del fooтеперь сделает это (предостережение :как обычно, фактическое сетевое пространство имен действительно исчезнет, ​​когда его больше не будет использовать ресурс, как эта команда сна ).

Дополнительная документация по iproute2 специфическим дополнительным функциям вдоль сетевых пространств имен в другом моем ответе .

1
19.04.2021, 16:22

Теги

Похожие вопросы