Asterisk: getaddrinfo() failed for host (Ошибка резолвинга DNS в netsock2.c)
- В системном журнале Asterisk фиксируется
ERROR[5678]: netsock2.c: getaddrinfo() failed for host 'sip.trunk-provider.com': Name or service not known. - Падение исходящей маршрутизации и SIP-транков к внешним провайдерам связи.
- Зависание каналов и длительные задержки (freeze) при выполнении функции
Dial()в диалплане. - Команда
pjsip show registrationsпереводит транк в статусRejectedилиUnregistered.
1. Проверка системного разрешения DNS на сервере
dig +short sip.trunk-provider.com A
getent hosts sip.trunk-provider.com2. Настройка надежных DNS-серверов в /etc/resolv.conf
Добавьте отказоустойчивые резолверы и уменьшите таймауты запросов:
options timeout:2 attempts:3 rotate
nameserver 127.0.0.1
nameserver 1.1.1.1
nameserver 8.8.8.83. Конфигурация локального кэширующего DNS (Dnsmasq / systemd-resolved)
Для предотвращения блокировок потоков Asterisk при сетевых задержках поднимите локальный кэш:
apt-get install -y dnsmasq || dnf install -y dnsmasq
systemctl enable --now dnsmasq4. Тюнинг транспорта и таймеров PJSIP
В /etc/asterisk/pjsip.conf для транспорта и транка задайте таймауты и параметры DNS:
[system]
type = system
dns_cache_stale_data = yes
[trunk-out]
type = endpoint
outbound_auth = trunk-auth
aors = trunk-aor
timer_t1 = 500
timer_b = 320005. Применение изменений
asterisk -rx "core reload"
asterisk -rx "pjsip reload" Частые вопросы (FAQ)
Почему Asterisk блокирует весь поток звонка при DNS-ошибке?
Вызов getaddrinfo() является синхронным блокирующим системным вызовом glibc. Если DNS-сервер недоступен, поток обработки звонка зависает на системный таймаут (до 30-60 секунд).
Поможет ли прописывание IP транка в /etc/hosts?
Да, добавление записи в /etc/hosts полностью исключает DNS-запросы, но это небезопасно, если оператор использует GeoDNS, Round-Robin или SRV-записи для балансировки SIP-трафика.
Как PJSIP обрабатывает SRV и NAPTR записи?
PJSIP использует встроенную библиотеку pjproject, которая автоматически запрашивает NAPTR и SRV записи (_sip._udp.domain.com), если порт не указан жестко в URI.
Как отключить IPv6 резолвинг, если у провайдера только IPv4?
В /etc/asterisk/pjsip.conf в секции [transport-udp] укажите bind = 0.0.0.0:5060 (только IPv4), а в /etc/gai.conf раскомментируйте строку precedence ::ffff:0:0/96 100.