Управление сетью: 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, потому быстрые.