Посчитать сеть на бумаге и проверить командой
IPv4-адрес — 32-битное число. Для людей его пишут четырьмя десятичными числами — октетами — по 8 бит, от 0 до 255: 192.168.10.37. Чтобы считать подсети, нужен двоичный вид октета. Веса битов слева направо:
вес бита: 128 64 32 16 8 4 2 1
37 = 0 0 1 0 0 1 0 1 → 32 + 4 + 1
192 = 1 1 0 0 0 0 0 0 → 128 + 64
255 = 1 1 1 1 1 1 1 1 → сумма всех
Перевод в двоичную запись: из числа по очереди вычитаются веса слева направо; если вес помещается — бит 1. Для 37: 128 — нет, 64 — нет, 32 — да (остаток 5), 16 — нет, 8 — нет, 4 — да (остаток 1), 2 — нет, 1 — да. Получаем 00100101.
Адрес состоит из двух частей: номер сети (старшие биты) и номер узла (младшие). Где граница, говорит маска: единицы — сетевая часть, нули — узловая. Число единиц называется префиксом и пишется после косой черты.
| Префикс | Маска | Адресов | Узлов |
|---|---|---|---|
| /24 | 255.255.255.0 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 14 |
| /29 | 255.255.255.248 | 8 | 6 |
| /30 | 255.255.255.252 | 4 | 2 |
| /16 | 255.255.0.0 | 65 536 | 65 534 |
| /8 | 255.0.0.0 | 16 777 216 | 16 777 214 |
Адресов в подсети — 2(32 − префикс). Узлам из них достаются все, кроме двух: первого — адреса сети (все узловые биты 0) и последнего — широковещательного (все 1). Отсюда формула числа узлов: 2n − 2, где n — число узловых битов.
Задача: узел 192.168.10.37/26. В какой он сети, какие адреса в ней доступны?
Проверка утилитой ipcalc (пакет ipcalc) — она показывает и двоичную запись с границей сети:
$ ipcalc 192.168.10.37/26
Address: 192.168.10.37 11000000.10101000.00001010.00 100101
Netmask: 255.255.255.192 = 26 11111111.11111111.11111111.11 000000
Wildcard: 0.0.0.63 00000000.00000000.00000000.00 111111
=>
Network: 192.168.10.0/26 11000000.10101000.00001010.00 000000
HostMin: 192.168.10.1 11000000.10101000.00001010.00 000001
HostMax: 192.168.10.62 11000000.10101000.00001010.00 111110
Broadcast: 192.168.10.63 11000000.10101000.00001010.00 111111
Hosts/Net: 62 Class C, Private Internet
Пробел в двоичной записи — граница префикса. Адрес сети получается логическим «И» адреса и маски: где в маске 0, бит обнуляется. Тот же способ работает, когда граница в третьем октете:
$ ipcalc 172.16.5.4/20
Address: 172.16.5.4 10101100.00010000.0000 0101.00000100
Netmask: 255.255.240.0 = 20 11111111.11111111.1111 0000.00000000
=>
Network: 172.16.0.0/20 10101100.00010000.0000 0000.00000000
HostMin: 172.16.0.1 10101100.00010000.0000 0000.00000001
HostMax: 172.16.15.254 10101100.00010000.0000 1111.11111110
Broadcast: 172.16.15.255 10101100.00010000.0000 1111.11111111
Hosts/Net: 4094 Class B, Private Internet
Блок в третьем октете — 256 − 240 = 16: сети 172.16.0.0, 172.16.16.0, 172.16.32.0… Адрес 172.16.5.4 — в первой, последний адрес — 172.16.15.255.
Офису выдана сеть 192.168.10.0/24. Нужно четыре одинаковые подсети — для четырёх отделов. Четыре = 22, значит, у узловой части забираем 2 бита: префикс /24 + 2 = /26, по 62 узла в каждой.
| Подсеть | Сеть | Узлы | Широковещательный |
|---|---|---|---|
| 1 | 192.168.10.0/26 | .1 – .62 | .63 |
| 2 | 192.168.10.64/26 | .65 – .126 | .127 |
| 3 | 192.168.10.128/26 | .129 – .190 | .191 |
| 4 | 192.168.10.192/26 | .193 – .254 | .255 |
На практике отделы разного размера, и одинаковые подсети расходуют адреса впустую. Подсети переменной длины (VLSM) режут блоки по потребности: сначала выделяют самую большую, затем следующие из оставшегося места. Для отделов на 50, 20 и 10 узлов:
$ ipcalc -s 50 20 10 192.168.10.0/24
...
1. Requested size: 50 hosts
Network: 192.168.10.0/26 ...
Hosts/Net: 62
2. Requested size: 20 hosts
Network: 192.168.10.64/27 ...
Hosts/Net: 30
3. Requested size: 10 hosts
Network: 192.168.10.96/28 ...
Hosts/Net: 14
Needed size: 112 addresses.
Used network: 192.168.10.0/25
Unused:
192.168.10.112/28
192.168.10.128/25
Каждая подсеть — наименьшая степень двойки, вмещающая нужное число узлов плюс 2 служебных адреса. Свободный остаток — резерв на рост и новые сети. Закладывайте запас: отдел на 30 человек через год станет отделом на 40, и /27 перестанет хватать.
Публичные адреса IPv4 давно закончились, поэтому внутри организаций используют частные диапазоны (RFC 1918). Они не маршрутизируются в интернете; выход наружу — через NAT (модуль 04).
| Диапазон | Назначение |
|---|---|
10.0.0.0/8 | Частные: крупные сети, облака |
172.16.0.0/12 | Частные: 172.16.0.0 – 172.31.255.255; сети Docker по умолчанию |
192.168.0.0/16 | Частные: дом, малый офис |
127.0.0.0/8 | Петлевые: сама машина, обычно 127.0.0.1 |
169.254.0.0/16 | Самоназначенный адрес: узел не получил адрес по DHCP — признак проблемы |
100.64.0.0/10 | Адреса провайдерского NAT (CGNAT): у вас не «белый» адрес |
0.0.0.0 | «Любой адрес» в настройках служб; «маршрут по умолчанию» как 0.0.0.0/0 |
255.255.255.255 | Широковещательный в текущей сети |
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 | Для документации и примеров — их используем в лабораторных |
Классы сетей A, B, C (их показывает ipcalc) — устаревшая схема, отменённая в 1993 году вместе с переходом на CIDR. В расчётах опирайтесь только на префикс.
Для связи двух маршрутизаторов нужны всего два адреса; раньше брали /30 (4 адреса, 2 узла), сейчас всё чаще /31 — по RFC 3021 у такой сети нет адреса сети и широковещательного, оба адреса — узлы. /32 — один адрес, так задают адреса на петлевых интерфейсах и в правилах межсетевых экранов.
Адрес назначается интерфейсу с префиксом — по нему ядро само добавляет маршрут в свою сеть:
$ ip -br addr show ens18
ens18 UP 192.168.116.34/24 fe80::b641:8f47:5a50:a157/64
$ ip route | grep -v default
192.168.116.0/24 dev ens18 proto dhcp scope link src 192.168.116.34 metric 1002
Добавить адрес временно (до перезагрузки) — sudo ip addr add 192.168.116.50/24 dev ens18, удалить — ip addr del. Постоянная настройка в Debian — в /etc/network/interfaces:
auto ens18
iface ens18 inet static
address 192.168.116.50/24
gateway 192.168.116.1
Ошибка в префиксе — частая причина «странной» сети: с маской /16 вместо /24 компьютер будет искать по ARP соседей, которые на самом деле за маршрутизатором, и не дойдёт до них.