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

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

Ответ

В DevOps-работе проверка доступности порта на удалённом хосте — это стандартный шаг при диагностике инцидентов или валидации конфигурации. Я действую по такому алгоритму:

1. Быстрая проверка базовой связности:

ping -c 2 <remote_host>

Если хост не пингуется (например, из-за запрета ICMP), перехожу сразу к проверке порта.

2. Проверка конкретного TCP-порта (основной метод):

# Использую netcat, если он установлен
nc -zv -w 3 <remote_host> <port>

# Ключ -w задаёт таймаут в секундах.

3. Если netcat недоступен, использую telnet или чистый Bash:

telnet <remote_host> <port>
# Или
timeout 3 bash -c "cat < /dev/null > /dev/tcp/<remote_host>/<port>" 2>/dev/null && echo "SUCCESS" || echo "FAILED"

4. Для комплексного сканирования или проверки диапазона портов:

# Устанавливаю nmap при необходимости
sudo apt-get install -y nmap  # для Debian/Ubuntu

# Быстрое сканирование одного порта
nmap -p <port> <remote_host>

# Проверка, что порт открыт и сервис его "слышит"
nmap -sT -p <port> <remote_host>

5. Автоматизация в скриптах: Для мониторинга или CI/CD пайплайнов пишу простые Python-скрипты:

import socket

def check_port(host, port, timeout=2):
    try:
        with socket.create_connection((host, port), timeout=timeout):
            return True
    except (socket.timeout, ConnectionRefusedError):
        return False

# Использование
if check_port("example.com", 443):
    print("HTTPS порт открыт")

Важно: Всегда учитываю, что доступность порта может блокироваться сетевым экраном на пути (iptables, облачные Security Groups, корпоративный фаервол). Поэтому проверяю с разных точек (изнутри VPC, из публичной сети).