Управление сетью: ip и ss (замена ifconfig/netstat)

Современный Linux давно живёт не на ifconfig и netstat, а на двух командах из пакета iproute2 — ip и ss. Разберёмся читать и менять сеть руками.

iproute2 — штатный набор сетевых утилит ядра Linux; его две главные команды ip (адреса, интерфейсы, маршруты) и ss (сокеты и соединения) полностью покрывают то, для чего раньше брали ifconfig, route и netstat.

Зачем это на практике

На свежих дистрибутивах (Ubuntu, Debian, Fedora, RHEL) пакет net-tools с ifconfig/netstat часто вообще не установлен. Вы заходите по SSH на сервер, набираете привычное ifconfig — и получаете command not found. Поэтому уметь работать через ip и ss — это не вопрос вкуса, а базовая выживаемость. Эти команды показывают больше (несколько IP на одном интерфейсе, namespaces, политики маршрутизации) и говорят на языке ядра напрямую.

Команда ip: адреса и интерфейсы

Главный приём — сокращать подкоманды до уникального префикса: ip a = ip addr, ip l = ip link, ip r = ip route. Посмотреть все интерфейсы и их IP:

ip addr show          # все интерфейсы и адреса
ip a                  # то же самое, коротко
ip addr show eth0     # только один интерфейс
ip -br -c a           # компактная таблица (-brief, -color)

Типичный вывод ip -br a читается как таблица «интерфейс — состояние — адреса»:

lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             192.168.1.50/24 fe80::a00:27ff:fe4e:1/64

Запись 192.168.1.50/24 — это IP-адрес и маска одновременно: /24 означает, что первые 24 бита — адрес сети (192.168.1.0), а последний октет — номер хоста. Состояние UP у eth0 говорит, что линк поднят; lo — это loopback, петля на себя.

Меняем интерфейсы и адреса вручную

Поднять/опустить интерфейс и навесить временный адрес:

sudo ip link set eth0 up            # поднять линк
sudo ip link set eth0 down          # опустить
sudo ip addr add 192.168.1.60/24 dev eth0   # добавить IP
sudo ip addr del 192.168.1.60/24 dev eth0   # убрать IP

Важно: эти изменения живут только до перезагрузки. Для постоянной настройки правят конфиг сети дистрибутива (Netplan на Ubuntu, NetworkManager на Fedora/RHEL) — ip отлично подходит, чтобы быстро проверить гипотезу «а заработает ли с таким адресом».

Команда ip: маршруты и шлюз

Таблица маршрутизации отвечает на вопрос «куда отправить пакет для такого-то адреса». Посмотреть её и узнать шлюз по умолчанию:

ip route            # вся таблица маршрутов
ip r                # коротко
ip route get 8.8.8.8   # через какой маршрут пойдёт пакет к 8.8.8.8
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.50

Строка default via 192.168.1.1 — это шлюз по умолчанию (default gateway): всё, что не относится к локальной сети 192.168.1.0/24, уходит на роутер 192.168.1.1. Команда ip route get бесценна при отладке: она показывает, каким именно маршрутом и через какой src-адрес ядро отправит конкретный пакет.

Команда ss: соединения и порты

ss (socket statistics) — замена netstat: показывает открытые сокеты, кто слушает порты и какие соединения активны, но работает быстрее на машинах с тысячами соединений.

Самая ходовая комбинация флагов — ss -tulpn: -t TCP, -u UDP, -l только слушающие, -p процесс, -n не резолвить имена (быстрее и понятнее):

sudo ss -tulpn       # кто слушает порты (TCP+UDP)
ss -tan              # все TCP-соединения (любое состояние)
ss -t state established   # только установленные TCP
ss -tn dst :443      # соединения к удалённому порту 443

Вывод ss -tulpn подскажет, что какой-то процесс «сел» на порт:

Netid State   Local Address:Port   Process
tcp   LISTEN  0.0.0.0:22           users:(("sshd",pid=812,fd=3))
tcp   LISTEN  127.0.0.1:5432       users:(("postgres",pid=991,fd=7))

Здесь видно: sshd слушает порт 22 на всех интерфейсах (0.0.0.0), а PostgreSQL — только на 127.0.0.1, то есть снаружи к нему не подключиться. Это первый шаг отладки «почему сервис недоступен»: проверить, слушает ли он вообще и на каком адресе.

Как это работает под капотом

И ip, и ss не парсят текстовые файлы, а общаются с ядром по сокету netlink — специальному каналу, через который ядро отдаёт структуры данных о сети напрямую. Старый netstat читал /proc/net/tcp построчно и на сервере с десятками тысяч соединений ощутимо тормозил; ss получает те же данные пакетом через netlink и потому быстрее. Маска /24 в выводе — это CIDR-нотация: число бит, выставленных в единицу в маске подсети (/24 = 255.255.255.0). Состояния TCP (LISTEN, ESTAB, TIME-WAIT) — это фазы конечного автомата TCP, и ss просто показывает текущую фазу каждого сокета.

Частые ошибки

  • Ждать, что изменения через ip переживут перезагрузку. Не переживут — это runtime-настройка. Постоянное правят в Netplan/NetworkManager.
  • Запускать ss -tulpn без sudo и не видеть процессы. Без root колонка Process будет пустой — ядро не отдаёт чужие PID обычному пользователю.
  • Путать 0.0.0.0 и 127.0.0.1 в колонке Local Address. 0.0.0.0 — слушает на всех интерфейсах (доступно извне), 127.0.0.1 — только локально. Половина вопросов «почему не подключается снаружи» — отсюда.
  • Искать ifconfig и сдаваться. На минимальных образах его нет; ip a есть всегда.

Итоги

  • ip a — адреса и интерфейсы, ip r — маршруты и шлюз, ip route get IP — куда реально пойдёт пакет.
  • Запись IP/маска (например /24) задаёт адрес и сеть одновременно в CIDR-нотации.
  • ss -tulpn — кто слушает порты; 0.0.0.0 = снаружи, 127.0.0.1 = только локально.
  • Изменения через ip — временные; ip/ss говорят с ядром через netlink, потому быстрые.
Проверьте себя
1. Что означает запись 192.168.1.50/24 в выводе ip addr?
AIP-адрес 192.168.1.50 и маску подсети /24 (255.255.255.0) одновременно
BЧто на интерфейсе настроено 24 разных адреса
CНомер порта 24 у адреса 192.168.1.50
DСкорость интерфейса 24 мегабита
2. Сервис слушает на 127.0.0.1:5432. Почему к нему нельзя подключиться с другой машины?
AПорт 5432 зарезервирован системой
B127.0.0.1 — это loopback, доступный только локально; для внешнего доступа нужен 0.0.0.0 или конкретный IP интерфейса
CНужно открыть порт командой ip route add
Dss не умеет показывать внешние соединения