Networking

Маска подсети и CIDR

Маска подсети делит IP-адрес на номер сети и номер хоста, а CIDR записывает её коротким префиксом вида /24.

Что такое Маска подсети и CIDR

Маска подсети — 32-битное число, которое показывает, какая часть IP-адреса обозначает сеть, а какая — конкретный хост в ней. Подсеть (subnet) — сам этот диапазон адресов с общим началом. «Маска сети» и «маска подсети» — одно и то же.

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

Зачем это нужно: получив пакет, узел сравнивает адрес назначения со своей подсетью. Совпало — отправляет напрямую в локальный сегмент. Не совпало — отдаёт шлюзу. Маска и есть правило, по которому принимается это решение.

Как маска делит адрес

IP:     192.168.  1.  10   →  11000000 10101000 00000001 00001010
Маска:  255.255.255.  0    →  11111111 11111111 11111111 00000000
                              └────── сеть (24 бита) ─────┘└ хост ┘

Адрес сети:      192.168.1.0
Broadcast:       192.168.1.255
Хосты:           192.168.1.1 – 192.168.1.254

Единицы в маске всегда идут подряд слева — «дырявых» масок не бывает. Отсюда и работает CIDR-запись: достаточно назвать их количество.

Таблица префиксов

CIDR Маска Всего адресов Полезных хостов
/16 255.255.0.0 65 536 65 534
/20 255.255.240.0 4096 4094
/24 255.255.255.0 256 254
/25 255.255.255.128 128 126
/26 255.255.255.192 64 62
/28 255.255.255.240 16 14
/30 255.255.255.252 4 2
/32 255.255.255.255 1 1 (один хост)

Два адреса всегда «съедаются»: первый — адрес самой сети, последний — broadcast. Поэтому в /24 не 256 хостов, а 254. Исключения — /31 для линков точка-точка (RFC 3021) и /32 для одиночного адреса в правилах файрвола и маршрутах.

Число адресов считается как 2^(32 − префикс). Каждый лишний бит в маске делит сеть пополам: /24 — это две /25, четыре /26 и так далее.

Практика

$ ip addr show eth0
    inet 10.0.1.15/24 brd 10.0.1.255 scope global eth0

$ ipcalc 10.0.1.15/24
Address:   10.0.1.15
Network:   10.0.1.0/24
HostMin:   10.0.1.1
HostMax:   10.0.1.254
Broadcast: 10.0.1.255
Hosts/Net: 254

$ ip route
default via 10.0.1.1 dev eth0
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.15

Маршрут default — куда слать всё, что не попало в известные подсети. Вторая строка — та самая локальная подсеть, внутрь которой пакеты идут напрямую.

Префиксы встречаются везде, где нужно задать диапазон: в правилах iptables/UFW, в security groups, в allow/deny nginx. 0.0.0.0/0 означает «любой адрес» — маска нулевой длины совпадает с чем угодно.

Приватные диапазоны и планирование сети

RFC 1918 закрепил три блока, которые не маршрутизируются в интернете и предназначены для внутренних сетей:

  • 10.0.0.0/8 — 16,7 млн адресов, обычная основа для облачной VPC
  • 172.16.0.0/12 — 1 млн адресов, диапазон по умолчанию у Docker
  • 192.168.0.0/16 — 65 тысяч, домашние и офисные сети

Наружу такие адреса выходят через NAT. При проектировании VPC берите с запасом (10.0.0.0/16) и режьте на подсети по зонам и ролям: 10.0.1.0/24 — публичные веб-серверы, 10.0.2.0/24 — база, 10.0.3.0/24GPU-узлы. Расширить сеть позже почти всегда больно, а пересечение диапазонов с офисом сделает VPN-связность невозможной — маршрутизатор просто не поймёт, куда слать пакет.

Связанные термины

  • IP-адрес — то, что маска делит на сеть и хост
  • IPv4 и IPv6 — в IPv6 стандартный префикс подсети /64
  • NAT — выпускает приватные подсети в интернет
  • VPC — облачная сеть, которую вы режете на подсети
  • DHCP — раздаёт адреса внутри подсети
  • iptables / UFW — правила пишутся в CIDR-нотации

Готовы запустить GPU-задачу?

Запустить GPU-сервер