Как проверить сервер на открытые порты и лишние сервисы?

В этой статье разберём:

  • что такое открытый порт и чем он связан со службой;
  • как посмотреть, какие порты открыты прямо сейчас;
  • как понять, какой процесс слушает порт;
  • как найти лишние службы и отключить их;
  • какие команды удобно использовать на пустом Ubuntu VPS.

Что такое открытый порт простыми словами

У каждого сетевого сервиса на сервере обычно есть свой порт. Например:

  • 22 — SSH, удалённый вход на сервер;

  • 80 — HTTP;

  • 443 — HTTPS;

  • 3306 — MariaDB/MySQL;

  • 5432 — PostgreSQL.

Если порт слушается, значит какой-то процесс на сервере ждёт входящие подключения. Это не всегда плохо: SSH должен слушать свой порт, веб-сервер — тоже. Проблема появляется тогда, когда:

  • открыт сервис, который не используется;

  • база данных слушает внешний интерфейс, хотя должна быть доступна только локально;

  • на сервере запущены лишние службы, о которых уже никто не помнит.

Наша задача — посмотреть, что именно открыто, и понять: это нормально или нет.

Какие инструменты будем использовать

Для проверки открытых портов на Ubuntu удобнее всего использовать такие команды:

  • ss — главный инструмент для просмотра слушающих портов и соединений;

  • lsof — показывает, какой именно процесс держит порт;

  • systemctl — показывает службы, которые запущены и включены в автозагрузку.

На большинстве VPS ss уже есть. Для lsof можно сразу поставить пакет:

sudo apt update
sudo apt install -y lsof

Если захочешь использовать старую команду netstat, её нужно ставить отдельно через пакет net-tools, но сегодня ss обычно удобнее и современнее.

Как посмотреть открытые порты на сервере

Основная команда:

sudo ss -tulpn

Разберём ключи:

  • -t — TCP-порты;

  • -u — UDP-порты;

  • -l — только слушающие порты;

  • -p — показать процесс, если возможно;

  • -n — показывать числа, а не пытаться «расшифровывать» имена сервисов.

Пример типичного вывода:

Netid State  Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
tcp   LISTEN 0      128    0.0.0.0:22         0.0.0.0:*         users:(("sshd",pid=731,fd=3))
tcp   LISTEN 0      511    0.0.0.0:80         0.0.0.0:*         users:(("nginx",pid=1022,fd=6))
tcp   LISTEN 0      511    0.0.0.0:443        0.0.0.0:*         users:(("nginx",pid=1022,fd=7))
tcp   LISTEN 0      80     127.0.0.1:3306     0.0.0.0:*         users:(("mariadbd",pid=1188,fd=20))

Что здесь видно:

  • 0.0.0.0:22 — SSH доступен снаружи на всех интерфейсах;

  • 0.0.0.0:80 и 0.0.0.0:443 — веб-сервер слушает HTTP и HTTPS;

  • 127.0.0.1:3306 — база данных слушает только локально, это хороший вариант;

  • в столбце Process видно, какой процесс держит порт.

Проверка открытых портов через ss на VPS

Как понять, порт открыт наружу или только локально

Один и тот же сервис может слушать:

  • 0.0.0.0 — на всех IPv4-интерфейсах;

  • :: — на всех IPv6-интерфейсах;

  • 127.0.0.1 — только локально, снаружи не доступен;

  • IP_СЕРВЕРА — только на конкретном адресе.

Например:

127.0.0.1:5432

означает, что PostgreSQL доступен только с самого сервера. Это безопаснее, если сайт и база стоят на одном VPS.

А вот такое:

0.0.0.0:5432

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

Как найти процесс, который держит порт

Если вывода ss недостаточно или хочется перепроверить процесс, поможет lsof.

Например, ищем, кто держит порт 22:

sudo lsof -i :22

Или порт 80:

sudo lsof -i :80

Пример вывода:

COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd     731 root    3u  IPv4  17654      0t0  TCP *:ssh (LISTEN)

Здесь видно:

  • COMMAND — имя процесса;

  • PID — идентификатор процесса;

  • USER — от какого пользователя он запущен;

  • NAME — какой порт слушает.

Как посмотреть запущенные и включённые службы

Чтобы увидеть, какие службы сейчас работают:

systemctl list-units --type=service --state=running

Если нужен список служб, которые стартуют автоматически при загрузке:

systemctl list-unit-files --type=service --state=enabled

Для проверки конкретной службы:

sudo systemctl status ssh
sudo systemctl status nginx
sudo systemctl status mariadb

Даже на пустом VPS полезно посмотреть эти списки: иногда там уже есть службы, о которых владелец сервера вообще не знает.

Список запущенных служб на VPS через systemctl

Как понять, что сервис лишний

Сервис стоит считать лишним, если:

  • ты не устанавливал его и не понимаешь, зачем он нужен;

  • он слушает внешний порт, но у тебя нет ни сайта, ни базы, ни панели, которые должны там работать;

  • он остался после тестов или старой настройки;

  • он включён в автозагрузку, но реально не используется.

Примеры типовых ситуаций:

  • на сервере нет сайта, а открыт 80 или 443 — значит, где-то работает веб-сервер;

  • база данных слушает наружу, хотя приложение крутится на том же VPS — это лишний риск;

  • работает демон, про который ты вообще ничего не знаешь — сначала разобраться, потом отключать.

Как остановить и отключить лишнюю службу

Если ты понял, что сервис не нужен, его можно остановить и убрать из автозагрузки.

sudo systemctl stop имя_службы
sudo systemctl disable имя_службы

Например, если установлен Apache, но он не нужен:

sudo systemctl stop apache2
sudo systemctl disable apache2

После этого снова проверяем:

sudo ss -tulpn

Если порт исчез — всё правильно, именно эта служба его и держала.

Важно: не отключай наугад ssh, сетевые службы и системные демоны, если не понимаешь, за что они отвечают. Иначе можно потерять доступ к серверу.

Как проверить порт снаружи

Команда ss показывает, что слушается на самом сервере. Но иногда полезно понять, доступен ли порт снаружи по сети.

Если есть другой компьютер или сервер, можно использовать:

nc -zv IP_ВАШЕГО_VPS 22
nc -zv IP_ВАШЕГО_VPS 80
nc -zv IP_ВАШЕГО_VPS 443

Если nc не установлен, можно просто попробовать подключиться обычным клиентом: через SSH, браузер или программу для конкретного сервиса.

Это полезно, потому что сервис может слушать порт, но фаервол всё равно может не пускать подключения снаружи.

Что ещё стоит проверить на пустом VPS

Если сервер новый и на нём пока почти ничего нет, то нормальная картина обычно такая:

  • открыт только SSH;

  • если установлен веб-сервер — 80 и 443;

  • базы и внутренние сервисы либо не установлены, либо слушают только 127.0.0.1.

Для быстрой проверки пустого VPS удобно выполнить три команды подряд:

sudo ss -tulpn
systemctl list-units --type=service --state=running
systemctl list-unit-files --type=service --state=enabled

Частые ошибки и путаница

  • «Я вижу порт 127.0.0.1:3306 — это опасно?»

    Нет. Если база слушает только локально, это как раз безопаснее.

  • «Служба выключена, а порт всё равно слушается»

    Значит, порт держит другой процесс. Проверяй через ss и lsof.

  • «Порт слушается, но снаружи не подключается»

    Проверь фаервол: UFW, iptables/nftables или ограничения у хостинг-провайдера.

  • «Вижу странную службу, но боюсь выключать»

    И правильно. Сначала выясни, что это за пакет и за что он отвечает, а уже потом принимай решение.

Итоги

  • Разобрались, что такое открытый порт и как он связан со службой.

  • Научились смотреть слушающие порты через ss -tulpn.

  • Узнали, как определять процесс, который держит порт, через lsof.

  • Посмотрели, как проверять запущенные и включённые службы через systemctl.

  • Разобрали, как отличать нормальные сервисы от лишних и как их отключать.

Вывод: регулярная проверка открытых портов и служб — это одна из самых простых и полезных привычек в администрировании VPS. Одна команда может быстро показать, не появилось ли на сервере что-то лишнее.

Оставить комментарий