Сегодня хочу затронуть тему защиты трафика в сетях 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% знать что слышит нас только абонент, которому мы звоним и никакой шайтан не сможет прослушать наши вызовы. 🙂