Ответ
Проверка 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-запрос и проверять ответ по регулярному выражению.