Лето, отпуск, asterisk или сам себе VoIP оператор

в 17:54, , рубрики: android, asterisk, diy или сделай сам, linux, voip, метки: , , , ,
Лето, отпуск, asterisk

Собрался я вместе со своим товарищем в период летнего отпуска поколесить на авто по Европе. А серой осенью есть мысли отправиться поближе к экватору. И вполне резонно встал вопрос связи. Skype, ICQ и прочие сервисы это конечно хорошо, но только не для старшего поколения. Жена и друзья без вопросов, а родители? Супруга сразу же сказала что передастом (человек который передает что-либо) быть не желает. Еще неплохо было бы свой номер рабочим оставить, чтоб у людей не было ощущения, что я канул в небытие. Опять же учитывая непростую роуминговую тарификацию наших операторов сотовой связи, в которой разбираться у меня нет никакого желания, сформировалось представление того, что я хочу получить в итоге.

  1. Звонки из любой точки мира по местным тарифам
  2. Прием звонков на свой личный номер
  3. Голосовые сообщения если я не доступен
  4. Голосовая почта
  5. Прием и передача смс
  6. Безопасность соединения

Выбор программного обеспечения

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

GSM шлюз это конечно хорошо, но даже goip это 12 тыс.руб. и более. Поэтому единственный вариант который мне показался приемлемым это chan_dongle и парочка huawei.

Прием и передача смс это либо jabber, либо электронная почта.

Безопасность отдельная тема. Так как админ из меня так себе, то все таки считаю что не замечательно будет, если астериск голой попой на всеобщее обозрение выставить. Если к астериску подключатся с ноутбука, то в общем то без разницы какой будет VPN. Но это же не правильно и не удобно каждый раз доставать ноут. А учитывая что у меня неистовая любовь к андроиду, я изучил маркет на предмет vpn клиентов и на своего старичка galaxy s поставил OpenVPN.

Итак, приступим

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

Так как на хабре предпочитают jedi way и не любят стандартные маны по установке, будем ставить астериск 11 ручками и спрячем подробности под спойлеры. OpenVPN будем ставить как смертные. Выбор 11 астериска обусловлен новым модулем xmpp, в котором появилась возможность обрабатывать входящие сообщения.

Openvpn

Так как решено использовать соединение через OpenVPN а комп с астериском будет стоять на работе за натом, то будем использовать внешний VPN сервер. Для личных нужд у меня имеется сервачек у немцев. Но в принципе не будет хуже, если использовать что ни будь наше. Селектел мне понравился (ни разу не реклама), все интуитивно понятно, разворачивается только в путь. И по затратам вполне гуманно, надо включил, не надо выключил.

В общем, накатываем openVPN на что ни будь торчащее в сеть, в моем случае дебиан.

Для сервера

Ставим OpenVPN

sudo su
aptitude update
aptitude upgrade
aptitude install openvpn

Создадим директорию и скопируем комплект скриптов из примеров:

mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/

Редактируем vars

nano /etc/openvpn/easy-rsa/vars

Я правил:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="REGION"
export KEY_CITY="GLUBINKA"
export KEY_ORG="KROILOVO CORP"
export KEY_EMAIL=”KC@example.ru”

Дальше генерируем сертификаты и переносим в каталог с настройками:

cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
cd keys
openvpn --genkey --secret ta.key
cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Теперь необходимо сгенерировать сертификаты для клиентов

cd /etc/openvpn/easy-rsa/
source vars
./build-key client_name ,где clien_name имя клиента

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

/etc/openvpn/ca.crt
/etc/openvpn/easy-rsa/keys/clien_name.crt
/etc/openvpn/easy-rsa/keys/ clien_name.key
/etc/openvpn/ta.key

Мой server.conf

port 1110
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 192.168.100.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client  #чтоб клиенты видели друг  друга
keepalive 10 120
comp-lzo
max-clients 10
persist-key
persist-tun
status openvpn-status.log
verb 3

Для клиентов linux

Ставим OpenVPN

sudo su
aptitude update
aptitude upgrade
aptitude install openvpn

в /etc/openvpn должны лежать

ca.crt
clien_name.crt
сlien_name.key
ta.key
client_name.conf

Мой client_name.conf

Client
dev tun
proto tcp
remote serverIP 1110
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client_name.crt
key client_name.key
comp-lzo
verb 3

Для клиентов Android

Из google play ставим OpenVPN for Android
Копируем на флешку устройства сертификаты, сгенерированные на сервере
Задаем адрес и порт сервера, добавляем сертификаты и соединяемся.

В итоге получаем все устройства в одной VPN.
У меня получилось 5 устройств:

  1. Сервер OpenVPN
  2. Asterisk
  3. Ноутбук
  4. Телефон
  5. Телефон компаньона
Asterisk

Идем на asterisk.org и в downloads качаем. В тот момент когда я ставил asterisk.org лежал. Поэтому ставил 11.2.1 так как оно на компе валялось. На данный момент доступен 11.4.0. Не думаю что сильно отличается, но changelog не читал.

Установка Asterisk

sudo su
mkdir /usr/src/asterisk
cd /usr/src/asterisk
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.tar.gz
aptitude update
aptitude upgrade

Ставим зависимости

aptitude install build-essential linux-headers-`uname -r` g++ libmysqlclient-dev libxml2-dev libncurses5-dev libsqlite3-dev libssl-dev libsrtp0-dev unixodbc-dev

Так как в планируется использовать jabber, то нужно поставить iksemel и openssl. Без них модуль xmpp не соберется

aptitude install libssl-dev libssl1.0.0 libiksemel-dev libiksemel3

Начинаем ставить

tar xvf asterisk-11-current.tar.gz
cd asterisk-11-current
./configure
make menuselect

Добавил xmpp и ael остальное по дефолту

make
make install

делаем

make samples

чтобы получить дефолтовые конфиги.
делаем

make config 

чтобы астериск запускался демоном.

Chan dongle

Дальше нам нужно собрать chan_dongle. Чудесный проект, который поддерживал товарищ BG2, но толи запал пропал, толи в силу непреодолимых обстоятельств обновлений у проекта не было достаточно давно (что прискорбно) и под 11 астериском оно собираться отказывается напрочь. Но гитхаб нам поможет.

Установка chan_dongle

aptitude install git
cd /usr/src/asterisk
wget https://github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.zip
unzip asterisk11.zip

ну а дальше по мануалу

aclocal
autoconf
automake –a
./configure
Make
Make install

Дальше читаем вики проекта wiki.e1550.mobi и находим модемы из списка поддерживаемых. В моем случае это оказались E1550 и E173. С самими модемами все просто, гуглим на предмет usbmodeswitch ну или под windows переводим в режим только модем через терминал. На моем Е1550 еще потребовалось активировать голосовые функции. В Dongle.conf особых изменений не делал, только добавил IMSI своих симок, по которым модуль будет выбирать ту самую симку, и контекст для входящих.

изменения dongle.conf

context=dongle-incoming
[mts]
imsi=25001xxxxxxxxxx;
exten=911 
[megafon]
imsi=25002xxxxxxxxxx;
exten=921 

теперь в CLI астериска перегружаем модуль и проверяем зацепились ли модемы

dongle reload now
dongle show devices

Если все увиделось и все хорошо то можно приступать к настройке всего этого добра.

Настройка Asterisk

В sip.conf прописываем пользователей

sip.conf

[general]
language = ru;
tcpenable = yes ;
transport = tcp,udp;

[LOCAL-USERS](!)
type = friend ; 
host = dynamic ;
context = from-office ;
disallow = all ; 
allow = ulaw ; 
allow = alaw ; 
allow = gsm ;
monitor = yes ;
callcounter = yes ;
callwaiting = no ;
rtptimeout = 10;
rtpholdtimeout = 20;
dtmfmode = rfc2833 ;
[10](LOCAL-USERS) ;
username = 10 ;
secret = passfor10 ;
[11](LOCAL-USERS) ;
username = 11 ;
secret = passfor11 ;
[12](LOCAL-USERS);
username = 12 ;
secret = passfor12;
[13](LOCAL-USERS);
username = 13 ;
secret = passfor13;
[14](LOCAL-USERS);
username = 14 ;
secret = passfor14;

Cоздаем очередь в queues.conf

queues.conf

[general]
persistentmembers = yes ;
autofill = yes ;
monitor-type = MixMonitor

[WORKGROUP]
strategy = ringall;
ringinuse = yes ;
timeout = 20 ;
retry = 1 ;
maxlen = 0 ; 
member => SIP/10
member => SIP/11
member => SIP/12
member => SIP/13
member => SIP/14

Так как для восприятия более удобным считаю AEL, то диалплан писал исключительно на нем.

Extensions.ael

Globals {
     __TRANSFER_CONTEXT=transfer; //Дефолтовый контекст для перевода звонков
};
context transfer{
        _1X => Dial(SIP/${EXTEN},60,t);   //перевод звонков
}
context from-office {    
        includes {			; //инклудим контексты чтоб кашу не устраивать
                mobile-numbers;
                city-numbers;
                local-users;
        };
};
context mobile-numbers {  ;//все мобильные
        _89XXXXXXXXX =>  Dial(Dongle/s:25002/${EXTEN},,T);  //Кроить дак кроить, звонить будем с рабочего номера :)
};
context city-numbers {   ; //городские
        _XXXXXX => Dial(Dongle/s:25002/${EXTEN},,T);
};
context dongle-incoming {   ;// входящие c chan_dongle
        921 =>  Queue(WORKGROUP,t,,,60); //все входящие с рабочего отправляем в очередь workgroup
        911 =>{  ;// все входящие на личный
            Answer;
            Dial(SIP/10,60,tT); //набираем на андроид
            Dial(SIP/11,60,tT); //набираем на ноут
            Playback(/tmp/ya_v_otpuske); //говорим что я в отпуске 
            Jabbersend(asterisk@jabber_example.ru,grasp@jabber_example.ru,Тебе звонили с номера {CALLERID(num)});   // шлем в jabber номер звонящего
            Hangup;
};
        sms => {
            Jabbersend(asterisk@jabber_example.ru,grasp@jabber_example.ru,${CALLERID(num)} ${SMS});   //в jabber шлем входящие смс
            Hangup();
        };
        ussd => {
            Jabbersend(asterisk@ jabber_example.ru,grasp@jabber_example.ru,${USSD});  // //в jabber шлем входящие ussd
            Hangup();
        };
};
context local-users {
        _500 => { ;  // для записи голосовых файлов
            Wait(2);
            Record(/tmp/ast:wav);
            Wait(2);
            Playback(/tmp/ast);
            Wait(2);
            Hangup;
        };
        _600 => { ; // запрос баланса, ответ придет в jabber
            System(/usr/sbin/asterisk -x 'dongle ussd mts *100#');
            System(/usr/sbin/asterisk -x 'dongle ussd megafon *100#');
        };
        _1X => {
            Dial(SIP/${EXTEN},60,tT);  // Для внутренних звонков
        };
};

На андроиде поставил 2х клиентов 3сх и CSipSimple. Были проблемы со звуком в одну сторону, но разбираться было особенно некогда, поэтому в openVPN поставил галочку “перенаправлять весь трафик через VPN” и все заработало. Проверял через 3G и wifi, работает не заикается.

Для jabber поднял openfire. Думаю описывать не стоит да и можно что то стороннее использовать. В xmpp.conf прописал настройки и все с пол пинка запустилось. OpenFire ставил исключительно из любопытства, так как под него есть плагин для астериска, но это отдельная история. Остается еще прикрутить отправку смс через jabber, но пока еще окончательно не решил действительно ли оно мне надо. Еще надо бы настроить голосовую почту, но вроде тоже пока не сильно актуально, вернусь из отпуска и будет ясно.

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

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

Автор: Grasp

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js