Из темы я думаю все понятно, но приведу краткое содержание того, что будет:
1. Регистрация у SIP провайдера
2. Особенности SIPNETa
3. Соединение двух серверов
4. TLS (secure/encrypt) соединение
5. TLS соединение клиента к серверу
1. Базовый пример
register нужен если у нас динамический IP и наш провайдер не знает куда че слать)
Добавляем секцию register
register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry]
в самом простом случае получаем
register => username:[email protected]
если экстеншен не задан используется ‘s’. Для приема звонков экстеншен должен быть определен в extensions.conf
далее должны создать запись для нашего провайдера
[myvoipprov] type=peer ; задавая peer,указываем Asterisk, что при получении сообщения INVITE (Приглашение) ; (когда поставщик присылает вызов) нужно сравнивать не имя [myvoipprov], ; а IP-адрес, указанный в этом сообщении. для повышения безопасности лучше создавать ; отдельные записи на входящие и исходящие вызовы, разделив их по контекстам. host=192.168.0.1 ; IP-адрес, на который мы будем направлять наши вызовы fromuser=username ; влияет на то, как структурировано наше сообщение INVITE при отправке вызова username=username secret=password context=incominggggg dtmfmode=rfc2833 disallow=all allow=alaw allow=ulaw deny=0.0.0.0/0 permit=192.168.0.1/32 insecure=invite ; может быть необходимо для поставщика, потому что источник сообщения ; INVITE может находиться на платформе сервера, но передаваться через его прокси-сервер SIP.
Некоторые поставщики услуг для отправки своих вызовов могут использовать вместо протокола Session Initiation Protocol множество IP-адресов, требуя от вас создания отдельной учетной записи типа peer для каждого IP-адреса. Если известны не все IP-адреса, вероятно, придется сравнивать имена пользователей. В этом случае потребуется лишь немного изменить формат описания поставщика сервисов. Самое большое изменение, на которое следует обратить внимание, – то, что вам понадобится задать [заголовок_поставщика_услуг] как имя пользователя, которому ваш поставщик сервисов собирается направлять вызовы. Также мы изменили тип peer (равноправный) на friend (дружественный), что с точки зрения Asterisk создает типы и user (пользователь), и peer, где тип user будет сравниваться раньше peer!
Возможно, понадобится задать и invite=invite,port, если адрес порта также не соответствует тому, что ожидает Asterisk.
Если имя пользователя задано в параметре fromuser, при отправке вызова поставщику меняются поля From: (От:) и Contact: (Контакт:) сообщения INVITE. Этого может требовать сам поставщик, если он использует эти поля в процедуре аутентификации. То, где Asterisk меняет заголовок, можно увидеть в следующих двух фрагментах кода.
Без параметра fromuser:
Audio is at 66.135.99.122 port 18154 Adding codec 0x2 (gsm) to SDP Adding codec 0x4 (ulaw) to SDP Adding non-codec 0x1 (telephone-event) to SDP Reliably Transmitting (no NAT) to 10.251.55.100:5060: INVITE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP 66.135.99.122:5060;branch=z9hG4bK32469d35;rport From: "asterisk" <sip:[email protected]>;tag=as4975f3ff To: <sip:[email protected]> Contact: <sip:[email protected]> Call-ID: [email protected] CSeq: 102 INVITE User-Agent: Asterisk PBX Max-Forwards: 70 Date: Fri, 20 Apr 2007 14:59:24 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Supported: replaces Content-Type: application/sdp Content-Length: 265
С параметром fromuser:
Audio is at 66.135.99.122 port 11700 Adding codec 0x2 (gsm) to SDP Adding codec 0x4 (ulaw) to SDP Adding non-codec 0x1 (telephone-event) to SDP Reliably Transmitting (no NAT) to 10.251.55.100:5060: INVITE sip:[email protected] SIP/2.0 Via: SIP/2.0/UDP 66.135.99.122:5060;branch=z9hG4bK635b0b1b;rport From: "asterisk" <sip:мой_уникальный[email protected]>;tag=as3186c1ba To: <sip:[email protected]> Contact: <sip:мой_уникальный[email protected]> Call-ID: [email protected] CSeq: 102 INVITE User-Agent: Asterisk PBX Max-Forwards: 70 Date: Fri, 20 Apr 2007 15:00:30 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY Supported: replaces Content-Type: application/sdp Content-Length: 265
2. SIPNET
не очень секьюрно, но это работает
register=>0038355555:[email protected]/0038355555 [SIPNETT] type=friend host=sipnet.net username=0038355555 fromuser=0038355555 secret=6666666666 context=incomingggg dtmfmode=rfc2833 disallow=all allow=alaw allow=ulaw deny=0.0.0.0/0 permit=sipnet.net insecure=INVITE sendrpid=yes ; без этого заводится не хотело fromdomain=sipnet.net ; и это тоже не помешает
3. Соединяем два сервера
Конфиг первого сервера(ServerA):
[ServerB] type=peer host=192.168.1.101 username=ServerA secret=password context=vres_in disallow=all allow=ulaw deny=0.0.0.0/0 premit=192.168.1.101/32
Конфиг второго сервера (ServerB)
[ServerA] type=peer host=192.168.2.202 username=ServerB secret=password context=serv_in disallow=all allow=ulaw deny=0.0.0.0/0 permit=192.168.2.202/32
Указывая type=peer мы говорим, что входящие вызовы будут сравниваться с IP и портом. Когда Астериск получит вызов с 192.168.1.101 и на стандартом порту 5060 он будет искать совпадение в sip.conf. Далее запросит аутентификацию и будет ожидать что пароль совпадет с тем который указан в поле secret
4.
TLS connection(безопасное/шифрованое соединение)
Во время установки астериска нужно было поставить галочку возле данной опции, если мы не помним ставили или нет, то проверяем
Server*CLI> module show like res_srtp Module Description Use Count res_srtp.so Secure RTP (SRTP) 0 1 modules loaded
Модуль загружен на серверах пора включать поддержку тлс на всех серверах которые будем связывать 🙂
[general] tlsenable = yes tlsbindaddr = :: ; поддерживается как ipv6 так и ipv4
Теперь нужно получить сертификаты, для демонстрации хватит и самоподписанных сертификатов
Добавляем к настройкам нашей связи между серверами строчку
transport = tls encryption=yes ; для шифрования медиа
Генерируем сертификаты:
$ cd contrib/scripts $ mkdir certs $ ./ast_tls_cert -d certs -C serverA -o serverA $ ./ast_tls_cert -d certs -C serverB -o serverB -c certs/ca.crt -k certs/ca.key $ ls certs ca.cfg ca.crt ca.key serverA.crt serverA.csr serverA.key serverA.pem serverB.crt serverB.csr serverB.key serverB.pem tmp.cfg
Раскладываем сертификаты по серверам(/usr/local/share/asterisk/keys):
ServerA
• ca.crt
• serverA.pem
ServerB
• ca.crt
• serverB.pem
Указываем серверу куда мы положили сертификаты. Поскольку мы используем самоподписанные сертификаты, то нам также нужно указать и путь к CA сертификату. В секции [general] в sip.conf на serverA, добавляем:
[general] tlscertfile = /usr/local/share/asterisk/keys/serverA.pem tlscafile = /usr/local/share/asterisk/keys/ca.crt
Тоже делаем на serverB:
[general] tlscertfile = /usr/local/share/asterisk/keys/serverB.pem tlscafile = /usr/local/share/asterisk/keys/ca.crt
Поле Common Name в сертификате должно совпадать с hostname сервера. при использовании ast_tls_cert script,эта опция задается с помощью ключа -C. Если при совершении звонка мы получаем проблему связанную с именем то нужно пофиксить поле Common Name. Также можно установить tlsdontverifyserver=yes в [general] секции в файле sip.conf, и Астериск разрешит звонок даже если не пройдет проверка сертификата.
В диалплане, для однозначного шифрования исходящего звонка можно указать
exten => 1234,1,Set(CHANNEL(secure_bridge_signaling)=1) same => n,Dial(SIP/1234@serverB)
Для проверки шифрования полученных вызовов:
[incoming] exten => _X.,1,Answer() ; не для продакшена same => n,GotoIf($["${CHANNEL(secure_signaling)}" = "1"]?secure:insecure) same => n(secure),NoOp(Signaling is encrypted.) same => n,Hangup() same => n(insecure),NoOp(Signaling is not encrypted.) same => n,Hangup()
также говорят что нужно использовать и это, но зачем тогда мы указывали encryption=yes в sip.conf
Для шифрования передачи медиа данных(SRTP) используется CHANNEL(secure_bridge_media) = 1
exten => 1234,1,Set(CHANNEL(secure_bridge_signaling)=1) same => n,Set(CHANNEL(secure_bridge_media)=1) same => n,Dial(SIP/1234@serverB)
5.
Для подключения клиента нам необходимо сгенерировать ему сертификат:
./ast_tls_cert -m client -c path_to_crt/ca.crt -k path_to_key/ca.key -C phone1.mydomain -d path_to_cert -o phone1
Далее добавляем в sip.conf
tlscipher=ALL tlsclientmethod=tlsv1 ;для Blink(клиент такой)
Копируем на комп с клиентом pem файл и ca.crt
Далее в Вашем клиенте указываем
откуда брать pem файл.
Проверяем – Должно работать, если нет читаем лог того, что вам говорит астериск!
Опции ast_tls_cert
The “-m client” говорим скрипту генерировать клиентский сертификат
The “-c pathto/ca.crt” указывает какой Certificate Authority использовать
The “-k pathto/ca.key” ключ для Certificate Authority.
The “-C” определяем имя или IP адрес клиента
The “-O” определяет название организации
The “-d” куда положить сгенерированный ключ
The “-o” имя файла, сгенеророванного ключа
Для отладки есть незаменимая команда:
sip set debug on
с ее помощью можно найти все грабли которые вылазят в процессе работы с сипом
Найдете ошибку – напишите пожалуйста:)