Как проверить, открыт ли порт на удалённом сервере?

«Как проверить, открыт ли порт на удалённом сервере?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При работе с инфраструктурой я часто проверяю открытые порты на удалённых серверах. Вот мой стандартный набор команд и подходов:

1. Базовые утилиты командной строки:

# 1. Netcat — самый прямой способ
nc -zv <server_ip> <port_number>
# Вывод "succeeded" означает успех.

# 2. Telnet — есть почти везде
telnet <server_ip> <port_number>
# Если соединение устанавливается, порт открыт. Ctrl+] и 'quit' для выхода.

# 3. Nmap — для детальной информации
nmap -p <port_number> <server_ip>
# Покажет состояние (open/filtered/closed) и, возможно, сервис.

2. Проверка изнутри облачной сети (VPC): Часто порт открыт только внутри приватной сети. Подключаюсь к bastion-хосту или используею Systems Manager Session Manager (в AWS) и оттуда проверяю:

ssh bastion_host "nc -zv private_server_ip 5432"  # Проверка порта БД

3. Проверка с помощью curl для HTTP/HTTPS сервисов:

curl -s -o /dev/null -w "%{http_code}n" --connect-timeout 5 http://<server_ip>:<port>
# Код 200-399 или 401/403 часто означают, что порт открыт и сервис отвечает.

4. Автоматизированная проверка в скриптах развёртывания (Ansible/Python): В плейбуках Ansible использую модуль wait_for для проверки перед выполнением следующих задач:

- name: Wait for web server to become available
  ansible.builtin.wait_for:
    host: "{{ inventory_hostname }}"
    port: 8080
    delay: 5
    timeout: 60

Ключевые моменты для диагностики:

  • Connection refused — порт закрыт или сервис не запущен на той стороне.
  • Таймаут — пакеты не доходят (скорее всего, блокировка фаерволом).
  • Всегда проверяю Security Groups / Network ACLs в облаке и локальный firewall (sudo ufw status или sudo firewall-cmd --list-all).