Создаём мини-АТС для звонков по России из-за границы
Друзья, всем нам приходилось бывать за границей и звонить на российские телефоны находясь в роуминге. Как вы знаете, цены на такие звонки оставляют желать лучшего, и мы ограничиваем себя звонками в 1-2 минуты, чтобы сказать самое важное. Сегодня я покажу вам способ, при котором вам нужен будет только интернет, чтобы совершать звонки на российские телефоны по локальным тарифам.
Что вам понадобится:
- Домашний сервер на CentOS 7 без графического интерфейса (GUI)
- Сервер IP-телефонии Asterisk, установленный на CentOS 7
- OpenVPN сервер, установленный на CentOS 7
- Бесплатные сертификаты шифрования от LetsEncrypt
- Фиксированный IP-адрес домашнего роутера (нужно получить у провайдера)
- Доменное имя связанное с IP-адресом домашнего роутера
- Bluetooth передатчик Espada ESM07
- Мобильный телефон с встроенным Bluetooth модулем (далее GSM-шлюз)
- Сим-карта Tele2 или другого мобильного оператора
- Приложение OpenVPN для Android
- Приложение CsipSimple для Android
Шаг 1 : Установка сервера на Linux
Друзья, чтобы не повторяться, приведу ссылку установки сервера на CentOS, которая обсуждалась в предыдущей инструкции:
Установка подразумевает использование домашнего сервера в качестве платформы для сервера телефонии Asterisk.
Шаг 2 : Установка Nginx для автоматического получения сертификата LetsEncrypt
Открываем терминал на сервере либо напрямую (подключив клавиатуру и монитор), либо через другой компьютер через протокол SSH.
Деактивируем SELinux:
sudo setenforce 0
Добавим порты 80 и 443 в Firewalld:
sudo firewall-cmd --add-port=80/tcp --permanent --zone=public sudo firewall-cmd --add-port=443/tcp --permanent –zone=public
Перезагрузим правила:
sudo firewall-cmd —reload
Вам также нужно будет сделать проброс портов (80 и 443) с вашего домашнего роутера до локального IP-адреса вашего сервера. Пример проброса портов на роутере от Asus можно посмотреть здесь.
Установим Nginx:
sudo yum install nginx
Открываем файл nginx.conf:
sudo nano /etc/nginx/nginx.conf
Удаляем из него все строки и вставляем следующее:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { client_max_body_size 256M; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; server_names_hash_bucket_size 64; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server_tokens off; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { index index.php index.html index.htm; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
Сохраняем файл.
В папке /etc/nginx/conf.d/ создаем файл domain.ru.conf:
sudo nano /etc/nginx/conf.d/domain.ru.conf
И добавляем в него строки:
server { listen 80; server_name domain.ru; set $root_path /var/www/domain.ru/html; root $root_path; }
domain.ru – будет ваше собственное доменное имя.
Также создадим папку сервера:
mkdir /var/www/domain.ru/html/ mkdir /var/www/domain.ru/log/ sudo chown -R nginx:nginx /var/www/domain.ru/html/ sudo chown -R nginx:nginx /var/www/domain.ru/log/
Стартуем nginx и добавляем его в автозагрузку:
sudo systemctl start nginx sudo systemctl enable nginx
Шаг 3 : Связываем доменное имя с фиксированным IP-адресом роутера.
На сайте регистратора доменного имени в Вашей учётной записи нужно будет добавить запись типа A и связать её с фиксированным IP-адресом вашего роутера:
Шаг 4 : Получение сертификата от LetsEncrypt
Ставим LetsEncrypt и получаем секретный и публичный ключ:
sudo yum install certbot python2-certbot-nginx sudo certbot --nginx
В терминале следуем указаниям помощника.
Снова открываем файл domain.ru.conf:
sudo nano /etc/nginx/conf.d/domain.ru.conf
стираем все и вставляем в него следующее содержимое:
server { listen 80; server_name domain.ru; return 301 https://domain.ru$request_uri; } server { listen 443 ssl; server_name domain.ru; set $root_path /var/www/domain.ru/html; ssl_certificate /etc/letsencrypt/live/domain.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.ru/privkey.pem; access_log /var/www/domain.ru/log/nginx-ssl-requests.log; error_log /var/www/domain.ru/log/nginx-ssl-error.log; root $root_path; }
Друзья, ещё раз напоминаю, что domain.ru – будет ваше собственное доменное имя.
Создадим файл index.html:
sudo nano /var/www/domain.ru/html/index.html
И вставим в него следующее
<h1>It works</h1>
Сохраним файл.
Перезагрузим nginx:
sudo systemctl restart nginx
Пробуем зайти в браузере по адресу:
https://domain.ru
Если все настроено правильно, вы увидите страничку с защищённым TLS соединением (значок замка в адресной строке браузера Chrome).
Т.к. срок действия сертификата от LetsEncrypt истекает через три месяца, его придётся периодически обновлять. Чтобы это не делать каждый раз вручную, добавим автоматическое обновление в CRON (автоматическое выполнение скриптов по расписанию):
sudo nano /etc/crontab
И вставим в конец файла следующее:
0 0 * * * root /usr/bin/certbot renew >> /var/log/certbot-cron.log 2>&1
Сохраним файл.
Шаг 5 : Установка OpenVPN
Если Ваш сервер будет находится за NATом (т.е. в домашней сети, подключенный к вашему роутеру), то скорее всего возникнет проблема с передачей голоса по Asterisk, т.к. настройка Asterisk за NATом очень капризная. Вы можете наблюдать следующую картину — собеседник будет вас слышать, а вы его нет. Я потратил не один день, чтобы решить данную проблему но так и не смог этого сделать. Самое лучшее решение – поставить бесплатный сервер OpenVPN. Он будет решать сразу три проблемы: первое – полное шифрование данных от вашего Android устройства до сервера, второе – исчезают проблемы с передачей голоса, третье – внешний порт (5060) Asterisk на роутере будут закрыт, а значит хакеры не смогут подбирать пароли методом brute force.
Заходим в терминал сервера и установим пакет OpenVPN совместно с вэб-админкой:
yum -y install https://as-repository.openvpn.net/as-repo-centos7.rpm yum -y install openvpn-as
Зададим пароль для пользователя openvpn в терминале:
sudo passwd openvpn
Добавим службу OpenVPN, порт 943, порт 1194 и masquerade в Firewalld:
sudo firewall-cmd --zone=public --permanent --add-service openvpn sudo firewall-cmd --zone=public --permanent --add-port=943/tcp sudo firewall-cmd --zone=public --permanent --add-port=1194/udp sudo firewall-cmd --zone=public --permanent --add-masquerade
Перегружаем правила:
sudo firewall-cmd –reload
Перезапустим openvpnas:
sudo systemctl restart openvpnas
После этого заходим по адресу https://192.168.0.107:943/admin/
Логин: openvpn
Пароль: ранее созданный пароль
В админке заходим в меню Network Settings и в “Hostname or IP Address” вводим доменное имя domain.ru. Жмём Save Settings.
Далее, создадим файл openvpn.sh (это нужно для автоматического импортирования сертификатов LetsEncrypt в OpenVPN):
sudo nano /root/openvpn.sh
И вставим в него следующее содержимое:
#!/bin/bash /usr/local/openvpn_as/scripts/sacli --key "cs.priv_key" --value_file "/etc/letsencrypt/live/domain.ru/privkey.pem" ConfigPut /usr/local/openvpn_as/scripts/sacli --key "cs.cert" --value_file "/etc/letsencrypt/live/domain.ru/fullchain.pem" ConfigPut /usr/bin/cat /etc/letsencrypt/live/domain.ru/fullchain.pem /etc/letsencrypt/live/domain.ru/privkey.pem > /etc/letsencrypt/live/domain.ru/bundle.pem /usr/local/openvpn_as/scripts/sacli --key "cs.ca_bundle" --value_file "/etc/letsencrypt/live/domain.ru/bundle.pem" ConfigPut /usr/local/openvpn_as/scripts/sacli start /usr/bin/systemctl restart openvpnas
Сохраним файл.
Сделаем файл исполняемым:
sudo chmod +x /root/openvpn.sh
Добавим файл в CRON:
sudo nano /etc/crontab
И вставим в конце файла следующее:
5 0 * * * root /root/openvpn.sh
Сохраним файл.
Запустим файл openvpn.sh:
cd /root sudo ./openvpn.sh
После этого сертификаты от LetsEncrypt автоматически импортируются в OpenVPN.
Далее, нужно зайти в роутер и сделать проброс портов 943 (TCP) и 1194 (TCP,UDP) до локального IP-адреса вашего сервера.
Если все прошло успешно, то в OpenVPN можно будет зайти по адресу вашего доменного имени. В браузере вводим адрес:
https://domain.ru/943/admin/
В domain.ru подставляем ваше доменное имя. Соединение должно быть защищённым (значок замка слева от адреса в браузере Chrome).
Если все прошло успешно, можно начинать тестировать соединение через OpenVPN через приложение на смартфоне.
Установите приложение OpenVPN для Android на вашем основном смартфоне и введите регистрационные данные:
При установке соединения проверьте ваш IP-адрес, открыв браузер Chrome на смартфоне и набрав адрес:
Адрес должен совпадать с внешним фиксированным IP-адресом вашего роутера.
Шаг 6 : Установка Bluetooth передатчик Espada ESM07
Установим Bluetooth передатчик в USB разъем сервера и установим необходимые пакеты через терминал:
sudo yum install bluez bluez-libs bluez-libs-devel bluez-tools
Выполним команду, чтобы проверить, определила ли система Bluetooth передатчик:
hcitool dev
В выводе команды вы должны увидеть подобное:
hci0 XX:XX:XX:XX:XX:XX
XX:XX:XX:XX:XX:XX – MAC-адрес вашего Bluetooth передатчика
Скопируйте и сохраните эти данные в файл, они нам понадобятся позже.
Если Bluetooth передатчик не определился, нужно сделать следующее:
Вводим в терминале:
hciconfig -a
И узнаем имя интерфейса Bluetooth передатчика. В моем случае это hci0.
Вручную включаем это устройство:
sudo hciconfig hci0 up
Далее, открываем файл:
sudo nano /etc/bluetooth/main.conf
И меняем параметр AutoEnable с false на true:
[Policy] AutoEnable=true
Перегружаем сервер и проверяем, определился ли Bluetooth передатчик. Если он по-прежнему не определяется автоматически нужно сделать следующее.
Создаём файл 10-local.rules:
sudo nano /etc/udev/rules.d/10-local.rules
И вставляем в него следующее:
ACTION=="add", KERNEL=="hci0", RUN+="/usr/bin/hciconfig hci0 up"
Сохраняем файл, перегружаем сервер и проверяем, что Bluetooth передатчик определился автоматически.
Далее, включаем Bluetooth на GSM-шлюзе и переводим его в режим обнаружения.
В терминале вводим команду:
hcitool scan
Вы дожны увидеть что-то подобное:
Scanning ... XX:XX:XX:XX:XX:XX SM-G900H
Где XX:XX:XX:XX:XX:XX – MAC-адрес вашего GSM-шлюза
Скопируйте и сохраните эти данные в файл, они нам понадобятся позже.
Шаг 7 : Установка bluetooth соединения между сервером и GSM-шлюзом
Открываем терминал и вводим команду:
sudo rfkill unblock bluetooth
Далее, вводим команду:
bluetoothctl
После этого строка в терминале изменится на [bluetooth]#
Далее, вводим команды:
agent KeyboardOnly default-agent power on devices scan on
Убеждаемся, что в списке присутствует наш GSM-шлюз и его MAC-адрес.
Далее, сопрягаем GSM-шлюз с сервером:
pair XX:XX:XX:XX:XX:XX
Где XX:XX:XX:XX:XX:XX – MAC-адрес вашего GSM-шлюза
После ввода этой команды на экране GSM-шлюза появится диалоговое окно с кодом подтверждения, который нужно ввести в терминале:
Request passkey [agent] Enter passkey (number in 0-999999): 662680 Pairing successful
Проверяем еще раз, что смартфон сопряжён с сервером:
paired-devices
Далее, вводим команду:
trust XX:XX:XX:XX:XX:XX
Выходим из bluetoothctl:
exit
Далее, открываем файл dbus-org.bluez.service:
sudo nano /etc/systemd/system/dbus-org.bluez.service
И к строке ExecStart=/usr/lib/bluetooth/bluetoothd добавляем —compat, чтобы в итоге выглядело вот так:
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
Также, после этой строки нужно добавить ещё одну строку:
ExecStartPost=/bin/chmod 777 /var/run/sdp
Сохраняем файл и перезагружаем менеджер конфигурации systemd:
sudo systemctl daemon-reload
Перезагрузим системный процесс bluetooth:
sudo systemctl restart bluetooth
Шаг 8 : Установка АТС Asterisk
Asterisk версии 16 будем устанавливать из исходников т.к. в нем меньше багов, больше стабильность работы, а компилированная версия из репозиториев CentOS идёт 11-й версии.
Устанавливаем необходимые зависимости:
sudo yum install wget net-tools sudo yum groupinstall "Development Tools" sudo yum install libedit-devel sqlite-devel psmisc gmime-devel ncurses-devel libtermcap-devel sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel uuid-devel libtool libuuid-devel subversion kernel-devel kernel-devel-$(uname -r) git subversion kernel-devel crontabs cronie cronie-anacron
Скачиваем исходники Asterisk:
cd /usr/src/ sudo wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz sudo tar xvfz asterisk-16-current.tar.gz sudo rm -f asterisk-16-current.tar.gz cd asterisk-* sudo ./configure --libdir=/usr/lib64
Если все прошло хорошо, то в терминале вы увидите:
configure: Menuselect build configuration successfully completed
Зададим параметры меню настройки, выполнив следующую команду:
sudo make menuselect
Заходим в Add-ons.
Выбираем chan_ooh323 и format_mp3
Нажимаем Esc, чтобы выйти в главное меню.
Далее, заходим в Core Sound Packages:
Выбираем аудио-форматы, как на картинке:
Нажимаем Esc, чтобы выйти в главное меню.
Далее, заходим в Music On Hold File Packages и отмечаем как на картинке:
Нажимаем Esc, чтобы выйти в главное меню.
Заходим Extras Sound Packages и выбираем пункты меню:
Нажимаем Esc, чтобы выйти в главное меню.
Заходим в Applications и отмечаем звёздочкой пункт меню app_macro.
Нажимаем Esc два раза и видим такое меню
Сохраняем настройки, нажав S.
Теперь выполните следующую команду, чтобы загрузить библиотеку mp3-декодера в исходники.
sudo contrib/scripts/get_mp3_source.sh
Начинаем компиляцию Asterisk:
sudo make sudo make install sudo make samples sudo make config sudo ldconfig
Создайте отдельного пользователя и группу для запуска служб asterisk и назначьте правильные разрешения:
sudo groupadd asterisk sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk sudo usermod -aG audio,dialout asterisk sudo chown -R asterisk.asterisk /etc/asterisk sudo chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk sudo chown -R asterisk.asterisk /usr/lib64/asterisk
Установите пользователя по умолчанию для Asterisk:
sudo nano /etc/sysconfig/asterisk
и добавьте в файл:
AST_USER="asterisk" AST_GROUP="asterisk"
Также для файла asterisk.conf:
sudo nano /etc/asterisk/asterisk.conf
Добавим строки:
runuser = asterisk rungroup = asterisk
Далее, перезапустим службу Asterisk:
sudo systemctl restart asterisk
и убедимся, что она работает:
sudo systemctl status asterisk
Сделаем автоматический запуск Asterisk после загрузки CentOS:
sudo systemctl enable asterisk
Далее, заходим в интерфейс командной строки Asterisk:
sudo asterisk -r
Загрузим модуль chan_mobile, если он ещё не загружен:
module load chan_mobile.so
Далее, набираем:
mobile search
Вы должны увидеть что-то подобное:
Address Name Usable Type Port XX:XX:XX:XX:XX:XX SM-G900H Yes Phone 1
Ваш номер порта может отличаться.
Далее, открываем файл chan_mobile.conf:
sudo nano /etc/asterisk/chan_mobile.conf
Удаляем из него все строки и вставляем следующее:
[general] interval=10 [adapter] address = XX:XX:XX:XX:XX:XX ; MAC-адрес Bluetooth передатчика forcemaster=yes id = Dongle rxgain=4 txgain=4 [SM-G900H] address = XX:XX:XX:XX:XX:XX ; MAC-адрес GSM-шлюза port = 1 ; Номер порта context = from-phone adapter = Dongle
Сохраняем файл.
Открываем файл sip.conf:
sudo nano /etc/asterisk/sip.conf
Удаляем из него все строки и вставляем следующее:
[general] context=public allowguest=no match_auth_username=yes allowoverlap=no bindaddr=0.0.0.0:5060 udpbindaddr=0.0.0.0:5060 tcpenable=yes tcpbindaddr=0.0.0.0:5060 transport=udp srvlookup=no qualifyfreq=60 alwaysauthreject = yes subscribecontext = default localnet=192.168.0.0/255.255.0.0 externrefresh=180 nat=no icesupport = yes transport=udp,tcp [internal](!) type = friend directmedia=no host = dynamic context = home dtmfmode = rfc2833 canreinvite = no qualify = yes allow=!all,ilbc,g729,gsm,g723,ulaw,alaw [alex](internal) ; Измените alex на собственное имя пользователя defaultuser=alex ; Измените alex на собственное имя пользователя secret = Password ; Ваш пароль
Сохраняем файл и открываем файл extensions.conf:
sudo nano /etc/asterisk/extensions.conf
Удаляем из него все строки и вставляем следующее:
[from-phone] exten => s,1,Answer exten => s,2,Dial(SIP/alex,25) exten => s,n,Hangup [home] exten => _.,1,Dial(MOBILE/SM-G900H/${EXTEN},60) exten => _.,n,Hangup()
Сохраняем файл.
Добавляем порт 5060 в firewalld:
sudo firewall-cmd --add-port=5060/tcp --permanent --zone=public sudo firewall-cmd --add-port=5060/udp --permanent –zone=public
Перезагрузим правила:
sudo firewall-cmd --reload
Перезапустим Asterisk:
sudo systemctl restart asterisk
Еще раз зайдем в интерфейс командной строки Asterisk
sudo asterisk -r
И проверим, подключён ли наш GSM-шлюз:
mobile show devices
Вы должны увидеть что-то подобное:
ID Address Group Adapter Connected State SMS SM-G900H XX:XX:XX:XX:XX:XX 0 Dongle Yes Free No
Шаг 9 : Настройка приложения CsipSimple
Скачайте приложение CsipSimple отсюда и установите его на вашем смартфоне.
Запустите OpenVPN на вашем основном смартфоне.
Запускаем CsipSimple и нажимаем на иконку ключа (внизу слева):
Нажимаем Add account и выбираем в самом низу Basic:
В Account name вводим название аккаунт, например, Phone Gateway. В поле User вводим имя пользователя, например, alex . В поле Server вводим локальный IP вашего сервера и порт, например, 192.168.0.15:5060. В поле Password вводим ваш пароль.
После сохранения настроек вы увидите следующую картинку:
Далее, зайдите в номеронабиратель и попробуйте сделать тестовый звонок на другой номер.
Друзья, на этом все. Теперь у вас появился полноценный GSM-шлюз, через который вы можете звонить на российские номера по локальным тарифам, находясь в любой точке мира! Вы также сможете принимать звонки через CsipSimple, если вам будут звонить на номер сим-карты, установленной в GSM-шлюзе.
Profit :)
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!