Протокол SOCKS позволяет пересылать пакеты между сервером и клиентом через промежуточный (прокси) узел. Главным минусом SOCKS является отсутствие шифрования. Частично это можно скомпенсировать использованием поверх SOCKS протоколов со встроенным шифрованием. Однако и тут не всё идеально: если используется SOCKS5 с авторизацией по логину и паролю то логин и пароль от прокси передаются по сети без шифрования.
Stunnel это программное обеспечение позволяющее "пробросить" tcp-соединение поверх другого tcp-соединения с использованием шифрования. При использовании Stunnel можно обеспечить безопасное соедиение с сервисами, не поддерживающими шифрование. Платой за безопасность будет некоторое усложнение конфигурации как сервера, так и клиента.
Далее будет показано как добавить шифрование с помощью Stunnel к SOCKS5-прокси, описанному некоторое время назад. Краткое описание схемы: клиент вместо прямого соединения с проски подключается к Stunnel, запущенному на локальной машине в режиме клиента, Stunnel-клиент подключается к Stunnel-серверу, и он уже подключается к прокси.
Настройка сервера
Приступаем к настройке. Для начала установим Stunnel на нашу VPS с прокси-сервером:
apt-get install stunnel
Далее генерируем сертификат, с помощью которого будет обеспечиваться шифрование:
openssl req -new -x509 -days 3650 -nodes -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
Сразу создадим копию сертификата в формате PKCS12. На сервере она не нужна, но некоторым типам клиентов может понадобиться:
openssl pkcs12 -export -inkey /etc/stunnel/socks.pem -in /etc/stunnel/socks.pem -out /etc/stunnel/socks.p12
Закончив с сертификатами нужно создать файл конфигурации туннеля. В нашем случае это будет "/etc/stunnel/socks.conf" следующего содержания:
# Путь к сертификату cert = /etc/stunnel/socks.pem # Разрешаем использовать шифрование compression = deflate # Сюда будем писать лог output = /var/log/stunnel4/socks.log # Собственно описание сервиса [socks] # Режим сервера client = no # tcp-порт, на котором буду ожидаться входящие соединения accept = 8089 # Сервис, к которому будем пересылать трафик дальше connect = 45.67.78.90:8088 # Будем учитывать файлы /etc/hosts.allow и /etc/hosts.deny libwrap = yes
Здесь "45.67.78.90:8088" это IP и порт нашего SOCKS-прокси, который мы "оборачиваем" в Stunnel
После этого включаем сервис и запускаем его:
echo ENABLED=1 >> /etc/default/stunnel4 && service stunnel4 restart
На этом настройка сервера заканчивается и можно приступать к настройке клиентов.
Настройка Linux-клиента
На клиентской машине под управлением Linux необходимо как и на сервере установить пакет "stunnel4", затем скопировать с сервера файл сертификата ("/etc/stunnel/socks.pem") и сохранить его под именем "/etc/stunnel/socks.pem". Наконец создать файл конфигурации ("/etc/stunnel/socks.conf"):
# Путь к сертификату CAfile = /etc/stunnel/socks.pem # Сюда будем писать лог output = /var/log/stunnel4/socks.log # Будем проверять чтобы сертификат сервера совпал с нашим verify = 4 # Собственно наш сервис [socks] # Режим клиента client = yes # Здесь мы будем ждать входящие соединения accept = 127.0.0.1:8088 # Адрес нашего stunnel-сервера connect = 45.67.78.90:8089
Здесь "45.67.78.90:8088" это IP и порт нашего Stunnel-сервера. Закончив конфигурацию включаем сервис и запускаем его:
echo ENABLED=1 >> /etc/default/stunnel4 && service stunnel4 restart
На этом настройка клиента заканчивается. Теперь в качестве SOCKS-прокси в приложениях можно указывать адрес "127.0.0.1" и порт "8088".
Настройка Windows-клиента
На Windows первым делом надо скачать стабильную версию stunnel для windows и установить на свой компьютер. В процессе установки будет предложено создать сертификат. Можно создавать с любыми данными, так как нам он не понадобится.
После установки необходимо скопировать файл "socks.pem" с сервера в директорию "C:\Program Files (x86)\Stunnel\config". Затем кликнув правой кнопкой мыши по значку Stunnel в системном лотке в открывшемся меню выбрать "Edit Configuration".
Конфигурация для Windows практически не отличается от таковой для Linux и имеет вид:
# Путь к сертификату CAfile = socks.pem # Будем проверять чтобы сертификат сервера совпал с нашим verify = 4 # Собственно наш сервис [socks] # Режим клиента client = yes # Здесь мы будем ждать входящие соединения accept = 127.0.0.1:8088 # Адрес нашего stunnel-сервера connect = 45.67.78.90:8089
После сохранения новой конфигурации нужно в меню stunnel выбрать пункт "Reload Configuration" и можно начинать пользоваться.
Настройка Android-клиента
На смартфонах под управлением ОС Android есть несколько приложений реализующих возможности Stunnel. Автору этих строк больше всего приглянулся SSLDroid: простые настройки, стабильная работа на Android 7.0, поддержка одновременно нескольких туннелей.
Настройка очень проста: необходимо загрузить на устройство сертификат нашего Stunnel-сервера в формате PKCS12, запустить создание нового туннеля, указать имя туннеля, порт на котором будут ожидаться входящие соединения, хост и порт нашего Stunnel-сервера и путь к файлу сертификата. Примерно так:
Дальше надо сохранить настройки, и в меню приложения выбрать запуск сервиса. После этого можно смело подключаться к SOCKS-прокси с адресом "127.0.0.1" и портом, который был указан как локальный.
Настройка iOS-клиента
Очень хотелось написать этот раздел, однако не получилось: stunnel-клиентов для iOS в App Store нет. Есть сборки stunnel от энтузиастов, но они требуют устройства с JailBreak. Потому к сожалению использовать stunnel на iOS в настоящий момент невозможно.
Вместо заключения
Stunnel позволяет добавить шифрование туда, где оно не предусмотрено изначально. Однако не стоит забывать что stunnel можно сконфигурировать небезопасным образом (без верификации сертификатов), допускающим MITM-атаку. Потому настройку stunnel следует доверять только опытным и проверенным администраторам.
На этом всё. Приятной работы!
Anonymous 2018-04-29 20:29:18 (#)