Вопрос или проблема
Я пытаюсь исправить свой сервер Asterisk, который до недавнего времени был довольно стабильным. Вот моя проблема:
a) Если я выполняю команду sip reload и/или dialplan reload из терминала Asterisk, это иногда нарушает работу голосовых вызовов, так что, когда я звоню на сервер с реального телефона, он говорит, что не может завершить вызов. Но если я подожду несколько минут, он может автоматически снова начать работать. Если это все еще не работает, я повторяю эти шаги, пока это не сработает. Когда происходит ошибка, я получаю rejected because extension not found in context [exts]
. Я не могу последовательно воспроизвести проблему. Я не редактировал свои sip.conf или extensions.conf.
b) Когда сервер работает, и после того как я звоню на него с реального телефона, я набираю внутренний номер 99, он соединяет с моим мобильным телефоном по номеру 555 555 5555. Но нигде в app.extensions.conf нет этого правила! В прошлом году у меня было правило, при котором внутренний номер 99 звонил на 555 555 5555, но оно давно было заменено! Я искал на своем сервере и не нашел ни одной строки с 555 555 5555. Есть ли что-то, что я должен делать, кроме sip reload и dialplan reload?
Для целей отладки я прикрепил свои sip.conf и extensions.conf
sip.conf
[general]
context=sipdefault
allowoverlap=no
allowtransfer=no
maxexpiry=3600
minexpiry=60
defaultexpiry=3600
checkmwi=10
buggymwi=no
vmexten=voicemail
disallow=all
allow=ulaw
language=en
relaxdtmf=yes
useragent=Asterisk PBX
dtmfmode = rfc2833
rfc2833compensate=yes
alwaysauthreject = yes
rtptimeout=60
rtpholdtimeout=300
register => 8888888888:[email protected]/8888888888
canreinvite=yes
jbenable = yes
jbforce = no
jbmaxsize = 200
jbresyncthreshold = 1000
jbimpl = fixed
jblog = no
; END OF GENERAL
[8888888888]
context=exts
type=peer
auth=md5
username=8888888888
fromuser=8888888888
fromdomain=unlimitel.ca
secret=PASS
host=sip06.unlimitel.ca
port=5060
nat=yes
canreinvite=no
qualify=no
disallow=all
allow=ulaw
dtmfmode=rfc2833
insecure=port,invite
extensions.conf
[general]
static=yes
writeprotect=no
clearglobalvars=no
[globals]
[default]
exten => 2005,1,Answer
exten => 2005,2,SetMusicOnHold(default)
exten => 2005,3,WaitMusicOnHold(9000)
exten => 2005,4,Hangup
exten => _X.,1,Hangup(3)
[sipdefault]
exten => _X.,1,Hangup(3)
exten => 2005,1,Answer
exten => 2005,2,SetMusicOnHold(default)
exten => 2005,3,WaitMusicOnHold(9000)
exten => 2005,4,Hangup
[exts]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,WaitExten(7)
exten => 0011,1,Goto(outbound,s,1)
[outbound]
exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,Playback(vm-extension)
exten => s,n,WaitExten(10)
exten => _NXXNXXXXXX,1,Dial(SIP/8888888888/${EXTEN})
exten => _NXXNXXXXXX,n,Hangup
Используйте “sip set debug on” и посмотрите в консоли, как EXACTLY приходит этот пакет.
Очень вероятно, что он идет не на s, а на другой внутренний номер.
Ответ или решение
Ответ
На основе представленных вами данных о конфигурации Asterisk и описания проблемы, давайте разберёмся с причиной ошибки rejected because extension not found in context [exts]
, а также с тем, как решить обе проблемы.
1. Старая кешированная диалплан
Причина, по которой вы получаете сообщение об ошибке, связанное с отсутствием расширения в контексте, может быть связана с тем, что Asterisk использует кэшированную версию диалплана. Это может происходить из-за некорректной перезагрузки конфигураций SIP и диалплана. При выполнении sip reload
и dialplan reload
Asterisk не всегда обновляет свои кэши, что может привести к тому, что старые правила всё ещё будут находиться в памяти.
Решение:
- Попробуйте выполнить
dialplan show
в консоли Asterisk после перезагрузки диалплана, чтобы убедиться, что новые правила были загружены правильно. - Загрузите диалплан принудительно, используя
dialplan reload
иcore reload
, чтобы убедиться, что всё обновляется. Вы можете также попробоватьcore restart
для полной перезагрузки Asterisk, если это допустимо на вашем сервере.
2. Обращение к неожиданным правилам
Отсутствие строки, определяющей ваше расширение 99, может указывать на то, что это расширение могло быть определено в другом контексте или старой версии конфигурации, которая всё ещё хранится в памяти. Может быть, вы используете какие-то внешние модули или динамические конфигурации, которые могли быть загружены и не видно в вашем extensions.conf
.
Решение:
- Выполните
grep
по всем файлам конфигурации Asterisk (например,/etc/asterisk/*.conf
), чтобы найти любые упоминания номера 555-555-5555 и расширения 99. - Убедитесь, что вы не используете динамические или временные правила, которые могут определяться через AGI или другие модули. Если вы используете какие-то базы данных (например, Asterisk Realtime Architecture), убедитесь, что они не содержат старых записей.
3. Отладка
Для более детальной отладки вы можете включить отладку SIP, выполнив команду sip set debug on
в консоли Asterisk. Это даст вам возможность видеть все SIP-пакеты, приходящие и уходящие от вашего сервера. Таким образом, вы сможете определить, откуда именно приходят запросы и в какой контекст они пытаются обратиться.
Заключение
Ваша проблема может быть вызвана рядом факторов, включая кеширование диалплана, отсутствие обновленных правил и возможные неявные связи с другими модулями. Примените предложенные шаги, чтобы устранить эти неполадки. Если проблема продолжит возникать, возможно, имеет смысл создать резервную копию и провести полное восстановление конфигурации Asterisk, чтобы начать с чистого листа.