SIP-connectingpeople

Из темы я думаю все понятно, но приведу краткое содержание того, что будет:
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/[email protected])

Для проверки шифрования полученных вызовов:

[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/[email protected])

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

с ее помощью можно найти все грабли которые вылазят в процессе работы с сипом

Найдете ошибку — напишите пожалуйста:)


Комментарии: