Как проверить доступность и работоспособность UDP-соединения между Linux-серверами?

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

Ответ

Проверка UDP сложнее, чем TCP, из-за отсутствия встроенного handshake. Вот практический подход, который я использую.

1. Быстрая проверка доступности порта и базовой связи: Используем netcat (nc). Нужно запустить слушатель на одном сервере и отправить данные с другого.

  • На целевом сервере (приемник):
    # Слушаем UDP на порту 5005. Флаг `-k` (keep) полезен для нескольких проверок.
    nc -u -l -k 5005
  • На клиентском сервере (отправитель):
    echo "UDP_TEST_PACKET" | nc -u <target_ip> 5005

    Если пакет дошел, вы увидите текст UDP_TEST_PACKET в терминале приемника.

2. Проверка, слушает ли сервис порт, и анализ правил фаервола:

  • Проверить, какой процесс слушает UDP-порт:
    sudo ss -ulnp | grep :5005
    # Или устаревшая команда
    sudo netstat -tulnp | grep :5005
  • Проверить базовые правила iptables (или nftables/firewalld):
    sudo iptables -L -n -v | grep 5005
    sudo iptables -L -n -v | grep udp

3. Глубокая диагностика с помощью tcpdump: Это самый надежный способ. Запускаем на целевом хосте и смотрим, приходят ли пакеты.

    sudo tcpdump -i any udp port 5005 -vv
    # Более читаемый вывод с hex и ASCII
    sudo tcpdump -i any udp port 5005 -X

Если пакеты видны в tcpdump, но сервис их не получает, проблема в настройках приложения или в правилах SO_REUSEADDR/SO_REUSEPORT.

4. Автоматизация для мониторинга: Для постоянного мониторинга UDP-сервисов можно написать простой скрипт, который отправляет пакет и проверяет ответ (если протокол его предусматривает), или использовать Prometheus Blackbox Exporter с модулем udp, который может отправлять UDP-запрос и проверять ответ по регулярному выражению.