Щоб не кричати на увесь будинок було вирішено поставити пару телефонів. З обладнання у наявності – мережа з підтримкою PoE на усіх порта[, Ethernet у місцях майбутнього розташування телефонів, ubuntu з Docker де вже запущено openhab та телефон Avaya 9640. Після недовгого аналізу вирішено було ставити для тесту Asterisk на вже існуючий Docker та робити SIP телефонію. У результаті з’явились таки вимоги:
- SIP телефонія на базі Asterisk з підтримкою телефона Avaya
- наявність HTTP сервера для Avaya (апдейт та налаштування)
- окремий VLAN для IP телефонії, бажано без доступу навіть в інші мережі
- інсталяція у вже існуючий докер, бажано з окремою IP мережею
Після недовгого читання документації по докеру з’ясувалось що можна зробити для окремих контейнерів окрему мережу та надати контейнерам доступ до неї. Приступаємо до реалізаціїї котра буде складатись з наступних пунктів:
- підготовка мережі (створеня vlan, налаштування DHCP для окремого діапазону)
- інсталяція програмного забезпечення
- налаштування HTTP та оновлення телефона на прошивку з підтримкою SIP, підготовка налаштування для телефона
- налаштування Asterisk
Підготовка мережі
Тут все було відносно просто – створюємо vlan на pfSence, на ньому ж налаштуємо DHCP. Конфігуруємо свіч на підтримку цього vlan на окремих портах та налаштовуємо додатковий інтерфейс на ubuntu. Результатом цього є отримання на новому інтерфейсі в ubuntu адреси з DHCP з нового діапазону. Конфігурацію ubuntu робив за цією інструкцією, розділ netplan.
Для керування докером я використовую portainer, створюємо у ньому нову мережу з назвою pbx-network та налаштовуємо її на новий vlan. Для цього використовуємо драйвер ipvlan та як parent вказуємо інтерфейс ubuntu з потрібним VLAN. Також вказуємо діапазон мережі з нашого нового VALN котрий виключено з DHCP діапазону:
Інсталяція програмного забезпечення
Для інсталяції сервісов підготуємо docker-compose файл та передамо його в portainer як готовий стек, це дасть можливість не створювати усі налаштування для кожного контейнера у UI, а просто користуватись блокнотом. Стек буде мати 2 сервіси – asterisk та веб сервер з усіма файлами що необхідні для телефона avaya. У результаті з’явилась така конфігурація:
version: '3'
services:
asterisk-app:
container_name: asterisk-app
image: andrius/asterisk
ports:
- 5060:5060/udp
- 5160:5160/udp
volumes:
- /opt/asterisk/lib/asterisk/keys:/var/lib/asterisk/keys
- /opt/asterisk/lib/asterisk/sounds:/var/lib/asterisk/sounds
- /opt/asterisk/lib/asterisk/phoneprov:/var/lib/asterisk/phoneprov
- /opt/asterisk/spool:/var/spool/asterisk
- /opt/asterisk/log:/var/log/asterisk
- /opt/asterisk/conf:/etc/asterisk
restart: always
networks:
pbx-network:
ipv4_address: 192.168.240.225
nginx-web:
container_name: nginx-web
image: nginx
ports:
- 80:80
volumes:
- /opt/asterisk/web:/usr/share/nginx/html
restart: always
networks:
pbx-network:
ipv4_address: 192.168.240.226
networks:
pbx-network:
name: pbx-network
external: true
Перед створенням стеку створюємо усі необхідні директорії (шлях /opt/asterisk). Єдиний нюанс – ця конфігурація очікує що директорія /opt/asterisk/conf містить усі необхідні для asterisk файли конфігурації. Щоб їх отримати можна створити стек без /opt/asterisk/conf та скопіювати усі файли з існуючого контейнера, а потім оновити стек з підключенням /opt/asterisk/conf. Як результат в нас повинно бути 2 запущенийх контейнера:
Налаштування HTTP та оновлення телефону
Беремо ПЗ для телефону з підтримкою SIP з офіціального сайту та розпаковуємо отриманий файл у директорію /opt/asterisk/web. Далі створюємо у тій самій директорії файл 46xxsettings.txt з наступним вмістом:
SET SIPDOMAIN pbx.private.domain
SET SIPPORT 5060
SET SIP_CONTROLLER_LIST 192.168.240.225:5060;transport=udp
SET SIPREGPROXYPOLICY alternate
SET SIPPROXYSRVR 192.168.240.225
SET SIPREGISTRAR 192.168.240.225
SET ENABLE_AVAYA_ENVIRONMENT 0
SET ENABLE_PPM_SOURCED_SIPPROXYSRVR 0
SET DISCOVER_AVAYA_ENVIRONMENT 0
SET SIP_MODE 0
SET MWISRVR 192.168.240.225
SET DIALPLAN 7xxx
SET PROVIDE_TRANSFER_TYPE 1
SET CALL_TRANSFER_MODE 1
SET CONFERENCE_TYPE 1
SET QKLOGINSTAT 1
## SET PHNNUMOFSA 6
SET SIPSIGNAL 0
SET SNTPSRVR pool.ntp.org
SET GMTOFFSET +3:00
SET DSTOFFSET 1
SET DSTSTART 2SunMar2L
SET DSTSTOP 1SunNov2L
SET TIMEZONE Europe/Kyiv
SET WAIT_FOR_REGISTRATION_TIMER 60
SET REGISTERWAIT 120
SET RECOVERYREGISTERWAIT 60
SET WAIT_FOR_UNREGISTRATION_TIMER 32
SET WAIT_FOR_INVITE_RESPONSE_TIMEOUT 60
SET OUTBOUND_SUBSCRIPTION_REQUEST_DURATION 180
SET NO_DIGITS_TIMEOUT 10
SET INTER_DIGIT_TIMEOUT 5
SET ENABLE_PRESENCE 0
SET ENABLE_AUTOMATIC_ON_THE_PHONE_PRESENCE 0
SET SPEAKERSTAT 2
SET SDPCAPNEG 1
SET DISPLAY_NAME_NUMBER 1
SET PLAY_TONE_UNTIL_RTP 1
SET SKILLSCREENTIME 1
SET UUIDISPLAYTIME 5
SET ENTRYNAME 0
SET ENABLE_G729 2
SET SEND_DTMF_TYPE 2
SET DTMF_PAYLOAD_TYPE 101
SET SYMMETRIC_RTP 1
SET MATCHTYPE 1
SET ENABLE_HOLD_BUTTON 1
SET SIG 2
SET PHNLD ""
SET SUBSCRIBE_SECURITY 0
SET ENABLE_IPOFFICE 1
SET SUBSCRIBE_LIST_NON_AVAYA "mwi"
SET EXTENSION_ON_TOP_LINE 2
SET PROVIDE_OPTIONS_SCREEN 1
SET DATEFORMAT %d-%m-%y
SET TIMEFORMAT 1
SET DAYLIGHT_SAVING_SETTING_MODE 2
SET PSTN_VM_NUM "*97"
SET ENABLE_EARLY_MEDIA 1
Файл повинен містити правильну адресу asterisk – 192.168.240.225/pbx.private.domain
Щоб телефон дізнався про цей сервер додаємо у DHCP текстову опцію 242 з вмістом:
MCIPADD=pbx.private.domain,HTTPSRVR=pbx-web.private.domain,VLANTEST=0
pbx.private.domain повинен вказувати на asterisk, pbx-web.private.domain на веб сервер. Можна вказати IP адреси.
Запускаємо телефон, входимо у налаштування за допомогою коду MUTE CRAFT # та налаштовуємо потрібний VLAN. Якщо все добре то телефон перезавантажиться, оновить ПЗ та запропонує ввести номер та пароль.
Налаштування Asterisk
Я не є спеціалістом з астеріск, це взагалі мій перший досвід з ним, тому можуть бути деякі помилки у цьому розділі.
Останні версії астеріск мають плагін pjsip та sip для sip телефоній, причому останній вимкнений та у найближчих версіях буде видалений. На даний момент мені не вдалось з’єднати телефон avaya з плагіном pjsip тому вимикаємо pjsip та вмикаємо sip. Мій конфіг modules.conf виглядвє наступним чином:
[modules]
autoload=yes
noload = res_pjsip.so
noload = chan_alsa.so
noload = chan_console.so
noload = res_hep.so
noload = res_hep_pjsip.so
noload = res_hep_rtcp.so
noload = chan_sip.so
noload = app_voicemail_imap.so
noload = app_voicemail_odbc.so
Додаємо в sip.conf необхідні номера, розділ з виправленнями буде виглядати якось так:
[basic-options](!) ; a template
dtmfmode=rfc2833
context=home
type=friend
host=dynamic
[natted-phone](!,basic-options) ; another template inheriting basic-options
directmedia=no
host=dynamic
[public-phone](!,basic-options) ; another template inheriting basic-options
directmedia=yes
[my-codecs](!) ; a template for my preferred codecs
disallow=all
allow=ilbc
allow=g729
allow=gsm
allow=g723
allow=ulaw
; Or, more simply:
;allow=!all,ilbc,g729,gsm,g723,ulaw
[ulaw-phone](!) ; and another one for ulaw-only
disallow=all
allow=ulaw
; Again, more simply:
;allow=!all,ulaw
[7700](public-phone,my-codecs)
secret = 7700
[7701](public-phone,my-codecs)
secret = 7701
[7702](public-phone,my-codecs)
secret = 7702
Пам’ятаємо що avaya підтримує тільки цифри як паролі.
На цьому етапі можна спробувати зробити перезавантаження конфігурації астериск та спробувати зареєструватись з телефону, реєстрація повинна бути успішною. Для тесту можна встановити додаток наприклад MicroSIP та перевірити чи можна зареєструватись у ньому.
Якщо реєстрація була вдалою треба налаштувати діалплан щоб мати можливість здійснювати дзвінки. Для початківця це все виглядає досі складно я просто змінив розділ default та додав розділ home. Ці 2 розділи виглядають так:
[default]
[home]
exten => _77XX,1,Dial(SIP/${EXTEN}, 30)
Після перезавантаження конфігурацію ви повинні мати можливість здійснювати дзвінки у межах 77хх.