Настройка fail2ban для защиты asterisk 1.4, 1.6, 1.8

К сожалению, в сети интернет множество мамкиных хакеров, пытающихся подобрать логин без пароля или иным способом брутфорсить сервера IP телефонии, имеющие доступ из интернет. Отсеять большинство из них помогает смена внешнего порта со стандартного 5060 на какой-либо другой. Но всё же брутфорс иногда возникает, что немного раздражает и представляет призрачную угрозу.

Оговорюсь, что здесь рассмотрен вариант конфигурации довольно старых версий Asterisk – 1.8 и ниже. Для настройки Asterisk начиная с версии 10 и новее с помощью отдельного файла логирования security, советую посмотреть ссылку [1].

Для блокировки подбора пользователей/паролей для различных сервисов существует демон fail2ban, который после указанного количества ошибочных попыток добавляет правило в iptables на блокировку доступа к серверу вообще для IP адреса нарушителя (на указанное время).

Перед началом настройки необходимо установить iptables и fail2ban, если их ещё нет. Также необходимо настроить iptables так, чтобы был доступ к серверу asterisk извне – отключить или добавить правило для порта asterisk. Если вы читаете эту статью, то у вас уже всё должно быть окей с этим.

Настройка ведения логов asterisk

В первую очередь имеет смысл настроить ведение логов asterisk, чтобы информация сразу же начала собираться в нужном нам формате и виде. Для этого в каталоге конфигурации asterisk (по умолчанию это /etc/asterisk) найдите файл logger.conf и раскомментируйте (уберите точку с запятой в начале строки):

dateformat=%F %T ; ISO 8601 date format

Это нужно для того, чтобы asterisk писал в логи дату в правильном формате:
год-месяц-день часы:минуты:секунды

После этого перезапускаем сервис asterisk:

service asterisk restart

Настройка правил фильтрации

Теперь нам необходимо создать фильтр, который будет извлекать из общего потока сообщений астериска потенциально опасные события (неверный логин/пароль, попытка входа с неразрешенного IP адреса, и т.д. и т.п.). При этом нам необходимо не только обнаруживать такие потенциально опасные события, но и вычленять оттуда IP адрес, с которого было выполнено действие. То есть мы не просто ищем определенные строки в файлах событий астериска, а настраиваем правила фильтрации.
Правила фильтрации можно прописать в файле /etc/fail2ban/filter.d/asterisk.conf

Вот образец содержимого этого файла:

# Fail2Ban configuration file
#
#
# $Revision: 250 $
#

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf


[Definition]

#_daemon = asterisk

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#

# Asterisk 1.8 uses Host:Port format which is reflected here

failregex = NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Not a local domain
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>:.*' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Not a local domain
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>:.*' - Wrong password
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: Sending fake auth rejection for device .*\<sip:.*\@<HOST>\>;tag=.*
            NOTICE.* .*: <HOST> tried  to authenticate with nonexistent user '.*'
            VERBOSE.*SIP/<HOST>-.*Received incoming SIP connection from unknown peer

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

В asterisk версии 1.4 и более ранних используются строки типа

“… failed for ” …”

а в asterisk 1.8 и выше – строки

“… failed for ‘:.*’ …”

поскольку начиная с версии asterisk 1.8 в логах появилась информация о номере порта, которой нет в asterisk 1.4. Приведенный выше вариант учитывает как старые, так и новые версии asterisk, так что нет необходимости в нем что-либо менять.

Настройка изоляторов (jails) для fail2ban

Теперь нам необходимо создать описания так называемых “изоляторов” (jails) для fail2ban, т.е. “привязать” наши фильтры к fail2ban: объяснить, в каких файлах эти строки искать, и что потом делать.

Для этого откройте файл /etc/fail2ban/jail.conf

Убедитесь, что нет (или не включено) других правил, связанных с asterisk! Для этого достаточно сделать поиск по файлу по имени “asterisk” (без кавычек) и убедиться, что если такие правила есть, для каждого из них свойство enabled установлено в false или закомментировать решетками все строчки с правилами:

enabled = false

В тексте правила нужно будет указать путь к логу asterisk. По умолчанию в астериске основной файл логов называется messages, но (например) в FreePBX это будет файл под названием full (как называется файл у Вас – см. настройки астериска в файле logger.conf).

Добавляем текст правила в конец файла:

[asterisk-iptables]
# Enable the rule:
enabled  = true
# Name of filter used is asterisk in folder /etc/fail2ban/filter.d:
filter   = asterisk
# Which asterisk file is used to search:
logpath  = /var/log/asterisk/messages
# Max retries allowed:
maxretry = 5
# Action period of time in seconds:
bantime = 86400
# Period of time to search logpath for occurancies:
findtime = 3600
# What to do if there are more occurancies during findtime more than maxretry -
# Ban client's IP address using iptables and send report to admin's e-mail:
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=ASTERISK, dest=admin@yourdomain.com, sender=asterisk@yourdomain.com]
# Whitelist:
#ignoreip = 192.168.1.0/24

Перезапускаем fail2ban:

service fail2ban restart

Для проверки, что fail2ban запущен успешно и правило загружено, выполните следующую команду, которая показывает статус нашего нового jail:

fail2ban-client status asterisk-iptables

В случае, если Вы только что установили fail2ban / iptables, не забудьте убедиться, что они настроены у Вас стартовать автоматически при загрузке системы!

Проверка работы fail2ban

Теперь важный этап – проверить, что всё работает так, как задумано и нигде нет ошибки. Для этого нужно использовать третий компьютер, кроме сервера asterisk и вашего, с которого вы заходите. Чтобы не забанить самого себя.

Последовательность действий для проверки работы связки fail2ban + iptables:

  1. Убедитесь, что у Вас настроен запуск iptables и fail2ban при старте компьютера.
  2. Запустите SIP-клиент (обязательно не с самого сервера asterisk или того, с которого вы на него зашли удалённо, а с другого компьютера!), и указав неверное имя пользователя для авторизации (IP адрес или доменное имя сервера asterisk должно быть верным), попробуйте авторизоваться более 5 раз (как указано в параметре maxretry.

В качестве тестового sip клиента можно использовать программу sipsak, которая работает из командной строки Linux:

aptitude install sipsak
sipsak -U -s sip:test1@asterisk_server_IP_or_domainname

получите 5 раз сообщения вроде:

received:
SIP/2.0 403 Forbidden (Bad auth)
...
error: didn't received '200 OK' on register (see above). aborting

И на maxretry+1-й раз:

send failure: Connection refused

А также письмо на указанный e-mail, что сигнализирует о том, что всё настроено верно.

Проверяем также iptables на сервере asterisk:

iptables -L -n

В цепочке правил Chain f2b-ASTERISK (1 references) должен появится IP адрес ПК, с которого запускали клиент sip.

Ссылки:

  1. http://linux.mixed-spb.ru/asterisk/iptables_setup.php
  2. https://voipmagazine.wordpress.com/2014/11/18/sip-stress-testing-part-2-sipsak/

Как сконвертировать звукозапись в sln формат для использования в Asterisk

(пост из старого черновика)
Asterisk не поддерживает .wav формат, который используется во многих программах звукозаписи. Можно доустановить пакет поддержки mp3 для Asterisk, но пишут, что обработка mp3 довольно ресурсоемкая, потому лучше использовать gsm или sln.
Записывать будем программой Audacity, которая доступна в любом дистрибутиве Linux. Конвертировать будем в командной строке с помощью консольной утилитки sox.Для начала запишем звуковой файл с помощью микрофона и программы Audacity  (в консоли набрать aptitude install audacity – если не установлена)

Далее выделяем нужный фрагмент записи и выбираем в меню File -> Export Selection

В открывшемся диалоге внизу выбираем формат GSM

Заливаем получившийся файл на сервер. Например scp /filepath/file.gsm user@server:/path/
НО Asterisk не хочет хавать так записанные файлы 🙁 Нужно их сконвертировать, например, в формат sln. В консольке набираем команду:
sox file.gsm -t raw -r 8000 -s -2 -c 1 file.sln
Теперь можно спокойно скормить Asterisk’y наш звуковой файлик. (стандартный путь в Debian – /usr/share/asterisk/sounds/ )

Использование встроенной базы данных AstDB в Asterisk

AstDB является частью Asterisk  и устанавливается вместе с ним. Это простая БД (Barkley DB версии 1), без всяких заморочек. Если нужно подключить к Asterisk БД MySQL или PosrgreSQL – это тоже можно сделать, но для несложных задач вполне хватит и AstDB.

Предположим, у нас уже настроен GSM-модем в Asterisk – например, как я описывал здесь для модемов Huawei – и мы хотим звонить на мобильные номера наших абонентов (к примеру, в не рабочее время, когда они находятся вне доступа к SIP телефонам).

Хранится информация в БД с помощью трех понятий – семейство, ключ и значение. Семейство – это аналог таблицы, в которой хранятся пары ключ-значение.

Для начала, нам необходимо наполнить нашу БД номерами. Сделать это можно в процессе диалплана командой вроде:

exten => s,n,Set(DB(mobile/1112)=0991111111)

Здесь мы создаем (или модифицируем, если таковой ключ уже есть) ключ 1112 – SIP-номер для нашего абонента, в моем примере – в семейтве mobile. И присваиваем ему номер мобильного для этого абонента.

Но для большого количества абонентов делать такое не есть хорошо, тем более что БД хранит данные и после перезапуска Asterisk  и после перезагрузки сервера. Потому, целесообразнее – для моего примера – заранее заполнить БД данными из командной строки Asterisk.

Добавление/модификация значений:

database put <семейство> <ключ> <значение>
Пример: database put mobile 1112 0991111111

Для просмотра информации имеем команду:

database get <семейство> <ключ>

а также для просмотра всей БД:

database show

В плане набора (dialplan) пишем следующее:


; Вызываем макрос для дозвона по GSM, передавая ему SIP номер абонента как аргумент
exten => _1XXX,n,Macro(dial-mobile,${EXTEN})
….
[macro-dial-mobile]
; Вытаскиваем из БД значение номера для нужного абонента
; и помещаем в его переменную MobNumber
exten => 1,1(mobile),Set(MobNumber=${DB(mobile/${ARG1})})
; Звоним через GSM-модем
exten => 1,n,Dial(Dongle/dongle0/${MobNumber},100,dmghHtT)

Вот в общем-то и всё. 
http://geckich.blogspot.com/

Полезные команды Asterisk (буду дополнять)

1. Переполнение памяти SMS
Если нужно принять SMS-ку, а в консоли (asterisk -rvv) пишет следующее:
ERROR[15627]: at_response.c:1420 at_response_smmemfull: [dongle0] SMS storage is full
то, логично – нам необходимо почистить память для смс-ок.

Есть два вида памяти:
  • память SIM
  • память модема
Для очистки памяти SIM применяем в консоли астериска последовательно команды:
dongle cmd <dongle_name> AT+CPMS=”SM”,”SM”,”SM” 
dongle cmd <dongle_name> AT+CMGD=1,4
Для очистки памяти модема применяем в консоли астериска последовательно команды:
dongle cmd dongle_name AT+CPMS=”ME”,”ME”,”ME” 
dongle cmd dongle_name AT+CMGD=1,4
Консолька нам выдасть что-то типа:

[dongle_name] ‘AT+CMGD=1,4’ Command queued for execute
[dongle_name] Got Response for user’s command:’OK’
[Oct 25 07:41:57] NOTICE[15627]: at_response.c:1714 at_response: [dongle_name] Got Response for user’s command:’OK’
Всё прошло гладко. Теперь можно принимать SMS-ки.
2. Прием PDU SMS
Если при приеме SMS в консоль пишет следующее:
WARNING[15638]: at_response.c:1204 at_response_cmgr: [dongle0] Error parsing incoming message ‘+CMGR: 0,,73 <куча HEX цифр>’ at possition 40: Can’t parse OA 
то это значит, что SMS-ка пришла в PDU формате и модуль chan_dongle её самостоятельно разобрать не может.
Здесь нам поможет сайтик http://twit88.com/home/utility/sms-pdu-encode-decode , где в поле Hexadecimal PDU Message вводим нашу непонятную мессагу и нажимаем Convert.
Или здесь: http://www.smartposition.nl/resources/sms_pdu.html
3. Просмотр инфо о GSM модемах в системе
Проверить статус модема можно командочкой в консоли астериска:
dongle show devices
ID           Group   State RSSI   Mode   Submode   Provider Name   Model      Firmware          IMEI             IMSI             Number
<dongle_name>  0     Free  22     0         0       life:)         E173       21.157.71.00.388  <imei_number>  <imsi_number>  <tel_number>
Т. к. библиотека для работы с модемами chan_dongle в Астериске опен сорцная и довольно сырая, то можем иногда зависает и отказывается принимать входящие звонки – сьрасывает сразу их. Тогда статус модема будет не Free а Dialing, причем звонков в этот момент нет.
4. Просмотр статистики звонков
Проверить есть ли сейчас активные звонки и сколько было обработано звонков можно командой:
core show calls
 
0 active calls
5. Перезапуск GSM модема
Чтобы перезагрузить модем не перезагружая всю астериску, нужно выполнить команду в CLI:
dongle restart now <dongle_name>
[<dongle_name>] Restart scheduled
[Oct 25 07:42:05] NOTICE[15627]: chan_dongle.c:417 do_monitor_phone: [<dongle_name>] stopping by restart request
Update.

6. Прерывание определенных звонков.
Вначале отобразим инфо о текущих звонках:

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
IAX2/IAX_Trunk_to_US (None)               Up      AppDial((Outgoing Line))
SIP/4003-00000a2f    s@macro-dialout-trun Up      Dial(IAX2/IAX_Trunk_to_US/1001
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up      VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up      VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
6 active channels
4 active calls
1553 calls processed

Допустим, мы хотим обрубить звонок пользователю 4003 (выделен). Выполняем команду:

asterisk2*CLI> channel request hangup SIP/4003-00000a2f
Requested Hangup on channel ‘SIP/4003-00000a30’
— Executing [h@macro-dialout-trunk:1] Macro(“SIP/4003-00000a30”, “hangupcall,”) in new stack
— Executing [s@macro-hangupcall:1] GotoIf(“SIP/4003-00000a30”, “1?theend”) in new stack
— Goto (macro-hangupcall,s,3)
— Executing [s@macro-hangupcall:3] ExecIf(“SIP/4003-00000a30”, “0? Set(CDR(recordingfile)=)”) in new stack
— Executing [s@macro-hangupcall:4] Hangup(“SIP/4003-00000a30”, “”) in new stack
== Spawn extension (macro-hangupcall, s, 4) exited non-zero on ‘SIP/4003-00000a30′ in macro hangupcall’
== Spawn extension (macro-dialout-trunk, h, 1) exited non-zero on ‘SIP/4003-00000a30’
— Hungup ‘IAX2/IAX_Trunk_to_US-49’

Теперь можно увидеть, что звонок завершен.

asterisk2*CLI> core show channels
Channel              Location             State   Application(Data)
SIP/3224-00000a19    s@macro-dial-one:42  Up      Dial(SIP/4027,15,trI)
SIP/4001-0000089e    s-CHANUNAVAIL@macro- Up       VoiceMail(3102@default,u””)
SIP/3117-00000102    s-NOANSWER@macro-vm: Up       VoiceMail(3106@default,u””)
SIP/4027-00000a1a    (None)               Up      AppDial((Outgoing Line))
4 active channels
3 active calls
1554 calls processed

(Источник)
7. Отслеживание активных звонков в Asterisk
В консоли Linux набираем:

watch -n 1 “sudo asterisk -vvvvvrx ‘core show channels’ | grep call”
Информация обновляется каждую секунду.
8. Просмотр структуры базы данных:
database show status
9. Послать USSD-запрос через GSM-модем, работающий с chan_dongle:
dongle ussd dongle0 *111#
10. Показать список каналов, доступных в системе asterisk:
core show channeltypes
Пример вывода:

Как обновить прошивку (firmware) Grandstream HT-503

Как показала практика, даже если сей девайс имеет доступ в интернет, то всё равно проще обновить прошивку, подняв свой TFTP-сервер.

Итак,

1) на ПК под управлением OC Windows идем на сайт разработчиков HT-503 и скачиваем архив с прошивкой

2) распаковываем архив в папку, которая будет корнем на TFTP-сервере

3) скачиваем последнюю версию TFTP-сервера нужной архитектуры отсюда и устанавливаем

4) запускаем Tftpd64 (или Tftpd32 – если вы ставили 32-битную версию), нажимаем Browse и выбираем папку с файлами прошивки затем нажимаем Show Dir – для проверки, в списке Server Interface выбираем нужный (тот, который смотрит в вашу локальную сеть или в VPN – короче, тот, где находится сам HT-503).


5) идем на веб-морду настройки HT-503 и во вкладке Advanced Settings и меняем метод обновления и адрес сервера обновления на тот, который мы толькоч то настроили, также проверяем, включено ли автоматическое обновление:

Затем, чтобы думу не думать долго, если пойдет что-то не так, настраиваем внизу вкладки логирование на удаленный rsyslog:

6) перезагружаем HT-503 желательно нажав скрепкой на кнопку рестарта, которая расположена в задней части корпуса в отверстии а не выдернув шнур питания. Только не держите долго нажатой эту кнопку – после 5-7 секунд произойдет сброс к заводским настройкам.

Если всё сделано правильно, то сразу после включения HT-503 найдет файлы на TFTP-сервере и будет обновляться, при этом индикаторы на корпусе будут мигать периодически и веб-морда некоторое время будет не доступна.

Всё. Надеюсь, кому-то поможет моё описание.

http://geckich.blogspot.com/

Asterisk и NAT

В общем, после долгих сношений с двумя понятиями – Asterisk + NAT решил запечатлить свой опыт здесь – может потом пригодиться мне или еще кому-нибудь.

Есть несколько сценариев работы * с НАТом в зависимости от того, находится сервер и/или клиенты за НАТом. НО. В каждом конкретном случае приходится “шаманить”, т. к. стандартные рецепты не всегда помогают.

У меня был самый тяжелый случай – и сервер Asterisk и клиенты находятся за НАТами… разными НАТами.

Вариантов тут может быть два:

– настроить всю кухню так, что телефоны будут подклучаться к * через свой НАТ, интернет и НАТ сети с * (т. е. путь будет такой: телефон –> НАТ  –> интернет  –> НАТ  –> астериск);

– установить второй сервер * внутри сети, где телефоны и связать 2 сервера * IAX транком – именно IAX, т. к. он более приспособлен для работы через НАТ (путь будет: телефон –> астериск2 –> IAX-транк –> астериск1).

Но, т. .к. настоящие герои всегда идут в обход (с), я решил делать вариант номер 1.

Итакс, начнемс.


1) Конфигурирование сервера с *

SIP телефоны были аппаратными, потому никаких особо вычурных конфигураций в sip.conf придумывать не надо было.

Обязательно надо добавлять опцию qualify = yes, чтобы поддерживать открытым порты на роутерах и чтобы сам * знал, что атм происходит с пиром (иначе возможна ситуация, когда звонки вроде идут, но не доходят или нет звука).

Вот пример конфига для телефонов Cisco SPA XXX:

[general]

pedantic = no
nat = no

rtptimeout = 10
rtpholdtimeout = 300
directmedia=nonat



[authentication]
deny = 0.0.0.0/0.0.0.0
permit = X.X.X.0/255.255.255.255
permit = Y.Y.Y.0/255.255.255.0


[c395]
disallow = all
allow = all
qualify = yes
type = friend
host=dynamic
call-limit=3
busylevel=1
rtpkeepalive = 15
nat=route
fromdomain=example.com
context=something
deny=0.0.0.0/0.0.0.0
permit=X.X.X.0/255.255.255.0
permit=Y.Y.Y.0/255.255.255.0
secret=*****
mailbox=395@default

2) Конфигурирование фаерволла за которым стоят телефоны практически не требуется, главное чтобы давали им какой-то порт для UDP наружу.

3) Конфигурирование фаерволла, за которым спрятан *

Тут уже несколько интересней. Зависит от фаерволла. Если есть настройки типа SIP Passthrough, то включаем, так же делаем порт-форвардинг SIP порта на сервер с * (UDP 5060 по-умолч, но лучше поменять).

Если таких настроек нет или они не дают результата, то – по матчасти – нужно открыть порты для SIP (UDP 5060 по умолч), а также для голосового траффика RTP (по умолч – UDP 10000-20000, изменяется в rtp.conf) и дописать в sip.conf:

[general]

externip = X.X.X.X
localnet = Y.Y.Y.0/24

localnet = Z.Z.Z.0/24
port = [ext_port]

4) Конфигурирование телефонов.

Конфигурирование, конечно же различается от телефона к телефону, но в общем – нужно включать поддержку NAT на тех телефонах, которые спрятаны за NAT. Если таковая поддержка есть в опциях, конечно.

Для Cisco SPA необходимо зайти на веб-морду для конфигурации (http://x.x.x.x/admin/advanced) затем в секции Line включить NAT как на рисунке:

а также, адрес прокси-сервера (т. е. адрес нашего *) указывать с учетом внешнего порта, какой форвардиться на * (х.х.х.х:ext_port).

Проверить всё это дело можно (после перезапуска астериска желательно всего, а не только модуля sip) набрав в командной строке Asterisk’а (asterisk -r):

asterisk*CLI> sip show peers

Name/username              Host            Dyn Nat ACL Port     Status     
*** 
c395/c395                x.x.x.x            D   N   A  24513    OK (134 ms) 
***

Т. е., команда выдает список пиров для протокола SIP и их состояние: Имя, IP-адрес (внешний, если пир за NAT), диманический он или статический в настройках sip.conf, далее используется пиром NAT или нет, контроль доступа есть/нет, порт пира (в случае с NAT – какой роутер форвардит для телефона) и собсно статус и время задержки.

Если телефоны за NAT не работают и в лог Asterisk’a сыплет записи вроде такой:

NOTICE[19903] chan_sip.c: Correct auth, but based on stale nonce received from ‘”с395″ <sip:с395@X.X.X.X>;tag=…………………’

То скорее всего поможет назначение телефону другого внутреннего IP – в таблице маршрутизации роутеров остаются “хвосты”.

Полезные ссылки:

1) http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html
2) http://www.voip-info.org/wiki/view/Asterisk+SIP+NAT+solutions

http://geckich.blogspot.com/

Телефонные коды Украины

Запишу здесь телефонные коды Украинские – полезно для распределения звонков в диалплане Asterisk, если есть несколько разных исходящих линий.

  • 039 xxx xx xx – Киевстар (Golden Telecom)
  • 050 xxx xx xx – МТС
  • 063 xxx xx xx – life:)
  • 066 xxx xx xx – МТС
  • 067 xxx xx xx – Киевстар
  • 068 xxx xx xx – Киевстар (Beeline)
  • 091 xxx xx xx – Utel
  • 092 xxx xx xx – PEOPLEnet
  • 093 xxx xx xx – life:)
  • 094 xxx xx xx – Интертелеком
  • 095 xxx xx xx – МТС
  • 096 xxx xx xx – Киевстар
  • 097 xxx xx xx – Киевстар
  • 098 xxx xx xx – Киевстар
  • 099 xxx xx xx – МТС
  • 031, 032, 033, 034, 035, 036, 037, 038, 041, 042, 043, 044, 045, 046, 047, 048, 049, 051, 052, 053, 054, 055, 056, 057, 058, 059, 061, 062, 063, 064, 065, 069 – стационарные телефоны
  • 0800 – номера вызываемые за счет вызываемого абонента с фиксированных номеров
  • 0900 – платные услуги
http://geckich.blogspot.com/

Звонки в Asterisk через PSTN (ТфОП) с помощью Grandstream Handy Tone HT503

В общем, необходимо подключить обычную телефонную линию (ТфОП, PSTN) к Asterisk для возможности принимать и совершать вызовы через неё.

В этой статье изложу свой опыт – для памятки и вдруг кому-нибудь еще поможет.

Как подключить аналоговую линию в цифровой астериск? Вариантов нашлось три:

  • VoIP-гейтвей
  • PCI-карточка с хотя бы одним портом FXO
  • небольшая волшебная коробочка под названием Grandstream Handy Tone HT503

1й вариант отвергли, т. к. гейт дорог и в его функционал не будет реализован на его стоимость. 2й вариант был отвергнут, т. к. на материнской плате сервера нет обычного PCI-порта… и еще потому, что настраивать карточки расширения имеет смысл, если у нас несколько линий аналоговой/цифровой телефонии FXO/E1. Самым простым и экономичным вариантом оказался номер 3 (стоимость его 50-70 долл).

Итак, разберемся с терминологией. Если по-простому, то:

  • FXO – это интерфейс, к которому подключается PSTN, т. е. сама телефонная линия.
  • FXS – интерфейс для подключения обычного аналогового телефона для использования его в VoIP-телефонии.
  • E1 – интерфейся цифровой телефонии, используются в крупных организациях с множеством цифровых каналов.

Для наших задач возможно подошло бы и другое устройство подобного типа, НО из представленных на нашем рынке устройств, только HT503 имело FXO-порт. Большинство таких устройств имеют только 1 или несколько FXS-портов. Они нам НЕ подходят! Называются они ATA – Analog Telephone Adapter. (в HT503, к слову, также есть один FXS порт, так что он тоже ATA, но не только).

Моменты, которые необходимо учитывать при настройке HT503:

  • подключение чекез WAN или LAN
  • настройка аналоговых параметров ТфОП на странице Advanced Settings (зависят от страны)
  • параметры отсылки DTMF-сигналов для голосовых меню входящих и исходящих вызовов
  • региональные параметры детектирования busy-сигнала ТфОП. Если задать неверные – HT503 не будет детектировать момент завершения входящего вызова вызывающим абонентом
  • Настройки сопротивления ТфОП
  • приоритеты кодеков
  • настройка экстеншна Unconditional Call Forward to VOIP для диалплана Астериска

В общем, распаковываем коробку, подключаем к HT503 БП, затем


в разъем Line подключаем кабель телефонной линии (PSTN). В Phone можно подключить аналоговый телефонный аппарат, если вы планируете его использовать. В нашем сценарии кабель LAN, т. е. для подключения к сети Ethernet нужно подключать в разъем WAN, т. к. коробочка эта будет как просто обычный сетевой девайс, хотя её можно использовать и в качестве шлюза в интернет (я этот вариант не пробовал, потому не могу сказать, как и насколько оно юзабельно).

Разные сценарии использования HT503 описаны тут  и здесь.

Далее, согласно HT503 Manual подключаем аналоговый телефон и набираем ***
 и пользуясь табличкой в мануале и голосовыми подсказками, настраиваем сеть.

Потом в браузере заходим на http://<адрес_коробочки> где адрес – или статик, который мы ввели с помощью телефона, или полученный по DHCP.

Пароль по умолчанию – admin. После первого логина желательно его поменять и не забыть потом.

Идем в Basic Settings. Тут всё должно быть понятно – вбиваем статик адрес, настраиваем временную зону и гейтвейные функции (если коробочка включена между ADSL/Ethernet каналом к провайдеру и внутренней сетью). И в самом низу нужно в пункте Unconditional Call Forward to VOIP: вбить экстеншн, а также адрес сервера с астериском и порт сервера – на этот экстеншн будут приходить входящие из ТфОП вызовы.

Далее идем на вкладку Advanced Settings и листаем вниз до System Ring Cadence:
Далее я привожу настройки валидные для Украинского оператора ТфОП Укртелеком. Скорее всего, они же будут валидны и в России и в СНГ. Для других стран нужно уточнять.Детали на скриншоте:

Теперь самое интересное (или наоборот 🙂 ) – FXO Port

Настройки здесь вполне понятны. ID указываем как в sip.conf астериска (описано ниже в статье).

Далее идут настройки тонального набора. В Priority 1 нужно поставить RFC2833 иначе набирать или принимать тональные экстеншны вы не сможете.

Далее выставляем кодеки – я предпочитаю ulaw / alaw, но каждый выставляет то, что использует. CallerID услугу необходимо заказывать у оператора ТфОП, а после настраивать.
Gain следует поставить в 0 обязательно, иначе почему-то коробочка не детектит busy-тон от линии. Я пробовал различные варианты настроек в т. ч. изменял усиление сигнала для детекта busy тона ниже в настройках – надо ставить усиление в 0.

Здесь тоже региональные настройки в секциях PSTN Disconnect Tone и AC Termination Mode, валидные в Украине, а именно PSTN Disconnect Tone: а также сопротивление у нас стандарт 600 Ом. Если сопротивление больше, то вы получите тихий звук или вообще его отсутствие.
Настройку PSTN Ring Thru FXS: следует отключить, иначе входящие звонки будут вначале идти на аналоговый телефон FXS, а после установленного таймаута в астериск.

Теперь, когда коробочка подключена и настроена, необходимо настроить Asterisk.

Вначале создадим пользователя для коробочки в sip.conf.

[503]
secret = password
type = peer
context = incoming_pstn
fromuser = 7777777      ;здесь и ниже наш городской номер
defaultuser = 7777777
host = dynamic
qualify = yes
nat=no

Во многих мануалах, статьях, на форумах рекомендуют именовать экстеншен для HT503 цифрами во избежании проблем, потому я решил особо не вникая всё-таки не использовать буквы, тем более что это не имеет особого значения.

Входящие вызовы по ТфОП будут приходить в контекст incoming_pstn на экстеншен, заданный в Unconditional Call Forward to VOIP: в Basic Settings веб-морды HT503.
Исходящие звонки через ТфОП осуществляются, например так (7-значные городские):

exten => _[3,7]XXXXXX,n,Dial(SIP/${EXTEN}@503,100)

Полезные ссылки:

1. Grandstream HT503 Manual (pdf)
2. Значения тонов для разных стран (для Украины подходит РФ)
3. Разные сценарии использования HT-503

http://geckich.blogspot.com/

Конференции в Asterisk на ОС Debian 6 или RHEL 6 (Oracle Linux, CentOS) с использованием Meetme (dahdi)

В общем, недавно возился с этими конференциями… При попытке создания конференции появляется ошибка unable to open pseudo device .Вначале установил dahdi (раньше оно называлось Zaptel и служит как интерфейс между модемами и Asterisk, либо как заглушка для Meetme, если модемов никаких нет) из пакетов – не решило это проблему.

Нужн скомпилировать и установить модуляь ядра dahdi из исходных кодов нижеописанным способом.

Скачиваем исходники dahdi-linux-complete:

wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/releases/dahdi-linux-complete-2.6.1+2.6.1.tar.gz

Последнюю версию исходников модуля можно скачать здесь.

tar -xzvf dahdi-linux-complete-2.6.1+2.6.1.tar.gz 
cd dahdi-linux-complete-2.6.1+2.6.1/

Если у вас не установлены заголовки текущей версии ядра, устанавливаем. Для Debian:

apt-get install linux-headers-`uname -r`

Для RHEL-дистрибутивов:

yum install kernel-devel kernel-headers gcc

Для Oracle Linux с его UEK-kernel:

yum install kernel-uek-devel.x86_64 kernel-uek-headers.x86_64 gcc

Произведем компиляцию модуля ядра:

make all
make install
make configure

В более новых версий вместо последней команды надо выполнить:

make config
Далее загружаем установленный модуль:

modprobe dahdi

Теперь прописываем правила в extensions.conf для конференции:
exten => 500,1,MeetMe(500)              ;conference room 500
exten => 500,n,Hangup()
Не забыв, конечно же, прописать конференцию в meetme.conf:
conf => 500
Теперь при наборе номера 500 мы будем попадать в соответствующую конференцию.

Добавочный номер можно изменять, добавлять новые номера для конференций, ставить цифровой пароль на конференцию – это всё хорошо описано в комментариях в файле meetme.conf.

http://geckich.blogspot.com/

Настройка модемов Huawei для работы с АТС Asterisk PBX

После некоторых мучений и поисков, что чего и куда, решил написать статью для потомков о настройке модемов Huawei для работы с АТС Asterisk.
Для начала установим необходимые пакеты. Всё нижесказанное для системы Debian. Для других дистрибутивов нужно будет подправить команды и возможно пути.
aptitude install asterisk-dev libusb libusb-dev subversion build-essential
Теперь идём на реальную вин-машину. Втыкаем туда нашего зверька, винда должна пошуршать дровами, затем надо установить из памяти устройства программульку U’manager. Она установит дрова именно на сам модем. Для верности, заходим в свойства в прожке и проверяем, виден ли наш модем.

Теперь скачиваем прожку для крякания модемчиков Хуявей тут Huawei_Modem_Unlocker.zip

Вначале слева делаем Check Status и жмякаем SERVICE, если в логе внизу покажет, что модем залочен, то делаем ему UNLOCK и независимо от этого обязательно делаем ENABLE VOICE – ну собсно чтобы он звонил 🙂
Далее втыкаем донгл в сервер и, если у вас Asterisk на виртуалке, то заходим в свойства виртуальной машины и пробрасываем ей девайс:

Если у вас такой картинки нету, то ковыряем настройки. Может быть, надо зайти в свойства хоста и сделать как на картинке (Advanced settings – Edit – отмечаем юсб хабы):

Когда вы так или иначе прикрутили модем к серверу Asterisk, проверим:

lsmod | grep usb
usb_wwan                8068  1 option
usbserial              27676  6 option,usb_wwan
usb_storage            40217  0
usbhid                 33292  0
hid                    63257  1 usbhid
usbcore               123122  8 option,usb_wwan,usbserial,usb_storage,usbhid,uhci_hcd,ehci_hcd
nls_base                6377  1 usbcore
scsi_mod              126725  9 usb_storage,vmw_pvscsi,sd_mod,sg,sr_mod,mptspi,mptscsih,scsi_transport_spi,libata
ls /dev/ | grep USB
ttyUSB0
ttyUSB1
ttyUSB2
Если у вас примерно похожее, то всё окей.
В некоторых случаях модем линуксом сразу не определяется. А определяется как cr-rom или какой-нибудь флеш… в общем, ttyUSB нема. В этой ситуации может помочь утилитка USB Mode Switch, которая с помощью манипуляций правилами udev делает то, что нам нужно 🙂 Качаем ее с офф сайта (на Debian/Ubuntu она есть в репозиториях) http://www.draisberghof.de/usb_modeswitch/ затем распаковываем и компилируем. Не забываем установить утилиту tcl – без нее ругаться не будет, но и работать тоже… При следующем подключении модема, утилитка должна сработать и дать нам наши ttyUSB.
Теперь надо скачать для Asterisk-a модуль для работы с хуйвей модемами. Есть два варианта – модуль chan_datacard и chan_dongle. Мне вначале попался 1й и я заюзал его. Как оказалось, зря. Т. к. работало всё, кроме отправки USSD-запросов. А не знать свой баланс – пичалька. Потому ставить лучше 2й. Скачиваем последнюю версию с сайта http://code.google.com/p/asterisk-chan-dongle/downloads/list и компилим (предварительно сделав noload в modules.conf 1-му модулю, если он у вас уже есть):
wget http://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r10.tgz
tar -xzvf chan_dongle-1.1.r10.tgz 
cd chan_dongle-1.1.r10/
./configure 
make
make install
ls /usr/lib/asterisk/modules
cp etc/dongle.conf /etc/asterisk/
nano /etc/asterisk/dongle.conf

В конфиге прописываем параметры для нашего модемчика. Для моего Huawei E173 это выглядело так:

[defaults]

rxgain=4
txgain=4

[dongle0]
audio=/dev/ttyUSB1              ; tty port for audio connection;        no default value
data=/dev/ttyUSB2               ; tty port for AT commands;             no default value

Причем, номера ttyUSBх могут отличаться для разных модемов – находям, если что, методом “тыка”. А строки с усилением звука – потому что слишком низкий уровень звука по-умолчанию был у меня.
Далее, в папке etc, которая находится там, куда вы распаковали исходники модуля есть файл extensions.conf, в котором примеры чего и как прописывать в диалплан.
Если мы в /etc/asterisk/dongle.conf ничего явно не указали, то входящий вызов по-умолч. приходит в секцию [dongle-incoming].
Там я прописал :
include => dongle-incoming-sms
include => dongle-incoming-ussd

exten => s,n,Goto(incoming,s,1)
1е 2 строчки нужны для приема SMS и USSD-запросов. А 3я перекидывает вызов в стандартную секцию для входящих звонков моего диалплана. Содержимое инклюдов взял из гугла:
[dongle-incoming-ussd]
exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} – ${DATACARD}: ${USSD}’ >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

[dongle-incoming-sms]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} – ${DATACARD} – ${CALLERID(num)}: ${SMS}’ >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
Далее, чтобы звонить через модем, нужно в секцию, где обрабатываются исходящие вызовы поместить такое:
exten => _7.,1,Dial(Dongle/dongle0/+${EXTEN})
exten => _0.,1,Dial(Dongle/dongle0/${EXTEN})
1-я строчка – для звонков в Россию. 2-я – для звонков на мобильные номера по Украине (я нахожусь в Украине – соотв., для других стран может быть по-другому здесь).
Дальше. Я так и не понял, как посылать USSD-запросы через диалплан (т. е. тупо набирая в SIP-телефоне). Но, через CLI Asterisk’a это делается просто:
asterisk -rx dongle ussd dongle0 *111#
Где dongle0 – как вы обозвали своё устройство в конфиге, а за ним сам запрос. Если в диаплане у вас прописана обработка USSD так же, как и у меня, то результаты запросов будут дописываться в файл /var/log/asterisk/ussd.txt.
Я написал скрипт на Python, который проверяет балланс через эту команду и отсылает результат на меил. Но о нем я напишу в другой статье.
входящие SMS сохраняются автоматом в файле /var/log/asterisk/sms.txt, если вы прописали как я.
З. Ы. Для тех, кто по каким-либо причинам решит юзать модуль chan_datacard, приведу кратко настройку его.
svn checkout http://chan-datacard.googlecode.com/svn/trunk/ chan-datacard-read-only

cd chan-datacard-read-only/
./configure
make install
cp etc/datacard.conf /etc/asterisk/datacard.conf
nano /etc/asterisk/datacard.conf
[E1550_t](!)
context=incoming-datacard       ; context for incoming calls
rxgain=3                        ; increase the incoming volume
txgain=-3                       ; increase the outgoint volume
autodeletesms=yes               ; auto delete incoming sms
resetdatacard=yes               ; reset datacard during initialization
u2diag=0                        ; set U2DIAG parameter (0 = disable everything except modem function)
[datacard0](E1550_t)
context=incoming-datacard
audio=/dev/ttyUSB1              ; tty for audio connection
data=/dev/ttyUSB2               ; tty for AT commands
group=1                         ; calling group
Диалплан:
[incoming-datacard]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} – ${DATACARD} – ${CALLERID(num)}: ${SMS}’ >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()
exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo ‘${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} – ${DATACARD}: ${USSD}’ >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()
exten => s,1,Goto(succ-incoming,s,1)
exten => s,n,Hangup()

[outgoing]
exten => _0.,1,Dial(Datacard/datacard0/${EXTEN})
UPD:
Last chan_dongle url – https://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz
Полезные команды в Asterisk CLI:
dongle show device settings dongle0 – показывает все настройки для модема

UPD2:
Как выяснилось чуть позже, операторы не разрешают использовать свои обычные симки в GSM-гейтвеях или вот таких вот модемах (который по сути – дешевый GSM-гейт). Для того, чтобы оператор не заблокировал SIM-карточкУ, необходимо перейти на корпоративный тариф, разрешающий использование гейта (обычно тариф дороже обычных). О переходе и тарифе можете узнать у свогео ОПсоСа.
UPD3:
Обычный chan_dongle переехал на github: https://github.com/bg111/asterisk-chan-dongle (работает только с Asterisk 1.6, 1.8).
Форк для работы с Asterisk 11: https://github.com/jstasiak/asterisk-chan-dongle/
Форк для работы с Asterisk 13: https://github.com/oleg-krv/asterisk-chan-dongle