Сегодня хочу затронуть тему защиты трафика в сетях VoIP. В Интернете гуляет очень много открытого трафика и добраться до него не так уж и сложно, тем более если ты админ Wi-Fi сети в гостинице или кафе, ибо инженер интернет-провайдера. Хоть я и не параноик, но корпоративные данные, будь то почта, авторизация на внутренних ресурсах и так далее предпочитаю шифровать. С недавних пор к голосовому трафику стараюсь относится так же.
Все действия будут происходить с FreeSWITCH Version 1.4.26 и софтфоном Blink. Так же чуть позже выложу статью по настройке других смартфонов.
Будем считать что наш Freeswitch скомпилирован и установлен с поддержкой SSL.
Для начала нам нужно сгенерировать сертификаты с помощью встроенной во Freeswitch утилиты ./gentls_cert.
Генерируем CA (корневой) сертификат:
| 
					 1  | 
						/usr/local/freeswitch/bin/gentls_cert setup -cn 8.8.8.8 -alt DNS:sip.youdomain.ru -org 8.8.8.8  | 
					
Далее генерируем сертификат для сервера
| 
					 1  | 
						/usr/local/freeswitch/bin/gentls_cert create_server -cn 8.8.8.8 -alt DNS:sip.youdomain.ru -org 8.8.8.8  | 
					
, где 8.8.8.8 — IP адрес вашего сервера, а sip.youdomain.ru — домен вашего сервера, если таковой имеется, если же домена никакого нет, то можно опустить этот параметр.
Внимание! Если ваш Freeswitch работает не из под root, а под собственным пользователем (-u freeswitch), тогда нужно выставить необходимые привилегии для свежесоданных файлов сертификатов.
| 
					 1 2 3 4  | 
						chown freeswitch:daemon /usr/local/freeswitch/conf/ssl/agent.pem /usr/local/freeswitch/conf/ssl/cafile.pem chmod 640 /usr/local/freeswitch/conf/ssl/agent.pem /usr/local/freeswitch/conf/ssl/cafile.pem chown freeswitch:daemon /usr/local/freeswitch/conf/ssl/ chmod 755 /usr/local/freeswitch/conf/ssl/  | 
					
Должно выглядеть следующим образом:
| 
					 1 2 3 4 5 6 7  | 
						root@sip:~# ls -la /usr/local/freeswitch/conf/ssl/ итого 24 drwxr-xr-x  3 freeswitch daemon 4096 мая   11 14:39 . drwxr-xr-x 13 root       root   4096 мая   11 14:31 .. -rw-r-----  1 freeswitch daemon 3107 мая   11 14:31 agent.pem drw-r-----  2 freeswitch daemon 4096 мая   11 14:31 CA -rw-r-----  1 freeswitch daemon 1176 мая   11 14:31 cafile.pem  | 
					
Далее нам нужно сконфигурировать SIP профиль (internal, external или другой, который у вас используется)
Открываем XML файл нашего профиля, например /usr/local/freeswitch/conf/sip_profiles/internal.xml и приводим секцию TLS к такому виду:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26  | 
						    <!-- TLS: disabled by default, set to "true" to enable -->     <param name="tls" value="true"/>     <!-- Set to true to not bind on the normal sip-port but only on the TLS port -->     <param name="tls-only" value="false"/>     <!-- additional bind parameters for TLS -->     <param name="tls-bind-params" value="transport=tls"/>     <!-- Port to listen on for TLS requests. (5061 will be used if unspecified) -->     <param name="tls-sip-port" value="5061"/>     <!-- Location of the agent.pem and cafile.pem ssl certificates (needed for TLS server) -->     <param name="tls-cert-dir" value="$${base_dir}/conf/ssl"/>     <!-- Optionally set the passphrase password used by openSSL to encrypt/decrypt TLS private key files -->     <param name="tls-passphrase" value=""/>     <!-- Verify the date on TLS certificates -->     <param name="tls-verify-date" value="true"/>     <!-- TLS verify policy, when registering/inviting gateways with other servers (outbound) or handling inbound registration/invite requests how should we verify their certificate -->     <!-- set to 'in' to only verify incoming connections, 'out' to only verify outgoing connections, 'all' to verify all connections, also 'subjects_in', 'subjects_out' and 'subjects_all' for subject validation. Multiple policies can be split with a '|' pipe -->     <param name="tls-verify-policy" value="none"/>     <!-- Certificate max verify depth to use for validating peer TLS certificates when the verify policy is not none -->     <param name="tls-verify-depth" value="2"/>     <!-- If the tls-verify-policy is set to subjects_all or subjects_in this sets which subjects are allowed, multiple subjects can be split with a '|' pipe -->     <param name="tls-verify-in-subjects" value=""/>     <!-- TLS version default: tlsv1,tlsv1.1,tlsv1.2 -->     <param name="tls-version" value="$${sip_tls_version}"/>     <!-- TLS ciphers default: ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH  -->     <param name="tls-ciphers" value="$${sip_tls_ciphers}"/>  | 
					
Сохраняемся, перезагружаем Freeswitch и проверяем поднялись ли профили и все ли ок.
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  | 
						freeswitch@internal> sofia status profile default ================================================================================================= Name                    default Domain Name             N/A Auto-NAT                false DBName                  sofia_reg_default Pres Hosts              XX.XX.XX.XX,XX.XX.XX.XX Dialplan                XML Context                 default Challenge Realm         auto_from RTP-IP                  XX.XX.XX.XX SIP-IP                  XX.XX.XX.XX URL                     sip:mod_sofia@XX.XX.XX.XX:5060 BIND-URL                sip:mod_sofia@XX.XX.XX.XX:5060;transport=udp,tcp TLS-URL                 sip:mod_sofia@XX.XX.XX.XX:5061 TLS-BIND-URL            sips:mod_sofia@XX.XX.XX.XX:5061;transport=tls HOLD-MUSIC              local_stream://moh OUTBOUND-PROXY          N/A CODECS IN               G729,PCMA,PCMU CODECS OUT              G729,PCMA,PCMU TEL-EVENT               101 DTMF-MODE               rfc2833 CNG                     13 SESSION-TO              0 MAX-DIALOG              0 NOMEDIA                 false LATE-NEG                false PROXY-MEDIA             false ZRTP-PASSTHRU           false AGGRESSIVENAT           true CALLS-IN                7 FAILED-CALLS-IN         5 CALLS-OUT               4 FAILED-CALLS-OUT        3 REGISTRATIONS           9  | 
					
Далее посмотрим на то слушает ли наш Freeswitch порт 5061
| 
					 1 2 3 4 5  | 
						root@sip:~# netstat -nlp | grep frees tcp        0      0 127.0.0.1:8021       0.0.0.0:*               LISTEN      4650/freeswitch tcp        0      0 XX.XX.XX.XX:5060     0.0.0.0:*               LISTEN      4650/freeswitch tcp        0      0 XX.XX.XX.XX:5061     0.0.0.0:*               LISTEN      4650/freeswitch udp        0      0 XX.XX.XX.XX:5060     0.0.0.0:*                           4650/freeswitch  | 
					
Все супер, а если не супер, то смотрим в чем дело внимательно, у меня была трабла именно с правами доступа на файлы сертификатов.
Далее нам нужно сгенерировать пользовательский сертификат:
| 
					 1  | 
						/usr/local/freeswitch/bin/gentls_cert create_client -cn 10001 -out 10001.pem  | 
					
, где 10001 — номер телефона абонента, для обеспечения безопасности этот сертификат нужно генерировать для каждого номера отдельно. Он так же сохранился в /usr/local/freeswitch/conf/ssl.
Далее нам необходимо скопировать файлы 10001.pem из каталога /usr/local/freeswitc/conf/ssl и cacert.pem из каталога /usr/local/freeswitc/conf/ssl/CA на компьютер, где будет установлен Blink. Зачем нам нужно 2 сертификата я расскажу позже.
Приступаем к настройке самого Blink. Выложу скриншоты настроек программы, на них предельно все ясно. Однако поясню, что 2 сертификата нам нужно для проверки подлинности сервера, т.к. сертификат мы выдавали сами себе. Если же сертификат вам был выдан в доверенном центре сертификаций, то тогда последний пункт не требуется.
Отлично, применяем настройки и пытаемся сделать вызов.
При этом включаем в консоли Freeswitch sip trace
| 
					 1  | 
						 sofia global siptrace on  | 
					
И ищем примерно такую строчку в дебаге:
| 
					 1  | 
						send 1256 bytes to <strong>tls/</strong>[2.132.108.200]:50320 at 17:43:35.017681:  | 
					
это говорит о том, что SIP сообщения бегают в зашифрованном виде.
Далее проверяем SRTP и ищем в том же дебаге в SDP сообщение что то в роде
| 
					 1  | 
						a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:BiB/IsoEyoAU5zh8DT/V3a+IXqHVIRLmA9o1tbo9  | 
					
это нам говорит о том что RTP Трафик теперь шифрован.
Теперь находясь в гостинице или в кафе с ноутбуком и говоря по телефону мы будем на 100% знать что слышит нас только абонент, которому мы звоним и никакой шайтан не сможет прослушать наши вызовы. 🙂







zrtp надо еще прикрутить, перед использованием srtp
Получается без сборки с поддержкой zrtp такое работать не будет?