Перейти к содержанию

2. IP-сети и маршрутизация


IPv4/IPv6, CIDR и подсети, частные/публичные адреса, NAT, таблица маршрутизации и статическая маршрутизация + практические кейсы «трафик не ходит».


IPv4 и IPv6

IPv4

IPv4 — адрес из 32 бит, записывается как четыре октета в десятичном виде (например, 192.168.1.10). Исчерпание пула адресов привело к появлению IPv6 и повсеместному использованию NAT.

IPv6

IPv6 — адрес из 128 бит, записывается в hex группами по 16 бит (например, 2001:db8::1). Огромное адресное пространство, встроенная поддержка автоконфигурации и отсутствие необходимости в NAT «из коробки». В инфраструктуре часто сосуществует с IPv4 (dual-stack).


CIDR и подсети (subnetting)

CIDR

CIDR (Classless Inter-Domain Routing) — запись подсети в виде префикса/длины маски: 192.168.1.0/24. Число после слэша — количество бит, общих для всех адресов подсети (сетевой префикс). Остальные биты — адреса хостов внутри подсети.

  • /24 — 24 бита сети, 8 бит хоста → 2⁸ = 256 адресов (обычно 254 для хостов, один адрес сети и один broadcast).
  • /16 — 65536 адресов.
  • /30 — 4 адреса (часто используется для point-to-point линков: 2 хоста + сеть + broadcast).

Подсети вручную

Уметь посчитать:

  • Сколько адресов в подсети: 2^(32 − длина_префикса). Для /24 → 256.
  • Диапазон адресов: взять IP подсети, обнулить биты хоста — получится адрес сети; включить все биты хоста — broadcast. Например, 10.0.1.0/24: сеть 10.0.1.0, broadcast 10.0.1.255, хосты 10.0.1.110.0.1.254.
  • Разбить сеть на подсети: удлинить префикс (например, из /24 сделать два /25 или четыре /26).

!!! example "Пример"

`192.168.0.0/24` — одна подсеть на 256 адресов. `192.168.0.0/25` и `192.168.0.128/25` — две подсети по 128 адресов каждая.

Частные и публичные IP

Частные (Private) диапазоны

Не маршрутизируются в глобальном интернете; используются внутри сетей и за NAT:

  • 10.0.0.0/8 — один класс A (часто разбивают на подсети).
  • 172.16.0.0/12 — диапазон 172.16.0.0–172.31.255.255.
  • 192.168.0.0/16 — типичные домашние и офисные сети.

Публичные (Public) IP

Глобально уникальные, маршрутизируются в интернете. Доступ к интернету с частного адреса возможен только через NAT (подмена исходящего адреса на публичный на границе сети).


NAT: SNAT, DNAT, PAT

NAT (Network Address Translation) — преобразование адресов (и часто портов) между разными средами.

Тип Назначение Пример
SNAT (Source NAT) Подменить источник пакета (исходящий трафик «изнутри» сети). Ответы возвращаются на устройство с NAT, которое подменяет обратно адрес назначения. Выход в интернет с частного IP: исходящий пакет уходит с публичного IP шлюза.
DNAT (Destination NAT) Подменить адрес назначения (проброс на внутренний хост). Порт 80 на роутере перенаправляется на 192.168.1.10:80.
PAT (Port Address Translation, NAPT) Один публичный IP, много внутренних хостов — различение по порту. Исходящие соединения помечаются разными портами, таблица NAT хранит соответствие (внутренний IP:порт ↔ внешний IP:порт). Домашний роутер: все устройства выходят в интернет через один внешний IP.

В Kubernetes и Docker: исходящий трафик подов/контейнеров часто выходит через SNAT на IP узла; входящий трафик к Service — через DNAT (kube-proxy или CNI) на IP пода.


CGNAT в облаках

CGNAT (Carrier-Grade NAT) — NAT на стороне провайдера или облака, когда даже «внешний» адрес клиента не уникален в интернете (общий пул адресов провайдера). Несколько уровней NAT усложняют отладку (видимость «настоящего» источника) и могут ломать протоколы, завязанные на прямой адрес (например, часть VoIP). В облаках выход в интернет с инстансов часто идёт через SNAT в VPC; для входящего доступа из интернета нужен выделенный (эластичный) публичный IP или балансировщик.


Маршрутизация (routing)

Таблица маршрутизации

Таблица маршрутизации определяет, куда отправить пакет по адресу назначения: каждая запись — префикс (сеть/маска) и next hop (следующий прыжок — IP или интерфейс). Ядро выбирает наиболее специфичный маршрут (длиннейший префикс).

Default route (маршрут по умолчанию)

Default route — запись с префиксом 0.0.0.0/0 (IPv4) или ::/0 (IPv6). Все пакеты, не попавшие в более специфичные маршруты, отправляются на указанный шлюз. Типичная конфигурация клиента: одна подсеть «напрямую» (link) и один default через шлюз.

Статическая маршрутизация

Статическая маршрутизация — маршруты заданы вручную (файлы конфигурации или команды ip route). Не масштабируется на больших сетях; используется в простых топологиях, на границах и для служебных сетей (например, подсеть подов в Kubernetes).

ECMP (Equal-Cost Multi-Path)

ECMP — если до одной и той же сети есть несколько маршрутов с одинаковой «стоимостью», ядро может распределять трафик по ним (балансировка на уровне L3). Понимание на уровне идеи: несколько путей с одинаковой метрикой → трафик может идти по разным next hop.


Практика: команды

Адреса и маршруты

# Назначенные адреса на интерфейсах
ip addr
# или кратко
ip -br addr

# Таблица маршрутизации
ip route
# или
ip route show

# Добавить default route (пример)
sudo ip route add default via 192.168.1.1 dev eth0

# Удалить маршрут
sudo ip route del 10.0.0.0/8 via 192.168.1.1

Трассировка пути

# Маршрут до хоста (ICMP или UDP по умолчанию)
traceroute 8.8.8.8

# Современный вариант (Linux)
tracepath 8.8.8.8

!!! tip "Практика"

При «трафик не ходит» проверять по порядку: линк (`ip link`), адрес (`ip addr`), маршрут до цели (`ip route get <IP>`), доступность шлюза (ping), затем traceroute до цели.

Почему под в Kubernetes недоступен извне без Service / Ingress

Под получает частный IP из подсети подов (например, из диапазона CNI). Эта подсеть:

  • Не маршрутизируется извне кластера (или маршрутизируется только внутри инфраструктуры датацентра).
  • Даже при маршрутизации IP пода нестабилен: под может пересоздаться и получить другой IP.

Service даёт стабильный виртуальный IP (ClusterIP) и имя DNS внутри кластера; kube-proxy или CNI делают DNAT с ClusterIP на IP пода. Доступ извне кластера обычно не идёт напрямую на ClusterIP (он «внутренний»).

Ingress (или LoadBalancer/NodePort) — точка входа извне: трафик приходит на внешний адрес/порт, затем балансировщик или Ingress-контроллер выполняет маршрутизацию и DNAT до соответствующего Service и далее до пода. Без Service и без Ingress (или NodePort/LoadBalancer) у внешнего клиента нет ни стабильного адреса, ни правил, куда слать трафик к поду.

!!! example "Кратко"

Под — это частный, нестабильный IP внутри кластера. Service и Ingress дают стабильную точку входа и преобразование адресов (NAT), без них «снаружи» до пода не достучаться.

Паттерны и антипаттерны

Паттерн Описание
Диагностика по цепочке: линк → адрес → маршрут → шлюз Последовательно исключать L2, L3 и доступность next hop.
Знать свою подсеть и default route Понимать, куда уйдёт трафик по умолчанию и не блокирует ли firewall маршрут.
Использовать ip route get <IP> Показать, какой именно маршрут и интерфейс выберет ядро для данного адреса.
Антипаттерн Почему плохо Что делать
Ожидать доступ к поду по его IP извне IP пода частный и нестабильный. Использовать Service и Ingress (или NodePort/LoadBalancer) для входящего трафика.
Путать SNAT и DNAT Неверная диагностика проблем доступа. SNAT — «кто вышел», DNAT — «куда пришло»; при отладке смотреть направление трафика.

Дополнительные материалы