Этот подробный гайд поможет вам разобраться, почему Asterisk не регистрируется на SIP-транке, и как эффективно диагностировать и устранять проблемы, связанные с ошибками в конфигурации, сетевыми настройками, NAT, файрволами, таймаутами и другими причинами.
Вы узнаете:
-
все возможные причины сбоев при регистрации на SIP-провайдере;
-
как использовать
sip.conf
иpjsip.conf
— с готовыми шаблонами и пояснениями; -
как выявить ошибки с помощью встроенных инструментов Asterisk и сетевых утилит;
-
как обнаружить проблемы NAT, обрывов звонков и потери аудио;
-
как проверить правильность маршрутизации и настройки портов;
-
и как воспользоваться автоматическим bash-скриптом для диагностики SIP/NAT.
Подходит как для начинающих, так и для системных администраторов, кто хочет быстро локализовать и устранить проблемы с VoIP-инфраструктурой на базе Asterisk.
📌 Возможные причины, почему Asterisk не регистрируется на SIP-транке:
-
Неверные учетные данные SIP:
-
Ошибка в
username
,secret
,authuser
. -
Логин не совпадает с идентификатором регистрации (
fromuser
,fromdomain
).
-
-
Неправильный адрес или порт SIP-сервера:
-
Ошибка в
host
или порт, отличный от стандартного 5060. -
Ошибка в DNS (неразрешаемое имя).
-
-
Блокировка трафика на фаерволе/маршрутизаторе:
-
Не открыты порты 5060 (UDP), 5061 (TLS), 10000–20000 (RTP).
-
NAT не настроен или настроен некорректно.
-
-
Неправильная конфигурация NAT:
-
Отсутствуют
nat=force_rport,comedia
,externip
,localnet
,externaddr
. -
Внутренний IP пробрасывается без преобразования.
-
-
Проблемы на стороне провайдера:
-
Провайдер заблокировал IP.
-
Временные технические работы.
-
Ограничение по количеству регистраций или времени.
-
-
Ошибки в конфигурации
sip.conf
илиpjsip.conf
:-
Несовместимые параметры.
-
Конфликт между SIP и PJSIP (одновременно активны два стека).
-
-
Asterisk не может инициировать регистрацию:
-
Служба Asterisk не запущена.
-
Ошибка загрузки модуля
chan_sip.so
илиchan_pjsip.so
. -
SIP-транк не включён или неактивен.
-
-
Отсутствие DNS-серверов на сервере Asterisk:
-
Отсутствует доступ к интернету или к DNS.
-
Используется доменное имя, но неразрешается.
-
-
Неверное время на сервере:
-
Проблемы с регистрацией по TLS из-за некорректного времени.
-
Истёкший сертификат.
-
🔍 Диагностика (способы проверки)
-
Проверка состояния регистрации:
-
sip show registry
(для chan_sip) -
pjsip show registrations
(для chan_pjsip)
-
-
Просмотр логов:
-
Включить отладку:
core set verbose 10
,sip set debug on
,pjsip set logger on
-
Смотреть
/var/log/asterisk/full
-
-
Проверка соединения с провайдером:
-
ping
,traceroute
,telnet host 5060
-
Проверить резолвинг имени:
nslookup
илиdig
-
-
Проверка правил iptables и fail2ban:
-
iptables -L -n
-
fail2ban-client status
-
-
Проверка правильности конфигурации:
-
Убедиться, что
type=registration
указан (в PJSIP) -
Проверить правильность секций
[general]
,[trunk_name]
,[endpoint]
,[auth]
,[aor]
-
-
Проверка сетевых интерфейсов:
-
ifconfig
илиip a
— правильный внешний IP -
Проверка настроек NAT
-
🛠️ Траблшутинг (пошаговое устранение)
-
Убедитесь, что Asterisk запущен и модули загружены:
asterisk -rvvv module show like sip module show like pjsip
-
Проверьте логин и пароль SIP:
-
Попросите провайдера перепроверить данные.
-
-
Используйте IP вместо доменного имени на время отладки.
-
Проверьте, нет ли двойного NAT (CGNAT). Если да — настройте STUN или перенесите сервер.
-
Проверьте корректность
externip
,localnet
,nat
вsip.conf
илиpjsip.conf
. -
Проверьте, не блокирует ли ваш сервер обратные подключения.
-
Убедитесь, что вы не используете одновременно SIP и PJSIP с одним и тем же адресом.
-
Временно выключите firewall и fail2ban для теста.
-
Используйте пакетный сниффер (tcpdump, Wireshark):
tcpdump -i eth0 udp port 5060 -vvv
Вот подробный шаблон конфигурации для SIP и PJSIP, с пояснениями к каждому параметру, а затем разберём, как диагностировать проблемы с NAT и таймаутами, которые очень часто мешают корректной регистрации и работе звонков.
📄 Шаблон для sip.conf
(chan_sip)
[general]register => логин:пароль@провайдер:порт/логинbindport=5060bindaddr=0.0.0.0externip=ВАШ_ВНЕШНИЙ_IPlocalnet=192.168.0.0/255.255.255.0nat=force_rport,comediacontext=from-trunkdisallow=allallow=alawallow=ulaw[mytrunk]type=peerhost=провайдерport=5060username=логинsecret=парольfromuser=логинfromdomain=провайдерinsecure=invite,portnat=force_rport,comediaqualify=yescanreinvite=nocontext=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=transportprotocol=udpbind=0.0.0.0:5060external_media_address=ВАШ_ВНЕШНИЙ_IPexternal_signaling_address=ВАШ_ВНЕШНИЙ_IPlocal_net=192.168.0.0/24[provider_auth]type=authauth_type=userpassusername=логинpassword=пароль[provider_aor]type=aorcontact=sip:провайдер:5060[provider_endpoint]type=endpointtransport=transport-udpaor=provider_aorauth=provider_authcontext=from-trunkdisallow=allallow=alaw,ulawoutbound_auth=provider_authfrom_user=логинfrom_domain=провайдерforce_rport=yesrtp_symmetric=yesrewrite_contact=yes[provider_registration]type=registrationoutbound_auth=provider_authserver_uri=sip:провайдерclient_uri=sip:логин@провайдерcontact_user=логинretry_interval=60forbidden_retry_interval=300expiration=3600transport=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=10000RTP_PORT_RANGE_END=20000EXTERNAL_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. Проверка, запущен ли Asteriskif pgrep -x "asterisk" > /dev/null; thenlog_ok "Asterisk работает"elselog_err "Asterisk не запущен"fi# 2. Проверка модулей SIP и PJSIPasterisk -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. Внешний IPEXT_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; thenlog_ok "SIP-провайдер $SIP_PROVIDER_HOST успешно резолвится"elselog_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"; thenlog_ok "UDP порт $EXTERNAL_PORT (SIP) открыт на сервере"elselog_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. Проверка iptablesif command -v iptables &>/dev/null; thenIPTABLES_DROP=$(iptables -L -n | grep -c DROP)[[ $IPTABLES_DROP -gt 0 ]] && log_warn "iptables содержит DROP-правила, проверьте вручную" || log_ok "iptables не содержит явных блокировок"elselog_warn "iptables не установлен"fi# 9. Проверка Fail2banif systemctl is-active --quiet fail2ban; thenJAILS=$(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'"elselog_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" ]]; thenlog_warn "Обнаружен NAT-интерфейс ($PRIVATE_IP). Убедитесь, что настроен externip/localnet в sip/pjsip"elselog_ok "NAT-интерфейс не обнаружен"fiecho -e "\n${YELLOW}Проверка завершена. Проверьте вышеуказанные рекомендации.${RESET}"
📦 Как использовать:
-
Скопируй скрипт в файл, например
sip_diag.sh
. -
Дай права на исполнение:
chmod +x sip_diag.sh
-
Запусти от root или пользователя с правами на
asterisk
иiptables
:./sip_diag.sh
Комментариев нет:
Отправить комментарий