Как посмотреть, какие сетевые порты заняты в Linux?

Ответ

Для инспекции занятых портов в Linux используются утилиты ss (рекомендуемая, современная) и netstat (устаревшая, но широко известная).

1. Использование ss (socket statistics): Утилита ss из пакета iproute2 быстрее и показывает более детальную информацию, чем netstat.

# Показать все слушающие (LISTEN) TCP и UDP порты с именами процессов
sudo ss -tulnp

Ключи команды ss:

  • -t — отображать TCP сокеты.
  • -u — отображать UDP сокеты.
  • -l — показывать только сокеты в состоянии LISTEN (ожидающие подключений).
  • -n — не резолвить имена (показывать IP и номера портов).
  • -p — показывать PID и имя процесса, владеющего сокетом.
  • -4 / -6 — фильтровать по IPv4 или IPv6.

Пример полезных комбинаций:

# Какие процессы слушают на конкретном порту (например, 80)
ss -tlnp sport = :80

# Показать все установленные TCP-соединения
ss -tnp state established

# Показать все UDP-сокеты
ss -unp

2. Использование netstat (устаревшее): Может отсутствовать в минимальных образах. Синтаксис похож.

sudo netstat -tulnp

3. Использование lsof (list open files): Очень мощная утилита для поиска процессов по порту.

# Какие процессы используют порт 443?
sudo lsof -i :443

# Показать все процессы, слушающие сетевые порты
sudo lsof -i -P -n | grep LISTEN

4. Проверка конкретного порта с nc или telnet: Чтобы проверить, доступен ли порт локально (не только слушает, но и отвечает).

nc -zv localhost 22
telnet localhost 22

Практический пример из DevOps: При развертывании нового сервиса, который должен слушать порт 8080, я сначала проверяю, не занят ли он:

if sudo ss -tlnp | grep -q ':8080 '; then
    echo "Порт 8080 уже занят:"
    sudo ss -tlnp | grep ':8080 '
    exit 1
else
    echo "Порт 8080 свободен, можно запускать."
fi

Эта проверка часто встраивается в скрипты деплоя или в health-check'и контейнеров.

Ответ 18+ 🔞

Слушай, ну вот реально, какого хуя каждый раз гуглить, какой порт чем занят? Будто в первый раз. Ладно, щас разжуёшь, запоминай раз и навсегда, а то потом опять будешь как мартышлюшка по клавиатуре тыкать.

В общем, есть у нас две основные команды, но одна из них — старый дед, который уже еле дышит. Современная и быстрая — это ss (socket statistics). Она из пакета iproute2, работает моментально, информации показывает овердохуища. Вторая — netstat. Ну, её все знают, но она уже как тот полупидор на лавочке — вроде есть, но лучше бы его не было. Медленная, пожирает ресурсы, в новых минимальных образах её может и не быть.

Вот смотри, как ss юзать, чтобы всё про твои порты узнать:

# Эта команда — твой лучший друг. Покажет ВСЁ, что слушает TCP и UDP, и какой процесс этим владеет.
sudo ss -tulnp

Ключи тут простые, но без них нихуя не получится:

  • -t — это для TCP.
  • -u — это, ясень пень, для UDP.
  • -l — покажи только то, что в состоянии LISTEN, то есть ждёт подключений. А то тебе же не нужны все установленные соединения, верно?
  • -n — не преобразовывать адреса и порты в имена. Покажет цифры, это быстрее и точнее.
  • -p — вот это самое важное! Покажет PID и имя процесса, который этот сокет держит. Без sudo тут иногда нихуя не увидишь, имей в виду.

Ну и комбинации для конкретных случаев, а то ты же любишь усложнять:

# Допустим, тебя ебёт, кто на порту 80 сидит. Вот тебе ответ.
ss -tlnp sport = :80

# Хочешь посмотреть все активные TCP-соединения? Пожалуйста.
ss -tnp state established

# Всё, что по UDP летает.
ss -unp

А теперь про netstat. Ну, если уж очень хочется, команда почти такая же, но чувствуется, что ей уже пизда рулю. Просто запомни, что ss лучше.

sudo netstat -tulnp

Есть ещё одна хитрая жопа — lsof. Утилита мощнейшая, может по порту процесс найти. Например, если какой-то пидарас шерстяной занял порт 443, а кто — непонятно:

sudo lsof -i :443

Ну и классика жанра — проверить, а отвечает ли порт вообще. Не просто слушает, а чтобы к нему можно было подключиться. Берёшь nc (netcat) или старого доброго telnet:

nc -zv localhost 22
telnet localhost 22

А вот реальная история из жизни, чтобы ты понял, нахуя это всё:
Представь, разворачиваешь ты новый сервис в контейнере, и он должен стартануть на порту 8080. А он не стартует, потому что порт уже занят. Чтоб не гадать, вставляешь в скрипт деплоя такую проверку:

if sudo ss -tlnp | grep -q ':8080 '; then
    echo "Порт 8080 уже занят, ёпта:"
    sudo ss -tlnp | grep ':8080 '
    exit 1
else
    echo "Порт 8080 свободен, можно запускать."
fi

Вот и всё. Запомнил? А то будешь как тот Фарлаф, только на объёбке проехать, а работать не сможешь.