Шифрование SOCKS-трафика с помощью Stunnel

()

Протокол 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".

Меню stunnel на Windows 10

Конфигурация для 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-сервера и путь к файлу сертификата. Примерно так:

Настройка туннеля в SSLDroid

Дальше надо сохранить настройки, и в меню приложения выбрать запуск сервиса. После этого можно смело подключаться к SOCKS-прокси с адресом "127.0.0.1" и портом, который был указан как локальный.

Настройка iOS-клиента

Очень хотелось написать этот раздел, однако не получилось: stunnel-клиентов для iOS в App Store нет. Есть сборки stunnel от энтузиастов, но они требуют устройства с JailBreak. Потому к сожалению использовать stunnel на iOS в настоящий момент невозможно.

Вместо заключения

Stunnel позволяет добавить шифрование туда, где оно не предусмотрено изначально. Однако не стоит забывать что stunnel можно сконфигурировать небезопасным образом (без верификации сертификатов), допускающим MITM-атаку. Потому настройку stunnel следует доверять только опытным и проверенным администраторам.

На этом всё. Приятной работы!

Ключевые слова: socks, socks5, stunnel, android, windows, ssldroid.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

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

Anonymous 2018-04-29 20:29:18 (#)

Зачем это если есть shadowsocks?

MooSE 2018-04-29 21:35:53 (#)

Зачем это если есть shadowsocks?
Shadowsocks может заменить связку danted+stunnel. Но с помощью stunnel можно сделать много такого, чего нельзя сделать с помощью shadowsocks.

Например если клиентский софт не поддерживает socks-прокси то shadowsocks ему как собаке пятая нога. С помощью stunnel можно также прокинуть и http-прокси, и даже какой-то внешний сервис.

Например вот этот мой велосипед не поддерживает SSL, и его клиент не поддерживает прокси ни в каком виде. В локальной сети это не критично, а если мне нужно будет обращаться к нему через интернет то я сделаю это через stunnel.

Anonymous 2018-06-02 13:59:11 (#)

stunnel может сам выступать в роли удалённого socks-сервера без дополнительного выделенного socks-севиса. В том числе и с авторизацией по паролю. Однако работает только что-то одно. Либо проброс через TLS/SSL (вероятно тогда использовать доступ по сертификату) либо пару логин/пароль. SOCKS over SSL/TLS вот так:

# клиентская часть
[socks]
protocol = socks
accept = localhost:8088
connect = 45.67.78.90:8089

# серверная часть
[socks]
client = no
accept = 8089
protocol = socks

https://www.stunnel.org/socksvpn.html

Anonymous 2018-06-02 14:07:03 (#)

По ссылке в том числе stunnell умеет как прозрачный прокси, заворот в socks файрволом без ведома приложений/клиентов.

Anonymous 2023-05-12 20:19:42 (#)

Не запускается у меня этот самый stunnel.
Ubuntu 20.04
Причём сколько не гуглил - всё речь вроде как о глюке в старых версиях.
Если есть у кого какие мысли - буду очень благодарен!

---
[.] Binding service [tunnel] to 0.0.0.0:443: Address already in use (98)
[ ] Listening file descriptor created (FD=9)
[ ] Setting accept socket options (FD=9)
[ ] Option SO_REUSEADDR set on accept socket
[.] Binding service [tunnel] to :::443: Address already in use (98)
[!] Binding service [tunnel] failed
[ ] Deallocating section defaults
[ ] Unbinding service [tunnel]
[ ] Service [tunnel] closed
[ ] Deallocating section [tunnel]
---

MooSE 2023-05-12 21:05:23 (#)

Не запускается у меня этот самый stunnel.
Оно ж тебе английским по белому говорит:

Binding service [tunnel] to :::443: Address already in use
Ну то есть кто-то другой слушает порт 443 и потому stunnel уже не может туда встать. Или вешайте на другой порт, или убирайте с 443 порта что там висит.

Anonymous 2023-05-12 21:24:52 (#)

Да в том-то и дело, что не слушает. Да и порты другие пробовал - всё та же, (98)...
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности