# Subnetting и CIDR _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** CIDR /N показывает сколько бит из 32 (или 128 для IPv6) - это сеть. /24 = 256 адресов, /30 = 4 (p2p), /16 = 65536. Хост в подсети может напрямую общаться только с хостами с тем же prefix'ом. ## Зачем подсети В IPv4 32-битный адрес, в IPv6 - 128 бит. Сеть делится на блоки (**подсети**) чтобы: - изолировать broadcast-домен ([broadcast-domain](/kb/broadcast-domain.md)) - управлять маршрутизацией (агрегация маршрутов) - применять security-политики (firewall на границе подсети) - выделить адреса разным организациям/отделам ## Биты и адреса Адрес делится на две части: **network prefix** + **host part**. Пример `192.168.1.42/24`: - `/24` = первые 24 бита = network = `192.168.1.0` - оставшиеся 8 бит = host = `42` ``` 192.168.1.42 → 11000000.10101000.00000001.00101010 /24 mask 11111111.11111111.11111111.00000000 network 11000000.10101000.00000001.00000000 = 192.168.1.0 host 00101010 = 42 ``` ## Типичные размеры | CIDR | Маска | Адресов | Юзабельных | Применение | |------|------------------|---------|------------|------------| | /8 | 255.0.0.0 | 16M | 16M-2 | большая корп., публичный блок | | /16 | 255.255.0.0 | 65 536 | 65 534 | дата-центр, VPN | | /24 | 255.255.255.0 | 256 | 254 | стандартная LAN | | /29 | 255.255.255.248 | 8 | 6 | малый офис / пара серверов | | /30 | 255.255.255.252 | 4 | 2 | point-to-point ссылки | | /31 | 255.255.255.254 | 2 | 2 | p2p (RFC 3021, без брода) | | /32 | 255.255.255.255 | 1 | 1 | host-route, loopback | «-2» в столбце usable - один адрес уходит на network address (все host-биты в 0), один на broadcast (все в 1). ## Зачем -2 (network + broadcast) Network address (`192.168.1.0`) - идентификатор подсети, никому не присваивается. Broadcast address (`192.168.1.255`) - адрес «всем в подсети», тоже не присваивается. Из 256 адресов в /24 у хостов 254 (`.1` - `.254`). Обычно `.1` = шлюз, `.255` = broadcast. ## Один префикс - один L2-сегмент Хосты с одним [[ipv4-addressing|IP-prefix'ом]] **могут общаться на L2 напрямую** (через [[arp|ARP]]). Хосты с разными префиксами **обязаны** идти через [[default-gateway|шлюз]] - даже если физически в одном кабеле. Это часто источник «магических» багов: два хоста в `192.168.1.0/24` и `192.168.1.128/25` физически в одной сети, но хост `.50` (в /24) считает что `.200` в той же подсети, а у `.200` (в /25) другая network-mask - не общаются. ## VLSM - переменные подсети Раньше (classful) сети были фиксированы: A=/8, B=/16, C=/24. **VLSM** (Variable Length Subnet Mask) и CIDR разрешают любую длину. Пример: дали тебе `10.0.0.0/16` - 65 536 адресов. Делишь: - `10.0.0.0/24` - офис 1 (254 хоста) - `10.0.1.0/24` - офис 2 - `10.0.10.0/24` - DMZ - `10.0.20.0/24` - VPN-pool - `10.0.100.0/30` - p2p ссылка к провайдеру 1 - `10.0.100.4/30` - p2p ссылка к провайдеру 2 Все эти подсети суммируются в `10.0.0.0/16` для внешнего объявления (один маршрут вместо 6). ## Как посчитать в голове Маска `/N` означает что **(32-N) хост-битов** = `2^(32-N)` адресов. | /N | хост-битов | адресов | юзабельно | |-----|------------|---------|-----------| | /30 | 2 | 4 | 2 | | /29 | 3 | 8 | 6 | | /28 | 4 | 16 | 14 | | /27 | 5 | 32 | 30 | | /26 | 6 | 64 | 62 | | /25 | 7 | 128 | 126 | | /24 | 8 | 256 | 254 | Для /N где (32-N) % 8 != 0 (например /27) - последний октет шага 256 / 2^(32-N) = `256 / 32 = 8`: подсети /27 идут шагами по 8: `.0`, `.32`, `.64`, `.96`, `.128`, `.160`, `.192`, `.224`. ## Особые блоки RFC 1918 (приватные) - `10.0.0.0/8` - `172.16.0.0/12` (= 172.16.0.0 - 172.31.255.255) - `192.168.0.0/16` Эти не маршрутизируются в публичный интернет - используются за NAT. Также: - `127.0.0.0/8` - loopback - `169.254.0.0/16` - link-local (когда нет DHCP) - `224.0.0.0/4` - multicast - `100.64.0.0/10` - CGNAT (мобильные операторы) ## IPv6 subnetting Тот же принцип, только биты другие. Стандарт - **/64 на LAN**. Корпорации получают /48, провайдеры дают клиенту /56-/60. Подсети IPv6 не считают хостов - 2^64 заведомо хватит. ## Когда что-то пошло не так - **Не пингуется хост в той же сети** - проверь маски на обоих хостах, могут не совпадать - **«сеть переполнена» в /29** - всего 6 usable, выбери больше: /28 или /27 - **Маршруты дублируются** - посмотри агрегацию: можно объявить /16 вместо 256 /24 - **DHCP-pool заканчивается** - проверь размер подсети (`ipcalc`), возможно /24 мал, нужен /23 ## Команды ```bash ipcalc 192.168.1.42/27 ``` Полный расчёт: network, broadcast, hosts, маска. Удобно для шпаргалки ```bash ip route show ``` Все маршруты с префиксами - сразу видны размеры подсетей ```bash ip -4 addr show ``` Адреса с CIDR-нотацией: 'inet 10.0.0.5/24' = ты в /24 ```bash ip route get 8.8.8.8 ``` Какая запись маршрута выбрана для конкретного destination - longest prefix match ## См. также - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [IPv6 - адресация и базовые концепции](/kb/ipv6-basics.md) - [Default gateway - выход из своей сети](/kb/default-gateway.md) - [Routing table](/kb/routing-table.md) - [Broadcast-домен - что это и кто в нём живёт](/kb/broadcast-domain.md)