Настройка Linksys spa3102 + asterisk 11 на роутере Asus RT-N18U

Однажды мне в руки попался FXO шлюз Cisco Linksys spa3102. Достался он мне почти на халяву и грех было его не утилизировать в своём домашнем техноцарстве. :)
Конечно, по началу я пошёл простейшим путём, просто установив у себя на домашнем компе 3cx server, который, кстати говоря, оказался очень простым в настройке и в то же время, вполне функциональным софтом для моих целей. Но меня очень смущали несколько вещей: Во-первых, мне очень не нравится ставить на свой рабочий комп какое-либо серверное п.о., потому что я на нём работаю и он на Windows, а это уже совсем не сервер. Во-вторых, меня очень сильно огорчило качество звука. Как бы я не игрался с кодеками, звук ужасно жевало, присутствовало эхо и ощутимые задержки. Да и вообще, хотелось бы, чтобы АТС обслуживал какой то небольшой девайс, который быстро грузится и жрёт не очень много электричества. Вот тут то у меня и возникла идея фикс, установить всё, что мне нужно на WiFi маршрутизатор.

На тот момент моим основным «вафлемётом» был Tp-Link TL-WR741ND. В общем, роутер пришлось менять… Покопавшись в обзорах и интернет магазинах, я пришёл к выбору устройства, оптимального по соотношению цена\выпендрёж качество.

Asus RT-N18U – это беспроводной роутер AC стандарта, на платформе Cortex A9 (ARMv7, 800 MHz) со 128 мегабайтовой флеш памятью и 256 мб оперативы. Железяка сравнительно мощная, что позволяет использовать её не только как роутер, но и как домашний сервер для самых различных целей, начиная от домашней файлопомойки и заканчивая вебсервером с MySQL и PHP. Изврат конечно, но наличие самой возможности не может не радовать. :)

Без-имени-6На данном девайсе установлена вполне неплохая стоковая прошивка, в которой уже с завода есть определённое количество плюшечек. Но мне нужно было от него ещё больше. По этому, я начал искать что-то поинтереснее. Перебрав несколько вариантов прошивок, я остановился на AdvancedTomato. В принципе, это та же самая Tomato by Shibby, но с  переработанным веб-интерфейсом на HTML5.
Ставится эта прошивка следующим образом:
1. Заходим вот сюда и скачиваем последнюю версию прошивки для вашего устройства.
2. Затем сюда и скачиваем утилиту для восстановления прошивки. «ASUS RT-N18U Firmware Restoration»
3. Обнуляем роутер (через панель, либо долгим нажатием на ресет при работающем роутере)
4. Выставляем на сетевой карточке адрес вручную на 192.168.1.10 например.
5. Вырубаем роутер с кнопки, зажимаем ресет и врубаем роутер. Ресет не отпускать до тех пор, пока синяя лампочка на морде не начнём лениво мигать. Эта индикация говорит о том, что роутер вошёл в режим восстановления.
6. Запускаем утилиту восстановления и выбираем в ней новую прошивку (см. пункт 1)
7. Запускаем процесс прошивки. Если всё сделано правильно, то вы увидите прогресс закачки и обновления.
8. Ждём перезапуска роутера. С этой прошивкой он стартует долго. Причём так долго, что может показаться, будто роутер подох. :) Немного терпения, он обязательно загрузится…
Впрочем, для пущей уверенности в своих действиях, желательно запитать роутер от UPS при обновлении. Не знаю, есть ли там какая защита от кривой прошивки, но так всё-же спокойнее.
9. Если хотите получить 100% рабочую систему, обнулите роутер после прошивки ещё раз. В официальном мануале это настоятельно рекомендуют сделать.
10. Заходим в панельно по адресу http://192.168.1.1 с логином root и паролем admin. Наслаждаемся новым интерфейсом и настраиваем устройство. :)

Теперь, когда роутер готов к дальнейшей настройке, вам понадобится лишняя USB флешка, которую вы должны засунуть в роутер, и более никогда оттуда не вытаскивать, т.к. там мы будем размещать его программное расширение.

Подобрали флешку? Идём ставить Entware! (не путайте с Optware!!! На Optware мне попался очень глючный Asterisk с которым я бился 2 дня и из трёх версий, которые были в репазитарии, ни одну так и не смог нормально запустить. Segmentation fault и всё тут!)

1) Заходим в панель томато и сразу же в раздел USB and NAS > USB Support.

Тут мы должны включить поддержку USB. Врубаем поддержку всех версий USB, которые только можно включить.

2) Там же, включаем поддержку USB Storage, ставим галочки на всех файловых системах и Automount. Если принтер и 3g модем использовать не собираетесь – можно выключить. Меньше дров – быстрее грузится. Хотя на практике пока не сравнивал.

В поле «Run after mounting» размещаем следующий скрипт:

#!/bin/sh
/opt/etc/init.d/rc.unslung start

Он будет инициализировать сервисы (демоны) Entware после того, как раздел будет смотрирован.

В поле «Run before unmounting»:

#!/bin/sh
/opt/etc/init.d/rc.unslung stop
sleep 15
for i in `cat /proc/mounts | awk ‘/ext3/{print($1)}’` ; do
mount -o remount,ro $i
done

Этот скрипт безопасно (скорее всего) остановит сервисы, при извлечении usb носителя или перезагрузке устройства.

3) Далее, идём в раздел Administration→Scripts, выбираем таб «init» и вбиваем туда строку, которая будет монтировать нашу флешку в раздел /opt при загрузке, если на ней будет обнаружен раздел с меткой ENTWARE

echo ”LABEL=ENTWARE /opt ext3 rw,noatime 1 1” >> /etc/fstab

4) Теперь нам нужно отформатировать накопитель. Флешка уже воткнута? Ок. Логинимся на ssh к роутеру любым удобным клиентом и выясняем имя нашего накопителя, набрав команду mount

root@router:/tmp/home/root# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=127780k,nr_inodes=31945,mode=755)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
devfs on /dev type tmpfs (rw,noatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock5 on /jffs type jffs2 (rw,noatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
/dev/sda1 on /tmp/mnt/…

В последней строке листинга мы видим имя устройства /dev/sda1, которое нас и интересует.

Если флешка разбита иным образом, и на ней несколько разделов, рекомендую пройтись fdisk’ом и грохнуть лишнее, иначе далее додумывайте инструкцию сами. ;)

5)Форматируем раздел sda1 в ext3.

Не забудьте забрать с флешки нужную инфу, т.к. она будет уничтожена!

root@router:/tmp/home/root# umount /dev/sda1
root@router:/tmp/home/root# mkfs.ext3 -L ENTWARE /dev/sda1

Оставляем всё предложенное в процессе форматирования по умолчанию, жмём пару раз enter и дожидаемся окончания процесса…

6) Всё готово? Ну тогда выполняем пару строк в консоли, дабы не перезагружать. При следующей загрузке они выполнятся автоматически, т.к. это уже прописано в скрипте инициализации.

echo “LABEL=ENTWARE /opt ext3 rw,noatime 1 1” >> /etc/fstab
mount /opt

7) (на всякий случай)
Проверяем, всё ли смонтировалось как надо:

root@router:/tmp/home/root# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=127780k,nr_inodes=31945,mode=755)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
devfs on /dev type tmpfs (rw,noatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock5 on /jffs type jffs2 (rw,noatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
/dev/sda1 on /opt type ext3 (rw,noatime,errors=continue,barrier=0,data=ordered)

Последняя строка говорит о том, что раздел /opt на месте и можно начать установку Entware.

8) Скачиваем и запускаем скрипт установки:

wget http://qnapware.zyxmon.org/binaries-armv7/installer/entware_install_arm.sh
chmod +x ./entware_install_arm.sh
./entware_install_arm.sh

9) Если установка прошла удачно, то перезаходим на ssh и начинаем работать с новым пакетным менеджером opkg. Для начала, обновим список пакетов:

root@router:/tmp/home/root# opkg update
Downloading http://qnapware.zyxmon.org/binaries-armv7/Packages.gz.
Updated list of available packages in /opt/var/opkg-lists/packages.

Установка ASTERISK

Теперь у нас есть нормальный пакетный менеджер с репозитарием, в котором есть готовые пакеты Asterisk под процессор ARM.

1) Ставим Asterisk и его детальки:

root@router:/tmp/home/root# opkg install asterisk11 asterisk11-app-system asterisk11-pbx-dundi

2) Тут у нас возникает один небольшой косяк… Дело в том, что по какой то непонятной причине, пакет с вебмордой asterisk-gui в Entware отсутствует. Он есть в Optware, но к сожалению оба репозитария одновременно использовать, судя по всему, не получится. Да и не нужно.
Качаем пакет с вебмордой к себе на комп вот отсюда и распаковываем его любым архиватором. В пакете мы можем увидеть дерево каталогов, куда всё и должно было поставиться на живой системе. Так вот, воссоздаём точно такое же дерево в разделе /opt, и кладём туда содержимое архива: то есть саму вебморду. Кроме того, в файле control можно найти зависимости пакета, которые мы легко можем поставить вручную:

opkg install procps coreutils grep tar

3) Если всё сделано правильно, то в директории /opt/var/lib/asterisk/
У нас появились папки gui_backups, scripts и static-http. Это и есть веб интерфейс астериска.

переходим к настройке веб доступа к астериску:

1) Заходим в папку с файлами конфигурации

cd /opt/etc/asterisk/

Видим там много всяких разных непонятных файлов. Нам пока нужно отредактировать только два из них.

2) Открываем файл http.conf и подправляем в нём следующие строки:

[general]
enabled = yes
enablestatic = yes
bindaddr = 192.168.1.1 ; Адрес роутера. Можно указать 0.0.0.0 и тогда панель будет доступна на всех интерфейсах.
bindport = 8088; Порт.
prefix = asterisk; префикс в URL. Он будет светиться в адресе панели.

Сохраняем и закрываем конфиг.

3) Открываем manager.conf и правим следующие строки:

[general]
enabled = yes
webenabled = yes

port = 5038
bindaddr = 0.0.0.0

…… тут куча текста, которую мы пропустим …….

;[mark]
;secret = password
[admin]
secret = mypassword

……. и тут ещё немного ……..

read = all
write = all,originate

сохраняем файл.

4) Запускаем астериск:

/opt/etc/init.d/S31asterisk11 restart

Скрипт запуска может называться как то иначе, но он там всё равно есть.

5) Если всё ок, то можно зайти в веб панель управления asterisk по адресу:

http://192.168.1.1:8088/asterisk/static/config/index.html

Логин admin, пароль mypassword, если не поменяли в конфиге. А стоило бы поменять. :)

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

7) Зайдите в раздел Dial Plans панели и создайте новый план со всеми имеющимися правами. Теперь заходим в раздел Users и создаём как минимум троих. Двое из них — это юзеры, через которых будет работать наш FXO шлюз. Допустим их ID 6000 и 6002.

Создаём юзера с ID 6000, назначаем ему произвольное имя (например LINKSYS) и уже созданный нами DialPlan1. Убираем галочку IAX и устанавливаем ему пароль, например pass1. Этот пользователь будет установлен в Line1 для linksys. Подробности позже…

Теперь очередь юзера 6001. Этого мы создаём для себя. Схема приблизительно та же. Можно сразу же прикрутить его к смартфону на андроиде прямо в стандартной звонилке, или к любому софтофону или к VoIP трубке, если такая имеется.
Ну и наконец юзер 6002. Этот юзер для PSTN линии. То есть, через него будет роутаться аналоговая линия, воткнутая в шлюз. Этому юзеру не нужно назначать DialPlan, т. к. он у нас совсем для других целей. Всё остальное так же: выключаем IAX, ставим пароль.

Настройка шлюза Linksys

Тут начинается самое весёлое! От одного только взгляда на обилие настроек этого устройства становится немного не по себе. :) Но без паники! Большинство этих настроек трогать пока не нужно.

И так, поехали:

Если у вас чистый не настроенный девайс, пропустите этот шаг.

Если же, по каким-то причинам вы не помните пароль, или давно установленный адрес утройства, или так накрутили настройки, что лучше всё начать с нуля — просто сбросьте его на заводские установки.

Делается это так:

Подключите телефон к FXS порту, отключив всё остальное. Запустите устройство и дождитесь его загрузки. Войдите при помощи телефона, подключенного к FXS-порту, в конфигурационное голосовое меню, набрав ****. Там вы должны услышать стандартное приветствие «Linksys configuration  menu. Please enter option followed by the pound key or hang-up to exit» Прослушав сообщение, введите комбинацию 73738, подтвердите сброс настроек, нажав клавишу 1 и повесьте трубку. Аппарат должен перезапуститься и вернуться к заводским настройкам.

1) Подключаем шлюз через порт LAN к компу. По умолчанию роутер висит на адресе 192.168.0.1 и ничего по DHCP не раздаёт, по этому, прописываем 192.168.0.2 на своём сетевом интерфейсе и заходим на http://192.168.0.1/. Пароль по умолчанию отсутствует. В правом верхнем углу нажимаем «Admin Login» и «Advanced». Проверяем версию прошивки в Voice → Info. Обновляем с сайта Cisco, если есть что-то посвежее. У меня на текущий момент стоит 5.2.13(GW002) и она точно работает.

2) Устанавливаем пароль. Voice -> System -> Admin Password и User Password. После нажатия кнопки Submit all Changes, устройство спросит пароль. Логины «admin» или «user».

3) Настраиваем сеть.
Заходим в настройки Router — WAN Setup, указываем:
Connection type: Static IP
Static IP: 192.168.1.91 (выбираете IP адрес устройства)
Netmask: 255.255.255.0 (маска сети)
Gateway: 192.168.1.1 (IP шлюза)
Enable WAN Web Server: Yes (чтоб иметь доступ к веб интерфейсу)
Жмем «Submit all changes»

4) Переключаем кабель из LAN в WAN, перезаходим в панельку с новонастроенным адресом.

5) Далее пойдут скриншоты, т. к. настроек очень много и я уже не помню, что именно я трогал. :) Сверяемся со скриншотами и настраиваем так же. Если на скринах что-то отсутствует, значит там просто ничего не нужно менять.

reg

Вот тут важно знать: настройки Caller ID Method и Caller ID FSK Standard влияют на определение номера. Под мою АТС подошли вот эти настройки.

sip

Тут я вроде даже ничего и не менял, но на всякий случай можно сверить настройки.

Секция Line 1:

l1.1

Тут должно быть так, как на картинке. Пароль ставите тот же, что для пользователя 6000 в астериске.

l1.2

Секция PSTN:

p.1

вот тут надо быть повнимательнее. Чуть что не правильно – линия будет вести себя неадекватно. Например, снимать трубку при входящем звонке и утаскивать этот вызов куда-то в гипер пространство.

Прописываем юзера 6002 и его пароль.

p.2в Dial Plan 8 можно прописать свой рельный номер городской линии, к примеру. Или что-нибудь от балды. Если определение CallerID не сработает, то передастся именно этот номер.

p.3Обратите особое внимание на секцию International Control. Тут настраиваются физические параметры линии. Об этом лучше на всякий случай почитать более подробно в интернете, но чаще всего подходят вот такие настройки. Кстати, от Ring Validation Time и двух параметров ниже зависит, будет ли нормально определяться CallerID. До последнего момента не мог понять, почему не определяются номера, пока не нашёл эту информацию.

теперь вернёмся к настройке сервера…

Допиливаем конфиги Asterisk

Теперь, когда аппаратная часть готова к запуску, осталось лишь объяснить астериску, как обрабатывать звонки (входящие и исходящие) со шлюза.

1) Открываем из папки /opt/etc/asterisk/ файл extensions.conf и добавляем туда экстеншаны для обработки исходящих звонков с сип абонентов в город через шлюз:

[CallingRule_gorod]
exten = _NXXXXXX,1,Dial(SIP/6002/${EXTEN},60)
exten => _NXXXXXX,n,Hangup
exten = _0XXXXXXXXX,1,Dial(SIP/6002/${EXTEN},60)
exten => _0XXXXXXXXX,n,Hangup

N = [2-9] | X=[0-9] | . = любые символы | цифры = цифры. Подробнее можно почитать о паттернах в документации к астериску.

В данном случае у нас шаблон с именем gorod говорит о том, что нужно обрабатывать _NXXXXXX, тобишь, семизначные номера, у которых первая цифра не меньше двойки (дабы не дать абоненту позвонить по межгороду и т. д. Так вот, в данном случае обрабатываются два типа набора номера с двумя разными шаблонами. Единичка после паттерна говорит о приоритете строки правила, буковка n о том, что оно NEXT, то есть следующее за предыдущим. Далее, в правиле указано, что при наборе номера с таким паттерном звонок будет переназначен на SIP номер 6002, который у нас настроен на PSTN линии. Следующая часть «/${EXTEN}» отвечает за то, чтобы после соединения с номером 6002 ему было приказано набрать номер, на который нужно было дозвониться в город. При желании, можно изменять фактически набираемый номер (к примеру, можно обрабатывать коды, или прилепить туда цифру для выхода в сеть МГТС, если к примеру, линия не прямая).
Число 60 указывает на время, в которое ожидается принятие звонка. Если звонок принят не был, то по таймауту сработает следующее правило exten => _NXXXXXX,n,Hangup, которое, как видно из содержимого просто «положит трубку».

2) Теперь находим контекст [public] в том же конфиге. Этот контекст назначен по-умолчанию для обработки всех входящих (incoming) вызовов. В том числе и с линии PSTN. Но если для внутренних входящих правила уже созданы по-умолчанию, то PSTN у нас пока никак не обрабатывается, а значит ходит мимо. :)

Добавляем следующие строчки прямо в начало контекста:

exten => _XXXXXX.,1,Dial(SIP/6001,60)
exten => _XXXXXX.,n,Hangup()

Тут паттерн принимает всё, у чего номер длиннее 6 цифр (точка в конце даёт паттерну wildcard, так сказать.)
В моей сети кроме городских номеров других таких быть не может, по этому такой грубый паттерн мне вполне подойдёт. Правило перекидывает звонок прямо на мой мобильник, на котором настроен номер 6001. Тут можно навыдумывать кучу разных вещей, прикрутить IVR или автоответчик, но об этом я тут рассказывать не буду. :)

3) сохраняем этот конфиг.
4) заходим опять на ssh роутера и набираем там следующее:

asterisk -r

Откроется консоль астериска, в которой нужно выполнить команду

core reload

Таким образом мы перезагружаем конфигурацию астериска. И она, обновлённая, попадает в том числе в gui.

5) Заходим опять в панельку астериска и в разделе Dial Plans редактируем созданный нами план. Тут теперь нужно отметить галочку на нашем правиле для исходящих звонком, чтобы их обработка была включена для пользователей, к которым этот план применяется.

Имейте в виду, что если в настройке PSTN выключить опцию PSTN Ring Thru Line 1 (а line – это по сути аналоговая трубка, являющаяся SIP клиентом, благодаря FXS порту) то звонок на line 1 с PSTN можно перебросить через те же самые шаблоны в конфигурации asterisk.

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

UPD.

Обязательно проследите, чтобы у юзера для PSTN не было в конфиге собственного CallerID, иначе он будет передавать его, вместо того, что определилось при входящем звонке!

Рекомендую после настройки в панельке уже ничего не менять, поскольку она может навредить существующей конфигурации.