Network Namespace

Support HackTricks

Basic Information

Простір мережі — це функція ядра Linux, яка забезпечує ізоляцію мережевого стеку, дозволяючи кожному простору мережі мати свою власну незалежну мережеву конфігурацію, інтерфейси, IP-адреси, таблиці маршрутизації та правила брандмауера. Ця ізоляція корисна в різних сценаріях, таких як контейнеризація, де кожен контейнер повинен мати свою власну мережеву конфігурацію, незалежну від інших контейнерів і хост-системи.

How it works:

  1. Коли створюється новий простір мережі, він починає з повністю ізольованого мережевого стеку, з жодними мережевими інтерфейсами, окрім інтерфейсу циклічного з'єднання (lo). Це означає, що процеси, що виконуються в новому просторі мережі, не можуть за замовчуванням спілкуватися з процесами в інших просторах або з хост-системою.

  2. Віртуальні мережеві інтерфейси, такі як пари veth, можуть бути створені та переміщені між просторами мережі. Це дозволяє встановлювати мережеву зв'язність між просторами або між простором і хост-системою. Наприклад, один кінець пари veth може бути розміщений у просторі мережі контейнера, а інший кінець може бути підключений до мосту або іншого мережевого інтерфейсу в просторі хоста, забезпечуючи мережеву зв'язність для контейнера.

  3. Мережеві інтерфейси в межах простору можуть мати свої власні IP-адреси, таблиці маршрутизації та правила брандмауера, незалежно від інших просторів. Це дозволяє процесам в різних просторах мережі мати різні мережеві конфігурації та працювати так, ніби вони виконуються на окремих мережевих системах.

  4. Процеси можуть переміщатися між просторами, використовуючи системний виклик setns(), або створювати нові простори, використовуючи системні виклики unshare() або clone() з прапором CLONE_NEWNET. Коли процес переміщується в новий простір або створює його, він почне використовувати мережеву конфігурацію та інтерфейси, пов'язані з цим простором.

Lab:

Create different Namespaces

CLI

sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a

Монтування нової інстанції файлової системи /proc, якщо ви використовуєте параметр --mount-proc, забезпечує, що новий простір монтування має точний та ізольований вигляд інформації про процеси, специфічної для цього простору.

Помилка: bash: fork: Не вдається виділити пам'ять

Коли unshare виконується без параметра -f, виникає помилка через те, як Linux обробляє нові PID (ідентифікатори процесів) простори. Основні деталі та рішення наведені нижче:

  1. Пояснення проблеми:

  • Ядро Linux дозволяє процесу створювати нові простори за допомогою системного виклику unshare. Однак процес, який ініціює створення нового PID простору (який називається "процесом unshare"), не входить до нового простору; лише його дочірні процеси входять.

  • Виконання %unshare -p /bin/bash% запускає /bin/bash в тому ж процесі, що й unshare. Відповідно, /bin/bash та його дочірні процеси знаходяться в оригінальному PID просторі.

  • Перший дочірній процес /bin/bash у новому просторі стає PID 1. Коли цей процес завершується, це викликає очищення простору, якщо немає інших процесів, оскільки PID 1 має особливу роль усиновлення сирітських процесів. Ядро Linux тоді вимкне виділення PID у цьому просторі.

  1. Наслідок:

  • Завершення PID 1 у новому просторі призводить до очищення прапора PIDNS_HASH_ADDING. Це призводить до того, що функція alloc_pid не може виділити новий PID при створенні нового процесу, що викликає помилку "Не вдається виділити пам'ять".

  1. Рішення:

  • Проблему можна вирішити, використовуючи параметр -f з unshare. Цей параметр змушує unshare створити новий процес після створення нового PID простору.

  • Виконання %unshare -fp /bin/bash% забезпечує, що команда unshare сама стає PID 1 у новому просторі. /bin/bash та його дочірні процеси тоді безпечно містяться в цьому новому просторі, запобігаючи передчасному завершенню PID 1 та дозволяючи нормальне виділення PID.

Забезпечуючи, що unshare виконується з прапором -f, новий PID простір правильно підтримується, що дозволяє /bin/bash та його підпроцесам працювати без виникнення помилки виділення пам'яті.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a

Перевірте, в якому просторі імен знаходиться ваш процес

ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr  4 20:30 /proc/self/ns/net -> 'net:[4026531840]'

Знайти всі мережеві простори

sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name net -exec ls -l  {} \; 2>/dev/null | grep <ns-number>

Увійти в мережевий простір імен

nsenter -n TARGET_PID --pid /bin/bash

Також ви можете увійти в інший просторовий простір процесів лише якщо ви root. І ви не можете увійти в інший просторовий простір без дескриптора, що вказує на нього (наприклад, /proc/self/ns/net).

References

Support HackTricks

Last updated