понедельник, 7 апреля 2025 г.

Почему Asterisk не регистрируется на SIP-транке: причины, диагностика и руководство по устранению проблем

Этот подробный гайд поможет вам разобраться, почему Asterisk не регистрируется на SIP-транке, и как эффективно диагностировать и устранять проблемы, связанные с ошибками в конфигурации, сетевыми настройками, NAT, файрволами, таймаутами и другими причинами.

Вы узнаете:

  • все возможные причины сбоев при регистрации на SIP-провайдере;

  • как использовать sip.conf и pjsip.conf — с готовыми шаблонами и пояснениями;

  • как выявить ошибки с помощью встроенных инструментов Asterisk и сетевых утилит;

  • как обнаружить проблемы NAT, обрывов звонков и потери аудио;

  • как проверить правильность маршрутизации и настройки портов;

  • и как воспользоваться автоматическим bash-скриптом для диагностики SIP/NAT.

Подходит как для начинающих, так и для системных администраторов, кто хочет быстро локализовать и устранить проблемы с VoIP-инфраструктурой на базе Asterisk.

📌 Возможные причины, почему Asterisk не регистрируется на SIP-транке:

  1. Неверные учетные данные SIP:

    • Ошибка в username, secret, authuser.

    • Логин не совпадает с идентификатором регистрации (fromuser, fromdomain).

  2. Неправильный адрес или порт SIP-сервера:

    • Ошибка в host или порт, отличный от стандартного 5060.

    • Ошибка в DNS (неразрешаемое имя).

  3. Блокировка трафика на фаерволе/маршрутизаторе:

    • Не открыты порты 5060 (UDP), 5061 (TLS), 10000–20000 (RTP).

    • NAT не настроен или настроен некорректно.

  4. Неправильная конфигурация NAT:

    • Отсутствуют nat=force_rport,comedia, externip, localnet, externaddr.

    • Внутренний IP пробрасывается без преобразования.

  5. Проблемы на стороне провайдера:

    • Провайдер заблокировал IP.

    • Временные технические работы.

    • Ограничение по количеству регистраций или времени.

  6. Ошибки в конфигурации sip.conf или pjsip.conf:

    • Несовместимые параметры.

    • Конфликт между SIP и PJSIP (одновременно активны два стека).

  7. Asterisk не может инициировать регистрацию:

    • Служба Asterisk не запущена.

    • Ошибка загрузки модуля chan_sip.so или chan_pjsip.so.

    • SIP-транк не включён или неактивен.

  8. Отсутствие DNS-серверов на сервере Asterisk:

    • Отсутствует доступ к интернету или к DNS.

    • Используется доменное имя, но неразрешается.

  9. Неверное время на сервере:

    • Проблемы с регистрацией по TLS из-за некорректного времени.

    • Истёкший сертификат.


🔍 Диагностика (способы проверки)

  1. Проверка состояния регистрации:

    • sip show registry (для chan_sip)

    • pjsip show registrations (для chan_pjsip)

  2. Просмотр логов:

    • Включить отладку: core set verbose 10, sip set debug on, pjsip set logger on

    • Смотреть /var/log/asterisk/full

  3. Проверка соединения с провайдером:

    • ping, traceroute, telnet host 5060

    • Проверить резолвинг имени: nslookup или dig

  4. Проверка правил iptables и fail2ban:

    • iptables -L -n

    • fail2ban-client status

  5. Проверка правильности конфигурации:

    • Убедиться, что type=registration указан (в PJSIP)

    • Проверить правильность секций [general], [trunk_name], [endpoint], [auth], [aor]

  6. Проверка сетевых интерфейсов:

    • ifconfig или ip a — правильный внешний IP

    • Проверка настроек NAT


🛠️ Траблшутинг (пошаговое устранение)

  1. Убедитесь, что Asterisk запущен и модули загружены:

    asterisk -rvvv module show like sip module show like pjsip
  2. Проверьте логин и пароль SIP:

    • Попросите провайдера перепроверить данные.

  3. Используйте IP вместо доменного имени на время отладки.

  4. Проверьте, нет ли двойного NAT (CGNAT). Если да — настройте STUN или перенесите сервер.

  5. Проверьте корректность externip, localnet, nat в sip.conf или pjsip.conf.

  6. Проверьте, не блокирует ли ваш сервер обратные подключения.

  7. Убедитесь, что вы не используете одновременно SIP и PJSIP с одним и тем же адресом.

  8. Временно выключите firewall и fail2ban для теста.

  9. Используйте пакетный сниффер (tcpdump, Wireshark):

    tcpdump -i eth0 udp port 5060 -vvv


Вот подробный шаблон конфигурации для SIP и PJSIP, с пояснениями к каждому параметру, а затем разберём, как диагностировать проблемы с NAT и таймаутами, которые очень часто мешают корректной регистрации и работе звонков.


📄 Шаблон для sip.conf (chan_sip)

[general]
register => логин:пароль@провайдер:порт/логин
bindport=5060
bindaddr=0.0.0.0
externip=ВАШ_ВНЕШНИЙ_IP
localnet=192.168.0.0/255.255.255.0
nat=force_rport,comedia
context=from-trunk
disallow=all
allow=alaw
allow=ulaw

[mytrunk]
type=peer
host=провайдер
port=5060
username=логин
secret=пароль
fromuser=логин
fromdomain=провайдер
insecure=invite,port
nat=force_rport,comedia
qualify=yes
canreinvite=no
context=from-trunk

🔹 externip — ваш внешний IP-адрес (можно настроить externhost + stun если IP динамический)
🔹 nat=force_rport,comedia — обязательно при NAT.
🔹 qualify=yes — проверка доступности провайдера (отправка OPTIONS).
🔹 canreinvite=no — запрет реинвайтов, иначе RTP может идти напрямую, мимо NAT.


📄 Шаблон для pjsip.conf (chan_pjsip)

[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
external_media_address=ВАШ_ВНЕШНИЙ_IP
external_signaling_address=ВАШ_ВНЕШНИЙ_IP
local_net=192.168.0.0/24

[provider_auth]
type=auth
auth_type=userpass
username=логин
password=пароль

[provider_aor]
type=aor
contact=sip:провайдер:5060

[provider_endpoint]
type=endpoint
transport=transport-udp
aor=provider_aor
auth=provider_auth
context=from-trunk
disallow=all
allow=alaw,ulaw
outbound_auth=provider_auth
from_user=логин
from_domain=провайдер
force_rport=yes
rtp_symmetric=yes
rewrite_contact=yes

[provider_registration]
type=registration
outbound_auth=provider_auth
server_uri=sip:провайдер
client_uri=sip:логин@провайдер
contact_user=логин
retry_interval=60
forbidden_retry_interval=300
expiration=3600
transport=transport-udp

🔹 rewrite_contact=yes — важен при NAT, чтобы Asterisk регистрировался с корректным IP.
🔹 rtp_symmetric — нужен при NAT для корректного получения RTP.
🔹 force_rport — аналог nat=force_rport из sip.conf.


🔍 Как диагностировать NAT-проблемы и таймауты

1. Проблемы регистрации (REGISTRATION)

  • Симптомы:

    • Регистрация проходит, но через некоторое время исчезает.

    • Повторная регистрация не работает без перезапуска Asterisk.

  • Диагностика:

    • Включите лог:

      pjsip set logger on core set verbose 10
    • Смотрите, отправляются ли REGISTER-запросы и получаете ли 200 OK.

    • Запустите:

      pjsip show registrations
    • Если статус Rejected или No Response, то, возможно, ответ не доходит до сервера Asterisk из-за NAT.

2. Проблемы со звуком (RTP)

  • Симптомы:

    • Звонок проходит, но нет звука в одну или обе стороны.

    • Иногда после 30 секунд звонок обрывается.

  • Возможные причины:

    • RTP (аудио) не доходит до Asterisk из-за NAT.

    • Сервер не получает RTP, думает что сессия "мертва" и обрывает её.

  • Диагностика:

    • Проверка портов RTP: по умолчанию 10000–20000 UDP.

    • Проверьте лог:

      rtp set debug on
    • Если вы не видите "Got RTP packet from...", значит RTP не доходит.

    • Проверьте iptables и NAT-маршрутизацию на внешнем роутере/файрволе.

  • Решения:

    • Убедитесь, что в sip.conf / pjsip.conf указаны externip, localnet.

    • Пропишите rtp_symmetric, rewrite_contact, force_rport.

    • Откройте UDP 5060 и 10000–20000 на фаерволе и роутере.

3. Сессии обрываются через 30-60 секунд

  • Это типичный симптом, если Asterisk не получил ACK или RTP.

  • Проверьте:

    • Настроены ли SIP KeepAlive: qualify=yes (sip.conf), qualify_frequency (pjsip.conf).

    • Открыты ли порты и правильно ли работает NAT.


Хочешь, могу сделать bash-скрипт для автоматической диагностики сетевых проблем с SIP на сервере

Вот скрипт на Bash, который поможет диагностировать сетевые проблемы SIP/NAT/портов на сервере с Asterisk. Он проверяет:

  • статус Asterisk и его модули SIP/PJSIP,

  • наличие открытых SIP/RTP портов,

  • внешний IP,

  • разрешение DNS,

  • доступность SIP-сервера провайдера,

  • наличие правил iptables,

  • проблемы с fail2ban.


🛠️ sip_diag.sh — скрипт для диагностики SIP/NAT в Asterisk

#!/bin/bash

# === Настройки пользователя ===
SIP_PROVIDER_HOST="sip.provider.com"   # Замените на ваш SIP-сервер
RTP_PORT_RANGE_START=10000
RTP_PORT_RANGE_END=20000
EXTERNAL_PORT=5060

# === Вывод цвета ===
GREEN="\e[32m"
RED="\e[31m"
YELLOW="\e[33m"
RESET="\e[0m"

log_ok()    { echo -e "${GREEN}[OK]${RESET} $1"; }
log_warn()  { echo -e "${YELLOW}[WARN]${RESET} $1"; }
log_err()   { echo -e "${RED}[ERROR]${RESET} $1"; }

echo "=== Диагностика SIP/NAT Asterisk ==="

# 1. Проверка, запущен ли Asterisk
if pgrep -x "asterisk" > /dev/null; then
    log_ok "Asterisk работает"
else
    log_err "Asterisk не запущен"
fi

# 2. Проверка модулей SIP и PJSIP
asterisk -rx "module show like sip" | grep -q "chan_sip" && log_ok "Модуль chan_sip загружен" || log_warn "chan_sip не загружен"
asterisk -rx "module show like pjsip" | grep -q "chan_pjsip" && log_ok "Модуль chan_pjsip загружен" || log_warn "chan_pjsip не загружен"

# 3. Внешний IP
EXT_IP=$(curl -s https://api.ipify.org)
[[ -n "$EXT_IP" ]] && log_ok "Внешний IP: $EXT_IP" || log_warn "Не удалось определить внешний IP"

# 4. Проверка DNS резолвинга SIP-провайдера
if getent hosts "$SIP_PROVIDER_HOST" > /dev/null; then
    log_ok "SIP-провайдер $SIP_PROVIDER_HOST успешно резолвится"
else
    log_err "DNS не может разрешить $SIP_PROVIDER_HOST"
fi

# 5. Проверка доступности SIP-порта провайдера
nc -z -u -w2 "$SIP_PROVIDER_HOST" $EXTERNAL_PORT && log_ok "Порт $EXTERNAL_PORT UDP на $SIP_PROVIDER_HOST доступен" || log_warn "Порт $EXTERNAL_PORT UDP на $SIP_PROVIDER_HOST не отвечает"

# 6. Проверка открытых портов на сервере
if ss -u -l | grep -q ":$EXTERNAL_PORT"; then
    log_ok "UDP порт $EXTERNAL_PORT (SIP) открыт на сервере"
else
    log_warn "UDP порт $EXTERNAL_PORT (SIP) не прослушивается"
fi

# 7. Проверка RTP портов (10000-20000)
OPEN_RTP=$(ss -u -l | grep -E ":1[0-9]{4}|:20000" | wc -l)
[[ "$OPEN_RTP" -gt 0 ]] && log_ok "RTP порты (10000–20000) активны" || log_warn "RTP порты (10000–20000) не прослушиваются"

# 8. Проверка iptables
if command -v iptables &>/dev/null; then
    IPTABLES_DROP=$(iptables -L -n | grep -c DROP)
    [[ $IPTABLES_DROP -gt 0 ]] && log_warn "iptables содержит DROP-правила, проверьте вручную" || log_ok "iptables не содержит явных блокировок"
else
    log_warn "iptables не установлен"
fi

# 9. Проверка Fail2ban
if systemctl is-active --quiet fail2ban; then
    JAILS=$(fail2ban-client status | grep Jail | cut -d: -f2)
    log_ok "Fail2Ban активен. Проверка забаненных IP..."
    fail2ban-client status asterisk 2>/dev/null | grep -q "Banned IP list:" && log_warn "Есть забаненные IP в jail 'asterisk'"
else
    log_ok "Fail2Ban не активен"
fi

# 10. Тест на NAT-интерфейсы
PRIVATE_IP=$(ip a | grep 'inet 192\|inet 10\|inet 172' | grep -v '127.0.0.1' | awk '{print $2}' | head -n1)
if [[ -n "$PRIVATE_IP" ]]; then
    log_warn "Обнаружен NAT-интерфейс ($PRIVATE_IP). Убедитесь, что настроен externip/localnet в sip/pjsip"
else
    log_ok "NAT-интерфейс не обнаружен"
fi

echo -e "\n${YELLOW}Проверка завершена. Проверьте вышеуказанные рекомендации.${RESET}"


📦 Как использовать:

  1. Скопируй скрипт в файл, например sip_diag.sh.

  2. Дай права на исполнение:

    chmod +x sip_diag.sh
  3. Запусти от root или пользователя с правами на asterisk и iptables:

    ./sip_diag.sh

Комментариев нет:

Отправить комментарий