Asterisk кэшировал старый план набора? Отклонено из-за того, что расширение не найдено в контексте?

Вопрос или проблема

Я пытаюсь исправить свой сервер 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, чтобы начать с чистого листа.

Оцените материал
Добавить комментарий

Капча загружается...