← Сеть: основы
16 мин · просто · Урок 2 из 13

IP-адреса и порты

Что такое IP и маска подсети, белые и серые адреса, NAT (SNAT/DNAT), зачем порты и почему 80 и 443 особые.

IPv4 в двух словах

IPv4-адрес — это 32 бита, обычно записанные четырьмя октетами через точку: 192.168.1.42. Каждый октет от 0 до 255.

Адресов всего ~4.3 миллиарда, и они давно кончились. Поэтому половина адресов в мире сейчас приватные (см. ниже) и сидят за NAT.

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

32 бита адреса делятся на две части: адрес сети (старшие биты, общие у всех в подсети) и адрес хоста (младшие биты, у каждой машины свои). Маска говорит, где проходит граница.

После адреса часто идёт /24, /16, /8. Это и есть маска в формате CIDR: сколько старших битов отданы под сеть.

/24 значит "24 старших бита отданы под сеть, оставшиеся 8 под хосты". 8 бит на хосты дают 2^8 = 256 адресов. Чем меньше число после слэша, тем больше подсеть:

ПрефиксБит под хостыАдресовПример
/82416 777 21610.0.0.0/8 — весь блок 10.x.x.x
/161665 536192.168.0.0/16 — весь блок 192.168.x.x
/248256192.168.1.0/24 — всё внутри 192.168.1.x
/32018.8.8.8/32 — один конкретный IP

Два адреса в каждой подсети заняты служебными и под хосты не выдаются:

Поэтому в /24 под реальные машины остаётся не 256, а 254 адреса.

Зачем это машине

Когда хост хочет отправить пакет, он сравнивает адрес сети получателя со своим. Это делается побитовым AND адреса и маски:

мой адрес:   192.168.1.42  /24  -> сеть 192.168.1.0
получатель:  192.168.1.99  /24  -> сеть 192.168.1.0   совпало
получатель:  8.8.8.8       /24  -> сеть 8.8.8.0        не совпало

Сеть совпала, значит "сосед", говорю напрямую через свитч. Не совпала, значит "это наружу", отправляю на шлюз (роутер), пусть он разбирается дальше.

Белые и серые IP

Белый (публичный) адрес виден из интернета и уникален на всю планету. По нему к тебе можно достучаться снаружи. Такие адреса выдаёт провайдер, они стоят денег и их мало (см. выше: IPv4 кончились).

Серый (приватный) адрес работает только внутри локальной сети, в интернет не маршрутизируется. Под серые адреса зарезервированы три блока (RFC 1918):

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

В облаке машины в VPC тоже сидят на серых 10.x или 172.16.x, а белый адрес навешивается отдельно, когда нужен доступ снаружи. Это норма.

NAT: SNAT, DNAT, MASQUERADE

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

SNAT (source NAT) — подмена адреса отправителя. Твой пакет уходит с 192.168.0.42, роутер переписывает источник на свой белый адрес и запоминает, кому вернуть ответ. Это исходящий трафик "из локалки в интернет".

MASQUERADE — тот же SNAT, но когда белый адрес роутера динамический (провайдер выдаёт по DHCP). Роутер не зашивает адрес в правило, а берёт текущий адрес интерфейса. На домашних роутерах работает именно он.

PAT / overload — SNAT с учётом портов (термины пришли из Cisco; в Linux это режим MASQUERADE/SNAT). За одним белым адресом сидят сотни устройств, роутер разводит их соединения по разным исходящим портам. То, что делает любой домашний роутер: много серых -> один белый.

DNAT (destination NAT) — подмена адреса получателя. Пакет пришёл на белый адрес и порт роутера, роутер переписывает назначение на серый адрес внутренней машины. Это проброс портов: снаружи стучатся на белый_ip:443, внутри попадают на 192.168.0.10:443.

Память: SNAT/MASQUERADE выпускают наружу, DNAT впускает внутрь.

На Linux всё это живёт в таблице nat (iptables/nftables): SNAT вешается в цепочку POSTROUTING (пакет уже уходит), а DNAT в PREROUTING (пакет только пришёл).

Особые адреса

IPv6

IPv4 кончился, на смену идёт IPv6: 128 бит, ~3.4×10³⁸ адресов. Пишется шестнадцатеричными группами через ::

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Нули сжимаются: 2001:db8:85a3::8a2e:370:7334 (двойное двоеточие заменяет любое число нулевых групп, но только один раз в адресе).

Стоит знать наизусть два:

На сервере IPv6 уже всюду параллельно с IPv4, и иногда сервис ловит соединение по v6, когда ты ждёшь v4. Это потенциальный источник сюрпризов.

Порты

IP-адрес доставляет пакет до машины. Порт доводит его до процесса внутри неё. Порт — 16 бит, от 0 до 65535.

Три условные категории:

ДиапазонИмяКто использует
0-1023well-knownсистемные сервисы (HTTP 80, HTTPS 443, SSH 22, DNS 53). На Linux нужен root или CAP_NET_BIND_SERVICE
1024-49151registeredназначены IANA конкретным приложениям (PostgreSQL 5432, Redis 6379)
49152-65535ephemeral (по IANA)временные, ОС выдаёт исходящим соединениям

На Linux реальный диапазон ephemeral другой: 32768-60999, смотрится в /proc/sys/net/ipv4/ip_local_port_range. На macOS/BSD это 49152-65535. Это иногда важно: сервис, забиндившийся на 40000, на Linux может конфликтнуть с исходящим соединением.

Когда твой браузер открывает https://google.com:443, в его исходящем запросе порт назначения 443, а исходный порт берётся из ephemeral-диапазона, скажем 54321. Сервер отвечает в обратную сторону: 443 -> 54321.

Что значит "слушает 0.0.0.0:8080"

0.0.0.0 = все локальные IP. То есть сервис принимает соединения и с самой машины, и из локальной сети, и из интернета (если фаервол пропускает).

Альтернатива: 127.0.0.1:8080, доступ только с самой машины. Полезно для сервисов, которые не должны торчать наружу: внутренние API, отладка, прокси к БД.

ss -tulnp показывает, кто что слушает и на каких адресах. Тот же вывод даёт netstat -tulnp, но netstat живёт в пакете net-tools, а его не ставят по умолчанию в свежих дистрибутивах, так что рассчитывай на ss.

Ловушка: 127.0.0.1 в Docker-контейнере

Часто новички ловятся: внутри контейнера сервис слушает 127.0.0.1:8080, а из другого контейнера или с хоста он недоступен.

Причина: 127.0.0.1 в контейнере — это сам контейнер, не хост и не другой контейнер. Сетевой стек у контейнера свой. Чтобы был доступ снаружи, нужно слушать 0.0.0.0:8080.

Эту же ошибку легко повторить с базой данных в Docker Compose, которая слушает 127.0.0.1 и удивляется, что соседний сервис не подключается.

Что важно запомнить

IPv4: 4 октета. Маска (/24) делит адрес на сеть и хост; через AND хост решает "сосед или через шлюз".

Белый IP уникален и виден из интернета, серый работает только внутри локалки. Три серых блока: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.

NAT: SNAT/MASQUERADE подменяют источник (выход наружу), DNAT подменяет назначение (проброс портов внутрь).

127.0.0.1 — я сам. 0.0.0.0 — все интерфейсы.

Порты: well-known (0-1023), ephemeral (временные исходящие).

В контейнере 127.0.0.1 — это контейнер, не хост. Слушай 0.0.0.0.

В следующем уроке разберём DNS: как имя превращается в IP.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Что такое сокет?

NET-026

Прошли материал до конца? Отметьте урок пройденным.