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, broadcast10.0.1.255, хосты10.0.1.1–10.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 — «куда пришло»; при отладке смотреть направление трафика. |