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 адресов. Чем меньше число после слэша, тем
больше подсеть:
| Префикс | Бит под хосты | Адресов | Пример |
|---|---|---|---|
/8 | 24 | 16 777 216 | 10.0.0.0/8 — весь блок 10.x.x.x |
/16 | 16 | 65 536 | 192.168.0.0/16 — весь блок 192.168.x.x |
/24 | 8 | 256 | 192.168.1.0/24 — всё внутри 192.168.1.x |
/32 | 0 | 1 | 8.8.8.8/32 — один конкретный IP |
Два адреса в каждой подсети заняты служебными и под хосты не выдаются:
- адрес сети — все биты хоста нули (
192.168.1.0для/24), - broadcast — все биты хоста единицы (
192.168.1.255), пакет на него получают все в подсети.
Поэтому в /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):
10.0.0.0/8(всё10.x.x.x),172.16.0.0/12(от172.16.x.xдо172.31.x.x),192.168.0.0/16(всё192.168.x.x).
Дома у тебя серый 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 (пакет только пришёл).
Особые адреса
127.0.0.1— loopback, "я сам". Любые соединения на него не уходят в сеть, обрабатываются локальным стеком.0.0.0.0— "все интерфейсы". Когда сервис говорит "слушаю0.0.0.0:8080", он принимает соединения на всех IP машины.169.254.0.0/16— link-local. Назначается, когда DHCP не ответил (у Windows это знаменитые169.254.x.x"интернета нет").
IPv6
IPv4 кончился, на смену идёт IPv6: 128 бит, ~3.4×10³⁸ адресов. Пишется
шестнадцатеричными группами через ::
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Нули сжимаются: 2001:db8:85a3::8a2e:370:7334 (двойное двоеточие
заменяет любое число нулевых групп, но только один раз в адресе).
Стоит знать наизусть два:
::1— IPv6-loopback (аналог127.0.0.1),fe80::/10— link-local в IPv6.
На сервере IPv6 уже всюду параллельно с IPv4, и иногда сервис ловит соединение по v6, когда ты ждёшь v4. Это потенциальный источник сюрпризов.
Порты
IP-адрес доставляет пакет до машины. Порт доводит его до процесса внутри неё. Порт — 16 бит, от 0 до 65535.
Три условные категории:
| Диапазон | Имя | Кто использует |
|---|---|---|
| 0-1023 | well-known | системные сервисы (HTTP 80, HTTPS 443, SSH 22, DNS 53). На Linux нужен root или CAP_NET_BIND_SERVICE |
| 1024-49151 | registered | назначены IANA конкретным приложениям (PostgreSQL 5432, Redis 6379) |
| 49152-65535 | ephemeral (по 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.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Что такое сокет?
NET-026Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс