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

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

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

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

Дайте свою оценку данной инструкции


Поделитесь этой инструкцией со своими друзьями

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

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