Без понимания адресации и стека протоколов любая диагностика сети превращается в гадание. Этот урок дает базу, на которую опирается все остальное в блоке 109: как устроены IPv4 и IPv6 адреса, чем маска и CIDR режут сеть на подсети, почему один пакет идет по UDP, а другой по TCP, как ядро по таблице маршрутизации решает, куда отправить кадр, и где в системе лежат справочники портов и протоколов.

Как это работает
Стек TCP/IP - это четыре уровня, каждый добавляет свой заголовок. Канальный (Ethernet, MAC-адреса) доставляет кадр в пределах одного сегмента. Сетевой (IP) отвечает за адресацию между сетями и маршрутизацию. Транспортный (TCP, UDP) разводит трафик по приложениям через порты. Прикладной (HTTP, DNS, SSH) - это уже сами сервисы. Модель OSI с ее семью уровнями - удобная теория, но в реальном Linux работает именно TCP/IP.
Адрес IPv4 - это 32 бита, записанные как четыре октета (192.168.10.5). Маска делит адрес на две части: сетевую и хостовую. В записи CIDR /24 означает, что первые 24 бита - это номер сети, остальные 8 бит адресуют хосты внутри нее. Маска /24 это тот же 255.255.255.0, просто счет единиц слева. Зная сеть и маску, ядро вычисляет: адрес назначения в моей подсети - отдаю напрямую через канальный уровень, нет - отправляю на шлюз.
В каждой подсети два адреса служебные и хостам не выдаются. Адрес сети (все хостовые биты в нуле, например 192.168.10.0/24) - это идентификатор подсети. Broadcast (все хостовые биты в единице, 192.168.10.255) - широковещание на всех в сегменте. Для /24 это дает 254 рабочих адреса. Частные диапазоны (RFC 1918) не маршрутизируются в интернет: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. Отдельно стоит APIPA 169.254.0.0/16 - его хост назначает себе сам, когда DHCP недоступен.
IPv6 - это 128 бит, восемь групп по 16 бит в шестнадцатеричной записи. Чтобы не писать простыни, действуют два правила сокращения: ведущие нули в группе опускаются, а одна самая длинная цепочка нулевых групп заменяется на двойное двоеточие, причем такое сжатие допустимо только один раз в адресе. Адреса link-local начинаются с fe80::/10, существуют только в пределах сегмента и обязательны на каждом интерфейсе. Глобальные адреса начинаются с 2000::/3.
Транспорт. TCP - соединение с гарантией: тройное рукопожатие (SYN, SYN-ACK, ACK), нумерация, подтверждения, повторная отправка потерянного. Это HTTP, SSH, SMTP - там, где важна целостность. UDP - без соединения и гарантий, зато быстро и дешево по накладным: DNS, DHCP, VoIP, NTP. ICMP вообще не транспорт для приложений - это служебные сообщения сетевого уровня (ping, недостижимость хоста, превышение TTL для traceroute). Порт TCP 80 и порт UDP 80 - это две разные сущности.
Порт - это 16-битное число, отделяющее одно соединение от другого на хосте. Диапазон 0-1023 - привилегированные порты (нужны права root для bind). Соответствия имя-порт лежат в /etc/services, а номера протоколов сетевого уровня - в /etc/protocols. Эти файлы - локальные справочники для утилит, менять реальное поведение сервиса они не обязаны.
Команды и примеры
Современный инструмент - пакет iproute2 (команда ip). Устаревшие ifconfig, route, netstat в 2026 не ставятся по умолчанию.
Код: Выделить всё
ip addr show # адреса на интерфейсах
ip -br addr # краткий вид, по строке на интерфейс
ip route show # таблица маршрутизации
ip -6 route show # маршруты IPv6
ip route get 8.8.8.8 # какой маршрут выберет ядро для адреса
Код: Выделить всё
default via 192.168.10.1 dev eth0 proto dhcp metric 100
Справочники портов и протоколов одинаковы в обоих семействах:
Код: Выделить всё
getent services ssh # ssh 22/tcp
getent services 53/udp # domain
grep -E '^(tcp|udp|icmp)\b' /etc/protocols
Код: Выделить всё
# Debian 13 / Ubuntu 24.04
apt install iproute2 iputils-ping dnsutils
# RHEL 10 / Fedora 41
dnf install iproute iputils bind-utils
Код: Выделить всё
ping -c3 192.168.10.1 # ICMP echo до шлюза
ping6 fe80::1%eth0 # link-local требует указания интерфейса
ss -tlnp # слушающие TCP-сокеты с портами и PID
ss -ulnp # то же для UDP
traceroute -I 8.8.8.8 # путь через ICMP
Частые грабли
- Путают broadcast и адрес сети. .0 - это сеть, .255 (для /24) - broadcast. Ни тот ни другой не назначают хосту.
- Считают, что /24 всегда дает 256 рабочих адресов. Рабочих 254 - минус сеть и broadcast.
- Забывают, что в /31 (двухточечные линки, RFC 3021) служебных адресов нет вовсе - оба адреса рабочие.
- Пингуют link-local IPv6 без зоны интерфейса и получают ошибку. Нужен суффикс %eth0 - адрес не уникален между интерфейсами.
- Думают, что запись в /etc/services открывает порт. Файл - это только справочник имен, сервис слушает порт независимо от него.
- Ставят два default-маршрута без разных метрик и удивляются нестабильной маршрутизации.
- Сжимают двойным двоеточием IPv6 дважды - адрес становится неоднозначным и невалидным.
- Используют ifconfig на чистой системе и получают command not found - его больше нет из коробки.
- Посмотрите свои адреса: ip -br addr. Запишите IPv4-адрес, его маску (CIDR) и link-local IPv6 (fe80::).
- Для своей IPv4-сети вручную вычислите адрес сети и broadcast. Проверьте логику командой ipcalc (Debian: apt install ipcalc; Fedora: dnf install ipcalc) или через ip route get.
- Покажите таблицу маршрутизации ip route show и найдите строку default. Определите IP шлюза.
- Выполните ip route get для адреса в своей подсети и для 8.8.8.8 - сравните, через какой интерфейс и шлюз пойдет каждый.
- Пропингуйте свой шлюз и свой link-local IPv6 с суффиксом %интерфейс.
- Найдите в /etc/services порты для ssh, http, domain через getent services. Сопоставьте с реально слушающими портами в ss -tlnp.
- Сколько назначаемых хостам адресов в подсети /26 и какие два адреса служебные?
- Чем адрес сети отличается от broadcast и как каждый из них вычисляется по маске?
- Запишите 2001
0000:0000:0000:0000:0000:0001 в максимально сжатой форме и объясните правила сокращения.
- Когда выбирают UDP вместо TCP и почему ICMP нельзя назвать транспортным протоколом для приложений?
- Что произойдет с пакетом к 8.8.8.8, если на хосте нет default-маршрута, и почему?
- Какой префикс у link-local IPv6 и зачем при работе с ним указывать зону интерфейса?