Изучение протокола 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=<HOST>
Особое внимание надо уделить этому диалплану — разрешать стоит только звонки локальным пользователям. Корректная настройка избавит вас от неприятных неожиданностей получить большой счет за телефонные звонки.
Так же следует помнить, что уязвимости могут быть найдены в любом программном обеспечении, например в реализации протокола SIP или даже SSH сервере. Поэтому, желательно устанавливать лимиты по балансу у вашего провайдера, чтобы избежать риска получения огромного счета.
Решение на виртуальных сервисах
В последнее время большую популярность приобрели сервисы виртуальных АТС например SIPNET, Zadarma, Цифровой Офис. Большинство из них позволяет делать и принимать вызовы на SIP URI. Последний, к стати, позволяет сделать привязку вашего домена к сервису телефонии. Использование сервисов избавляет вас от самостоятельной настройки и защиты сервера телефонии. Большинство из них работают по предоплате и исключают риск получения больших счетов.
После настройки можно будет принимать звонки с других сервисов и звонить на них. Так же можно звонить и на сервера Asterisk других компаний, если они поддерживают гостевые звонки.