Телефония для домена

366d3134996a4252b2e13d243070465f.jpg

Изучение протокола SIP привело к пониманию того, что он изначально поддерживает работу с доменными именами. В частности, достаточно создать DNS записи типа SRV и NAPTR для указания SIP клиентам где искать ваш сервер телефонии. В результате мы получаем возможность заводить пользователей типа alex@mysite.ru, director@mysite.ru, 101@mysite.ru и делать звонки напрямую на эти номера. В частности, эти номера могут совпадать с адресом электронной почты.

Бесплатные звонки


Время, когда можно будет позвонить через Интернет любому человеку на его SIP URI номер, так же как и на обычный телефон — еще далеко, но уже сейчас можно получить явные преимущества.

Маркетинговая составляющая: Можно рекламировать свою компанию как максимально нацеленную на контакт с клиентом, и давать им различные способы связи с сотрудниками.

Например, на визитке сотрудника можно указывать контакты для связи по аналогии с e-mail как sip: director@mysite.ru. Бонусом такого звонка будет обход голосового меню, нет необходимости донабора внутреннего номера — сразу соединяетесь с интересующим вас сотрудником — экономите свое время.

Можно совершать звонки на телефон бесплатно прямо с браузера через WebRTC с различных web сервисов — это возможность сэкономить на оплате счетов за телефон горячей линии 8 800. Многим вашим клиентам может быть удобно звонить сразу с компьютера в один клик через гарнитуру, а не набирать номер на мобильнике.

В большинстве случаев, звонки на SIP номера бесплатны для обеих сторон. И позволяют по полной использовать возможности современной телефонии, например видеосвязь. Можно проводить открытые конференции и семинары.

Рассмотрим настройку на популярной офисной АТС Asterisk


При настройке собственного сервера очень большое внимание следует уделять безопасности. К сожалению, сегодня телефония является лакомым кусочком для взлома.

Считаем, что Asterisk уже установлен и настроен для обычных звонков.

Первым делом проверяем, включен ли и настроен брандмауэр на этом сервере. Пример конфигурации для iptables для Debian. Конфигурацию сохраняем в /etc/iptables.up. Загружаем с помощью iptables-restore.

Файл настроек /etc/iptables.up:

*filter 
# Запрещаем принимать все, для чего нет разрешающих правил 
:INPUT DROP 
# Разрешаем пересылку пакетов 
:FORWARD ACCEPT 
# Разрешаем отправку пакетов 
:OUTPUT ACCEPT 

# Разрешаем установленные соединения 
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
# Разрешаем локальные соединения 
-A INPUT -i lo -j ACCEPT 
# Отвечаем на ping 
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT 
# и подключения по SSH 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
# RTP порты для передачи голоса, берем из /etc/asterisk/rtp.conf 
-A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT 
# SIP порт 
-A INPUT -p udp -m udp --dport 5060 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT 
COMMIT 


По необходимости дописываем правила для таблиц nat и mangle, если сервер используется в качестве шлюза в локальную сеть.

Делаем автозагрузку конфигурации. Для этого в файл /etc/network/interfaces после описания интерфейса добавляем строчку post-up iptables-restore < /etc/iptables.up:

allow-hotplug eth1 
iface eth1 inet dhcp 
        post-up iptables-restore < /etc/iptables.up 


Далее настраиваем fail2ban для анализа логов. Рекомендую включить модули SSH и Asterisk. Подробнее настройка описана здесь.

Настройка DNS записей


Для звонков на SIP URI нужно рассказать звонящим вам, где искать сервер телефонии. Для этого используются NAPTR и SRV записи:

Запись NAPTR для домена mysite.ru рассказывает, какие сервисы поддерживаются:

~$ host -t naptr mysite.ru 
mysite.ru has NAPTR record 10 50 "s" "SIP+D2U" "" _sip._udp.mysite.ru. 
mysite.ru has NAPTR record 10 51 "s" "SIP+D2U" "" _sip._udp.second.mysite.ru. 
mysite.ru has NAPTR record 20 50 "s" "SIP+D2T" "" _sip._tcp.mysite.ru. 
mysite.ru has NAPTR record 20 50 "s" "SIPS+D2T" "" _sips._tcp.mysite.ru.


В данном случае для домена mysite.ru определены 4 NAPTR записи.

  • 10 — поле Order — приоритет сервиса. Чем ниже значение, тем выше приоритет.
  • 50 — поле Preference — приоритет правила. Проверяется только для одинаковых значений Order. В данном случае, если клиент поддерживает сервис «SIP+D2U», то сначала будет отправляться запрос к _sip._udp.mysite.ru, если он не доступен — то к _sip._udp.second.mysite.ru
  • «s» — поле Flags. Означает, что используется SRV запись.
  • «SIP+D2U» — поле Service. Протокол, который поддерживается. В данном случае SIP с использованием UDP пакетов. SIP+D2T — для TCP пакетов. SIPS+D2T использовать шифрование TLS поверх TCP пакетов.
  • » — поле Regexp. Регулярное выражение для извлечения доменного имени. В данном случае пустое.
  • _sip._udp.mysite.ru. — имя SRV записи (сервер, отвечающий за этот тип связи).


Далее нужно настроить SRV запись:

host -t srv _sip._udp.mysite.ru
_sip._udp.mysite.ru has SRV record 10 0 5060 asterisk.mysite.ru.


  • _sip — поле Service. Сервис телефонии.
  • _udp — поле Proto — протокол. Обычно _udp или _tcp.
  • mysite.ru — доменное имя для которого создается запись.
  • 10 — поле Priority — задает приоритет этой записи.
  • 0 — поле weight — относительный приоритет. Играет значение для записей с одинаковым Priority.
  • 5060 — поле Port. Указывает, на каком порту сервер принимает SIP команды.
  • asterisk.mysite.ru. — поле Target — имя сервера.


Как показала практика, многие SIP клиенты проверяют только SRV записи _sip._udp. и _sip._tcp. для вашего домена без учета информации в NAPTR.

Подробнее по связи телефонии с DNS можно почитать в соответствующем стандарте.

Настройка сервера Asterisk


Для начала, нужно разрешить звонки без авторизации и поместить их в отдельный контекст. Для этого в sip.conf:

[general]
...
context=guest-call
allowguest=yes
...


Далее нужно создать этот контекст в файле extensions.conf:

[guest-call]
exten = > director,1,Log(NOTICE,Good call IP=${CHANNEL(peerip)})
exten = > director,n,Dial(SIP/105@default)
exten = > alex,1,Log(NOTICE, Good call IP=${CHANNEL(peerip)})
exten = > alex,n,Dial(SIP/106@default)
exten = > 101,1,Log(NOTICE, Good call IP=${CHANNEL(peerip)})
exten = > 101,n,Dial(SIP/101@default)
exten = > _.,1,Log(WARNING,Wrong call IP=${CHANNEL(peerip)})
exten = > _.,n,Playback(bad-user)
exten = > _.,n,Hangup()


Применяем конфигурацию sip reload и dialplan reload. В данном контексте мы логируем все неавторизованные вызовы. Далее происходит вызов локального абонента. Поменяйте default на ваш контекст с локальными пользователями. Прописываем сюда всех пользователей, для которых будем принимать неавторизованные звонки.

Ошибочные вызовы логируются с отдельным сообщением. Мы можем добавить анализ этого сообщения в fail2ban для блокировки подбора, например в файле конфигурации /etc/fail2ban/filter.d/asterisk.conf добавляем строку:

failregex =     …
                …
                …
                Wrong call IP=


Особое внимание надо уделить этому диалплану — разрешать стоит только звонки локальным пользователям. Корректная настройка избавит вас от неприятных неожиданностей получить большой счет за телефонные звонки.

Так же следует помнить, что уязвимости могут быть найдены в любом программном обеспечении, например в реализации протокола SIP или даже SSH сервере. Поэтому, желательно устанавливать лимиты по балансу у вашего провайдера, чтобы избежать риска получения огромного счета.

Решение на виртуальных сервисах


В последнее время большую популярность приобрели сервисы виртуальных АТС например SIPNET, Zadarma, Цифровой Офис. Большинство из них позволяет делать и принимать вызовы на SIP URI. Последний, к стати, позволяет сделать привязку вашего домена к сервису телефонии. Использование сервисов избавляет вас от самостоятельной настройки и защиты сервера телефонии. Большинство из них работают по предоплате и исключают риск получения больших счетов.

После настройки можно будет принимать звонки с других сервисов и звонить на них. Так же можно звонить и на сервера Asterisk других компаний, если они поддерживают гостевые звонки.

© Habrahabr.ru