Network Namespace (Сетевой неймспейс)

⌘K

Network Namespace (Сетевой неймспейс)

Network namespace в Linux — это отдельная «копия» сетевого стека для группы процессов. У каждого неймспейса — свои интерфейсы, свои IP-адреса и маршруты, свой ARP/ND-кэш, свои правила firewall и conntrack, свой lo (loopback). Процессы из разных неймспейсов сетевыми средствами друг друга не видят, пока вы их специально не соедините.

Зачем используется

  • Контейнеры и оркестрация. Docker по умолчанию создаёт отдельный netns для контейнера; в Kubernetes все контейнеры пода делят один netns (общий IP).
  • Изоляция и многотенантность. Разделение тестовых/продовых сред, клиентов, сервисов на одном хосте.
  • Лаборатории и отладка. Можно «нарисовать» мини-сеть на одной машине и воспроизводить сложные сценарии.

Как связывают неймспейсы

  • Через veth-пары: создаёте виртуальный «провод» из двух концов и переносите один конец в другой netns.
  • Через мост (linux bridge/OVS): несколько netns подключают к одному L2-сегменту.
  • Через macvlan/ipvlan: дают «собственный MAC/IP» поверх физического интерфейса без софта-моста.
  • Через маршрутизацию/NAT на хосте: чтобы дать интернет внутрь изолированной сети.

Короткий практический пример

# создать два netns
ip netns add red
ip netns add blue

# сделать veth-пару и разнести по netns
ip link add veth-red type veth peer name veth-blue
ip link set veth-red netns red
ip link set veth-blue netns blue

# поднять интерфейсы и проставить адреса
ip -n red  link set lo up
ip -n blue link set lo up
ip -n red  addr add 10.10.0.1/24 dev veth-red
ip -n blue addr add 10.10.0.2/24 dev veth-blue
ip -n red  link set veth-red up
ip -n blue link set veth-blue up

# проверить связность
ip netns exec red  ping -c1 10.10.0.2
ip netns exec blue ping -c1 10.10.0.1

Доступ «наружу» (общая идея)

  • Подключите netns к мосту, где есть uplink, или пропустите трафик через хост-роутер с NAT: # на хосте (root netns): включить маршрутизацию и NAT из 10.10.0.0/24 наружу sysctl -w net.ipv4.ip_forward=1 iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
  • Не забудьте MTU/MSS: если внутри есть туннели/оверлеи, уменьшите MTU в netns или включите MSS-clamp.

Полезные приёмы

  • Запуск команды внутри netns: ip netns exec red <команда> (например, tcpdump -i veth-red).
  • Посмотреть, в каком netns живёт процесс: ip netns identify <PID>, войти: nsenter -t <PID> -n.
  • «Привязать» существующий netns к имени: ln -s /proc/<PID>/ns/net /var/run/netns/<name>.
  • Чистка: ip netns del red удаляет netns и все его интерфейсы, которые не вынесены наружу.

Чем отличается от VRF

  • Netns — полностью отдельный стек (интерфейсы, таблицы правил и т. д.).
  • VRF — логические L3-домены внутри одного netns (несколько таблиц маршрутов в общей стековой среде). Их можно комбинировать: VRF внутри каждого netns.

Типичные грабли

  • Забыли поднять lo → сервисы не слушают на 127.0.0.1.
  • Нет маршрута по умолчанию/не настроен DNS внутри netns → «в интернет не выходит».
  • Фильтры на хосте не пропускают трафик из вложенных интерфейсов.
  • Несогласованная MTU по пути → пинги идут, а HTTP/HTTPS «висит».