# Лабораторная 6. Развертывание Asterisk

### Цель: 

Получение базовых навыков работы в настройке программной АТС Asterisk.

### Задачи:
1. Подключится к облачной платформе СПбГУТ
0. Скачать исходные файлы Asterisk
0. Скомпилировать Asterisk
0. Настроить Asterisk
0. Запустить Asterisk
0. Зарегистрировать пользователя в программном телефоне Linphone

### Схема виртуального стенда:

<div drawio-diagram="347"><img src="https://docs.resds.ru/uploads/images/drawio/2022-11/IEiwRGspjxRg5AEj-drawing-3-1668594518.png"></div>

### Ход работы:
#### Подготовка стенда
Для прохождения трафика с ***Asterisk***, во внешнюю сеть нам необходимо настроить работу с внешней сетью, для этого нам нужно из узла ***Labnode-2***, сделать маршрутизатор и маршрутизировать трафик, из сети **192.168.0.0/24** во внешнюю сеть.


<span style="color:blue">Перейдите в проект ***[group-name]-[team number]:dpi***</span>


##### Действия на инстансе **Labnode-1**
Для начала нам необходимо проверить включен ли модуль, ядра необходимый для перенаправления трафика
```bash
sysctl net.ipv4.ip_forward
```
> **net.ipv4.ip_forward = 0** - означает, что модуль ядра выключен

Для включения этого параметра необходимо ввести команду:
```bash
sudo sysctl -w net.ipv4.ip_forward=1
```
Проверяем, включился ли модуль пересылки пакетов:
```bash
cat /proc/sys/net/ipv4/ip_forward
```
> Команда аналогична первой команде для проверки работы модуля, в данном случае вам должно быть выведено просто значение **1** 

Введенные выше команды включают работу модуля, только на время пока работает ОС, и при перезагрузке будет сброшено для дефолтного состояния, чтобы это работало и после перезагрузке системы необходимо добавить в для включения этого параметра.
```bash
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
```
Если мы хотим, чтобы правило дописанное нами применилось, стоит ввести команду
```bash
sudo sysctl -p 
```
Выполняем настройку **iptables**
1. Добавим правило позволяющее пакетам, исходящим из сети 192.168.0.0/24 на интерфейсе eth0, проходить через фаервол без дополнительной проверки. 
    ```bash
    sudo iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
    ```
0. Добавим правило, которое разрешает проходить через фаервол пакетам, относящимся к уже установленным и работающим сетевым соединениям, таким как соединения по протоколам TCP или UDP. 
    ```bash
    sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ```
0. Добавим правило, которое разрешает прохождение всех пакетов, относящихся к уже установленному соединению или новому соединению, через интерфейс **eth0** к **eth1**
    ```bash
    sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
    ```
0. Добавим правило, которое разрешает прохождение всех пакетов, относящихся к уже установленному соединению или новому соединению, через интерфейс **eth1** к **eth0**    
    ```bash
    sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
    ```
0. Добавляем правило для включения маскардинге для проходящих через интерфейс ``eth1``
    ```bash
    sudo iptables -t  nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j MASQUERADE
    ``` 
    
   
Возможна необходимость заменить название интерфейсов
|Название интерфейса в примере|К какой сети относится адрес|
|-|-|
|eth1|172.17.32.0/19|
|eth0|192.168.0.0/24|


##### Действие на узле Asterisk
###### Установка Asterisk

Для прохождения трафика во внешнею сеть на **labnode-2** необходимо прописать маршрут по умолчанию через **labnode-1**, для этого нам необходимо ввести команду:
  ```bash
  sudo ip route add 0.0.0.0/0 via 192.168.0.1 dev eth0 
  ```
Нам необходимо подготовить виртуальную машину **labnode-2**, для работы с s3, для этого необходимо выполнить несколько действий, сначала необходимо установить пакет для работы с s3

  ```bash
  sudo apt install s3cmd -y
  ```
  
  После этого нам необходимо скопировать файл конфигурации в домашнию папку пользователя
  ```bash
  cp /var/lib/cloud/s3cfg ~/.s3cfg
  ```
  После этого у нас полноценно работает s3

Скачиваем Астерикс 
  ```bash
  s3cmd get s3://dpi/asterisk-certified-18.9-current.tar.gz
  ```
Распаковываем архив
  ```bash
  tar xvf asterisk*
  ```
Переходим в директорию
  ```bash
  cd asterisk-certified*/
  ```
Добавляем звуки и устанвливаем необходимые компоненты
  ```bash
  sudo apt update
  sudo apt -y install git curl wget libnewt-dev libssl-dev libncurses5-dev subversion libsqlite3-dev build-essential libjansson-dev libxml2-dev  uuid-dev
  sudo contrib/scripts/get_mp3_source.sh
  ```
Устанвливаем зависимости Asterisk
  ```bash
  sudo contrib/scripts/install_prereq install
  ```
Вам будет предложено выбрать [национальный код](https://www.itu.int/oth/T0202.aspx?parent=T0202)



Собираем и устанавливаем Asterisk и заполняем конфигурациями по умолчанию для работы
  ```bash
  sudo ./configure
  sudo make menuselect
  sudo make
  sudo make config
  sudo make install
  sudo make progdocs
  sudo make basic-pbx
  sudo ldconfig
  ```
Добавляем новую группу **asterisk**
  ```bash
  sudo groupadd asterisk
  ```
Создаем пользователя **asterisk**, и указываем ему домашнию директорию **/var/lib/asterisk**
  ```bash
  sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk
  ```
Добавляем пользователя **asterisk** в группы **audio** и **dialout**
  ```bash
  sudo usermod -aG audio,dialout asterisk
  ```
Меняем права и владельцев директорий которые мы используем в процессе работы
  ```bash
  sudo chown -R asterisk:asterisk /etc/asterisk
  sudo chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk
  sudo chown -R asterisk:asterisk /usr/lib/asterisk
  sudo chmod -R 750 /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk
  ```
Приводим **/etc/default/asterisk** к виду
  ```plain
  AST_USER="asterisk"
  AST_GROUP="asterisk"
  COLOR=yes
  ```
Добавляем строки в **/etc/asterisk/asterisk.conf** 
  ```plain
  [options]
  runuser = asterisk
  rungroup = asterisk
  ```
Редактируем файл pjsip **/etc/asterisk/pjsip.conf** и приводим его к ввиду который указан ниже(удаляем существующую конфигурацию)
  ```text
  [transport-udp-nat]
  type = transport
  protocol = udp
  bind = 0.0.0.0

  [100]
  type = endpoint
  disallow = all
  allow = alaw
  allow = ulaw
  direct_media= no
  context = internal
  callerid = 100
  auth = 100-auth
  aors = 100

  [100-auth]
  type = auth
  auth_type = userpass
  username = 100
  password = 123

  [100]
  type = aor
  max_contacts = 5


  [101]
  type = endpoint
  disallow = all
  allow = alaw
  allow = ulaw
  direct_media= no
  context = internal
  callerid = 101
  auth = 101-auth
  aors = 101

  [101-auth]
  type = auth
  auth_type = userpass
  username = 101
  password = 123

  [101]
  type = aor
  max_contacts = 5
  ```
Файл **/etc/asterisk/extensions.conf**, приводим его к виду(удаляем существующую конфигурацию):
  ```
  [globals]
  [general]
  [default]

  [internal]
  exten => _1xx,1,Dial(PJSIP/${EXTEN})
  exten => s,n,Hangup
  ```
Запускаем Asterisk и добавляем его в автозагрузку
  ```bash
  sudo systemctl restart asterisk.service
  sudo systemctl enable asterisk.service --now
  ```
Проверка 
  ```bash
  sudo asterisk -rvvvv
  ```
  ```bash 
  pjsip show endpoints
  ```
[![](https://docs.resds.ru/uploads/images/gallery/2022-09/scaled-1680-/DMLMtyfMJ77ZaHh7-image-1662491041014.png)](https://docs.resds.ru/uploads/images/gallery/2022-09/DMLMtyfMJ77ZaHh7-image-1662491041014.png)
  ```bash
  pjsip show transports
  ```
[![](https://docs.resds.ru/uploads/images/gallery/2022-09/scaled-1680-/2v8ydtgvQ4MOIz1E-image-1662491134931.png)](https://docs.resds.ru/uploads/images/gallery/2022-09/2v8ydtgvQ4MOIz1E-image-1662491134931.png)