Создаём мини-АТС для звонков по России из-за границы

Друзья, всем нам приходилось бывать за границей и звонить на российские телефоны находясь в роуминге. Как вы знаете, цены на такие звонки оставляют желать лучшего, и мы ограничиваем себя звонками в 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, которая обсуждалась в предыдущей инструкции:

Создаём ТВ-сервер дома на Linux

Установка подразумевает использование домашнего сервера в качестве платформы для сервера телефонии 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-адресом вашего роутера:

Скриншот с REG.ru

Скриншот с REG.ru

Шаг 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 на смартфоне и набрав адрес:

https://www.whatismyip.com/

Адрес должен совпадать с внешним фиксированным 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 :)

Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!

Регистрация на сайте

Оставьте свой отзыв

Вы должны Войти, чтобы оставлять отзывы.