Интерфейсы и ip
Набор iproute2 — ip addr, ip link, ss — заменил устаревший ifconfig/netstat. Предсказуемые имена интерфейсов (ens3, enp2s0) сохраняются после перезагрузки; loopback (lo) присутствует всегда. ss -tlnp показывает, что слушает порт и какой процесс владеет сокетом.
Ты подключаешься по SSH к новой виртуальной машине, и первое, что нужно выяснить: есть ли у неё рабочий сетевой интерфейс, какой у неё IP и какие порты открыты. Старые инструменты — ifconfig, netstat — отсутствуют на минимальных образах Debian; они из пакета net-tools, который большинство дистрибутивов больше не устанавливает по умолчанию. Современная замена: ip (из iproute2) и ss (статистика сокетов). Это не просто замена — они предоставляют больше информации, понимают сетевые пространства имён и активно поддерживаются разработчиками ядра. Если ты по-прежнему тянешься к ifconfig, ты отлаживаешь инструментом, который не знает о network namespaces, MPLS или VRF — разница важна в контейнерах и облачных VM.
После этого урока ты сможешь перечислить все интерфейсы и их адреса через ip addr, поднять и опустить интерфейс через ip link set, назначить временный адрес через ip addr add, читать предсказуемые имена интерфейсов и понимать, зачем они нужны, а также использовать ss -tlnp для просмотра слушающих портов и владеющих ими процессов.
ip addr show — основной инструмент для просмотра адресов интерфейсов.
Каждый сетевой интерфейс имеет имя, флаги (UP, LOWER_UP, LOOPBACK), индекс и один или несколько адресов. Loopback-интерфейс (lo) присутствует всегда; inet 127.0.0.1/8 — его адрес.
ip addr show
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
# link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# inet 127.0.0.1/8 scope host lo
# inet6 ::1/128 scope host
# 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP
# link/ether 52:54:00:ab:cd:ef brd ff:ff:ff:ff:ff:ff
# inet 10.0.0.10/24 brd 10.0.0.255 scope global dynamic ens3
# Короткая форма: ip addr (тот же вывод)
# Для одного интерфейса: ip addr show ens3Строка inet — IPv4-адрес в нотации CIDR. scope global означает, что адрес доступен с других хостов; scope host (loopback) — только локально. dynamic означает, что адрес получен по DHCP.
ip link show — состояние интерфейса без адресов.
Когда нужно проверить, поднят ли интерфейс, или посмотреть MAC-адрес без лишней информации:
ip link show
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 ...
# 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
# link/ether 52:54:00:ab:cd:ef brd ff:ff:ff:ff:ff:ff
# Опустить и поднять интерфейс (нужен root):
sudo ip link set ens3 down
sudo ip link set ens3 up
# Проверка: флаг UP исчезает из угловых скобок при опускании
ip link show ens3
# 2: ens3: <BROADCAST,MULTICAST> mtu 1500 ... ← нет флага UPip link set ... down не разрушает конфигурацию: интерфейс не удаляется, адреса остаются в таблице ядра. DHCP-клиенты замечают изменение carrier и могут отреагировать, но адрес сохраняется до явного удаления.
Предсказуемые имена интерфейсов: почему ens3, а не eth0.
До udev ядро Linux использовало eth0, eth1 в порядке обнаружения — нестабильно на многопортовых машинах. Systemd’s udev переименовывает интерфейсы на основе слота прошивки, адреса PCI-шины или MAC-адреса:
# Схема именования:
# en = Ethernet
# wl = Wireless LAN
# ww = Wireless WAN (WWAN/LTE)
#
# Суффикс:
# o<index> = встроенный (например eno1)
# s<slot> = PCI-слот (например ens3)
# p<bus>s<slot> = PCI-путь (например enp2s0)
# x<MAC> = по MAC (резервный вариант)
#
# На облачных VM обычно встречается:
# ens3 → PCI-слот 3
# enp0s3 → PCI-шина 0, слот 3
# ens192 → виртуальный NIC VMware в слоте 192
# Старое имя eth0 используется, когда udev не может определить
# стабильный путь — например, в контейнерах (veth-пара).Практический результат: имя интерфейса не меняется после перезагрузки, замены железа в том же слоте или обновления ядра. На облачных VM можно полагаться, что ens3 останется ens3.
Назначение временного адреса через ip addr add.
Адреса, полученные по DHCP, управляются сетевым демоном. Ручное назначение полезно для тестирования, добавления второго адреса или поднятия интерфейса до запуска демона:
# Добавить временный адрес (теряется после перезагрузки):
sudo ip addr add 192.0.2.50/24 dev ens3
# Проверить:
ip addr show ens3
# inet 10.0.0.10/24 ...
# inet 192.0.2.50/24 scope global ens3 ← второй адрес виден
# Удалить:
sudo ip addr del 192.0.2.50/24 dev ens3Один интерфейс может иметь несколько адресов (multihoming). Ядро выбирает адрес источника по таблице маршрутизации. Для сохранения адресов после перезагрузки используй /etc/network/interfaces (Debian ifupdown), netplan (Ubuntu) или systemd-networkd.
ss -tlnp — что слушает и какой процесс.
ss — современная замена netstat. Наиболее используемые флаги:
ss -tlnp
# -t только TCP-сокеты
# -l только слушающие сокеты (серверы, ожидающие соединений)
# -n числовые порты (не резолвить /etc/services)
# -p показать процесс (PID и имя), владеющий сокетом
# Пример вывода:
# State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
# LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
# LISTEN 0 4096 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=5678,fd=7))
# LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=9012,fd=6))
# Все TCP (установленные + слушающие):
ss -tnp
# UDP-сокеты:
ss -ulnpLocal Address:Port равный 0.0.0.0:22 означает, что sshd слушает на всех интерфейсах; 127.0.0.1:5432 означает, что postgres принимает соединения только от localhost — граница безопасности, видная прямо здесь.
Сетевая диагностика при первом входе на новую VM.
Ты подключаешься по SSH к host-a (10.0.0.10/24). Приложение недоступно. За 60 секунд:
# 1. Есть ли живой интерфейс?
ip addr show
# → ens3 UP, inet 10.0.0.10/24 — хорошо
# 2. Приложение действительно слушает?
ss -tlnp | grep ':8080'
# → ничего — приложение не запустилось или упало
# 3. Запустить приложение (пример через systemd):
sudo systemctl start myapp
ss -tlnp | grep ':8080'
# LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("myapp",pid=4321,fd=10))
# 4. Слушает ли оно на всех интерфейсах или только на localhost?
# 0.0.0.0:8080 → все интерфейсы, доступно из 10.0.0.x
# 127.0.0.1:8080 → только localhost — проблема в firewall или bind-address
# 5. Проверить снаружи (с host-b):
# ssh host-b 'curl -s http://10.0.0.10:8080/health'Просмотр ss -tlnp до проверки правил firewall или DNS экономит минуты в 3 часа ночи.
▸Частая ошибка
ifconfig не просто устарел — его нет. На свежем Debian 12 или Ubuntu 24.04 minimal ifconfig не установлен. Его запуск даёт “command not found”. Мышечная память, тянущаяся к ifconfig eth0, введёт в заблуждение. Маппинг на iproute2: ifconfig → ip addr show; ifconfig eth0 up → ip link set eth0 up; netstat -tlnp → ss -tlnp. Установи net-tools если старые команды нужны временно, но не пиши скрипты под них — они не обслуживаются и не понимают network namespaces.
▸Почему это работает
На macOS ifconfig — основной инструмент и активно поддерживается (BSD-наследие). ip недоступен без iproute2mac из Homebrew, и даже тогда это частичная обёртка. Для просмотра сокетов macOS использует netstat -an или lsof -i. Концепции идентичны (интерфейсы, адреса, слушающие сокеты), но набор инструментов полностью другой. Если твоя машина разработчика — macOS, а продакшн — Linux, держи оба словаря: ifconfig/netstat для ноутбука, ip/ss для всего остального.
Ты запускаешь ss -tlnp и видишь: LISTEN 0 128 127.0.0.1:5432 0.0.0.0:* users:((postgres,pid=5678,fd=7)). Что это говорит о доступности postgres с другого хоста?
ip addr show перечисляет все интерфейсы и их IPv4/IPv6-адреса в нотации CIDR; scope global — внешнедоступный, scope host — только loopback. ip link set <iface> up/down управляет состоянием интерфейса без удаления адресов. Предсказуемые имена интерфейсов (ens3, enp2s0) назначаются udev на основе PCI-топологии — стабильны после перезагрузок, в отличие от гонки eth0. ip addr add/del назначает временные адреса; для сохранения нужны netplan, systemd-networkd или /etc/network/interfaces. ss -tlnp показывает TCP-слушающие сокеты с владеющим процессом — адрес 0.0.0.0 означает все интерфейсы, 127.0.0.1 — только localhost. Этих пяти операций хватает для 90% сетевой диагностики при первом входе.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.