Как создать файл конфигурации stunnel conf

Обновлено: 06.07.2024

Stunnel это программная обертка, позволяющая спрятать в шифрованный ssl-туннель произвольный трафик.

Важно! stunnel создает и поддерживает туннель как TCP соединение и передавать может только tcp-трафик. на клиенте: слушает порт на локальном хосте клиента и передает информацию (шифруя) на определенный порт удаленного сервера, на сервере: слушает порт на внешнем адресе и передает информацию (расшифровывая) на определенный порт локального хоста сервера.

При этом клиент свой запрос отправляет не на удаленный сервер, а на тот самый порт localhost-а, на котором слушает stunnel. Сервер же слушает (ждет запроса клиента) не на внешнем порту, а на локальном порту на который транслирует передачу stunnel. Посмотрите на схему (чтобы было понятнее):

Порты s1_port и s2_port - служебные порты stunnel и могут быть выбраны произвольно (как правило s2_port выбирается таким, что бы соединение на него не блокировалось файерволами). С s1_port - никаких ограничений нет т.к. трафик фактически и не покидает клиентского компьютера (передача идет внутри стека TCP/IP протокола). Точно так же и service_port (порт приложения сервера) на сервере можно изменить со стандартного на произвольный (если нужно).

Если возникает вопрос «как же осуществляется обратный трафик?» то нужно понимать, что каждое клиентское приложение в каждом TCP-подключении открывает для передачи произвольный порт (из тех что имеют большие номера, например 50000+) и именно на этот порт stunnel возвращает расшифрованные данные клиента. На клиенте stunnel открывает для передачи на удаленный сервер еще один порт и между ним и портом s2_port собственно и устанавливается шифрованный канал. На сервере же, stunnel выступает в роли клиента и сам открывает произвольный порт (из старших номеров) для получения обратного трафика от приложения-сервера (который он шифрует перед отправкой на клиентский компьютер).
Все эти обратные порты открываются только для связи с другим портом (netstat такие порты отмечает статусом ESTABLISHED) и они не являются слушающими (LISTEN статус в выводе netstat) соединение (исходящие) от такого порта файерволом не блокируется.

И так, с механизмом встраивания stunnel в работу клиент-серверного приложения мы разобрались. Посмотрим теперь как он устанавливается и настраивается.

Установка Stunnel

Несмотря на то что настройки stunnel для сервера и клиента различаются, но устанавливается он и на сервер и на клиент одинаково:

Настройка Stunnel

Настройка Stunnel на сервере

stunnel использует все файлы с расширением .conf, которые находит в каталоге /etc/stunnel как конфигурационные. В каждом файле могут быть описаны как и общие параметры настройки так и настройки для отдельных сервисов, причем в одном файле можно описать несколько сервисов.

Создадим новый конфигурационный файл:

В нем нам нужно указать настройки самого stunell:

В принципе, этого вполне достаточно.
Дополнительно можно указать сжатие: бывает полезно кроме шифрования еще и сжать трафик, но это не обязательно если оригинальный трафик и так уже сжат.

Можно еще указать путь куда будут записываться логи сервиса stunnel

Теперь опишем наш сервис по следующему:

В этом шаблоне нужно будет указать реальные порты приложения сервера (<service_port>) и порт на котором будет принимать соединения stunnel для этого сервиса (<s2_port>). Имя хоста или внешний IP адрес сервера (<ex.t.ser.ver>) можно и не указывать (пропустить), тогда stunnel будет слушать этот порт на всех адресах сервера. Пример для сервиса telnet будет выглядеть примерно так (stunnel будет ждать установки соединения с клиентской стороны на порту 8023)

stunnel имеет достаточно большое количество настроек - все их мы не будем перечислять. О них можно узнать из манула на stunnel

Созданный файл конфигурации закрываем и сохраняем.
Кроме настройки конфигурационных файлов, нужно еще разрешить запуск stunnel. Для этого в файле /etc/default/stunnel нужно заменить

Теперь создадим сертификат:

Созданный сертификат нужно также передать (по защищенным каналам) на клиентскую машину.

Настроенный stunnel запускаем:

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

Настройка на клиентской машине не сильно отличается от настройки на серверной машине.
Общие настройки (минимальный вариант):

И настройки сервиса по шаблону:

Для telnet такая конфигурация будет выглядеть так:

где aa.bb.cc.dd - IP адрес или DNS -имя внешнего сервера.

Настроенный stunnel разрешаем (так же как и на сервере, редактируя /etc/default/stunnel) и запускаем:

Команда telnet соединения с внешним сервером по ssl-туннелированному протоколу будет выглядеть так:

Соединиться по нешифрованному каналу с telnet сервером можно было бы командой

Но этого делать не стоит, и особенно не стоит telnet сервис выставлять в интернет (крайне вероятно что ваш сервер очень скоро взломают хакеры).

На самом деле, пример с telnet - исключительно умозрительный и надуманный (хотя и может применяться для отладки, но с соблюдением мер предосторожности), для удаленного логина в консоль сервера гораздо проще использовать ssh (там уже есть встроенное шифрование).

Особенности настроек приложений при работе через stunnel

Нужно понимать, что указание в строке подключения клиента localhost вместо IP адреса или имени сервера может оказать влияние на работу сервиса.

заменяем на соединение с localhost:

Но это приведет к тому, что в маршрутизацию клиента (ip route), при установлении соединения с OpenVPN сервером, будет записан маршрут не на внешний сервер, а на localhost (ведь соединение было с localhost, а не с удаленным сервером), что приведет к практически полной неработоспособности сети на клиенте (из за возникшего цикла в правилах маршрутизации).

Обеспечить доступ из «везде где есть интернет» к некоему ПО. Шифровать траффик между клиентской и серверной частью приложения, которое не умеет работать через SSL. Так же нужно иметь возможность ограничивать доступ некоторым пользователям при необходимости. По различным причинам основные реализации VPN отпали. В процессе поиска решения наткнулся на Stunnel, который идеально подошел. В данной статье постараюсь детально описать процесс настройки.

Статья по большей части составлена из рабочих заметок в довесок с претензиями на туториал, поэтому прошу спокойно относится к капитанству вида — «Первое, что мы сделаем — обновим систему».

Общее представление схемы работы:

ПО клиент (windows) > Stunnel > Интернет > Stunnel > ПО Сервер (linux)

Система: свежеустановленная ubuntu server 14.04 x64.

Приложение трафик которого нужно шифровать я называть не буду. Вместо него буду указывать ssh. Для теста подходит идеально, на мой взгляд.

Приступим

Первое, что мы сделаем — обновим систему:


Настроим и включим ufw:

  • /var/lib/stunnel4 здесь будет chroot окружение
  • /etc/stunnel любой файл в этом каталоге оканчивающийся на .conf будет считаться конфигом
  • /usr/share/doc/stunnel4/examples с примером конфига внутри

Проведем некоторые подготовительные мероприятия.

Разрешим автозапуск. В файле /etc/default/stunnel4 заменим ENABLED=0 на ENABLED=1:


Создадим папки для клиентских сертификатов. certs — разрешенные, crls — запрещенные (отозванные). О самих сертификатах чуть позже.


Создадим лог-файл и сменим владельца.

Я не считаю размещение логов в месте отличном от /var/log хорошей идеей, но заставить stunnel писать логи за пределы окружения мне не удалось.


Я буду использовать свой конфиг, но если он вам не подходит можно взять пример в /usr/share/doc/stunnel4/examples

Создадим конфигурационный файл:


Со следующим содержимым:

Ключи и сертификаты

Не большое отступление. В нашем случае stunnel проверяет только корректность пары сертификат/ключ и наличие сертификата в разрешенных или запрещенных. Самоподписанного сертификата более чем достаточно, и с технической стороны (stunnel) и со стороны поставленной задачи. Нет никакого смысла заморачиваться с собственным CA или с присутствием корневого сертификата в списке доверенных на клиенте или сервере.

Нам нужны пары сертификат/ключ для сервера и каждого клиента.

C помощью openssl создадим пару для сервера:


Отвечаем на вопросы:


И переместим их по назначению:


Как и где хранить клиентские сертификаты с ключами (за исключением каталогов certs и crls созданных ранее) решать вам. Я просто создам каталог clients в домашней директории своего пользователя и буду хранить их там на первых порах.

Создадим каталог и перейдем в него:


Создадим пару для клиента:


Как и при создании сертификата для сервера отвечаем на вопросы. Common Name будет другим например client.

Создадим еще одну пару:

Предположим, что clientcert.pem сертификат клиента которому доступ разрешен, а dnclientcert.pem сертификат клиента которому доступ запрещен. Скопируем сертификаты по нужным директориям.


Для каждого сертификата нужно создать хэш-ссылки (Возможно «хэш-ссылка» не корректное название, но оно очень точно передает суть). Это можно сделать с помощью утилиты c_rehash из пакета openssl. Мы же создадим небольшой скрипт для этих целей.


Со следующим содержимым:


Возможно будет более целесообразным разместить certlink.sh где нибудь в /usr/bin. Я пока не стал этого делать. Но выбор за вами.
Дадим права:

В результате в каталогах у нас должны появится ссылки вида 7469493f.0.

Stunnel на клиенте

На клиенте будем использовать версию stunnel аналогичную серверной. На сервере у нас 4.53. Забираем с одного из зеркал.

Если прямая ссылка перестанет работать, найти нужную версию можно так:

Редактируем файл stunnel.conf. У меня он имеет следующий вид:


Здесь debug = 7 только на момент отладки, потом можно понизить до 3 или 4. Также есть опции для «тихого режима» и сокрытия значка в трее все есть в man'e.

Запускаем stunnel.exe, и пробуем с помощью putty подключится к 127.0.0.1. Тестируем. Можно попробовать подключится с запрещенным сертификатом.

Полезные материалы

Приведенные здесь инструкции полностью работоспособны. Проверено 26.12.2014 ubuntu 14.04.01, stunnel 4.53.

В данный момент работаю над парсингом логов stunnel с выводом отчетов и автоматизацией создания/управления сертификатами. Так как в последнее время мне интересен golang, реализовано будет с помощью него. Если материал на эту тему интересен — дайте знать.

Программа Stunnel предназначена для развертывания шифрования SSL между удаленным клиентом и локальным или удаленным сервером. Stunnel добавляет функциональность SSL к наиболее часто используемым демонам Inetd (например, POP2, POP3) и IMAP-серверам без каких-либо изменений в коде программы.

Stunnel превращает любой небезопасный TCP-порт в зашифрованный с помощью криптографического пакета OpenSSL. Это похоже на небольшую безопасную VPN, которая работает на определенных портах.

Примечание: данное руководство было протестировано на виртуальных выделенных серверах Ubuntu 12.04, Ubuntu 12.10, Ubuntu 13.04.

1: Подготовка системы

При помощи нижеприведенных команд обновите список пакетов и сами пакеты:

apt-get update
apt-get upgrade

2: Установка Stunnel

Программу Stunnel можно установить при помощи стандартного менеджера пакетов:

apt-get install stunnel4 -y

3: Настройка Stunnel

Настройки Stunnel хранятся в файле stunnel.conf, который по умолчанию находится в /etc/stunnel. Чтобы создать этот файл, используйте:

Чтобы идентифицировать себя на сервере, нужно использовать сертификат SSL; для этого необходимо задать путь к этому сертификату в файле stunnel.conf Используйте следующую строку (сам файл сертификата будет создан далее):

Затем нужно указать сервис для взаимодействия с Stunnel. Это может быть любой сервис, который использует сеть (почтовый сервер, прокси-сервер и т.д.).

В данном руководстве для примера будет показано, как защитить трафик между прокси-сервером Squid и клиентом, использующим Stunnel. Инструкции по установке Squid можно найти в разделе 6.

Указав название сервиса, взаимодействующего с Stunnel, нужно указать Stunnel, на каком порте нужно прослушивать данный сервис. Это может быть любой из 65535 портов, если только он не заблокирован другим сервисом или фаерволом.

[squid] accept = 8888

Далее нужно указать в конфигурационном файле порт и IP-адрес сервиса, для которого создается безопасный туннель. В основном Stunnel принимает пакеты от безопасного порта, а затем пересылает их на порт и IP-адрес указанного сервиса.

По умолчанию Squid-прокси запускается на локальном хосте и использует порт 3128; следовательно, чтобы программа Stunnel могла принимать соединения с этим сервисом, в данном случае в конфигурационный файл нужно внести следующую строку:

В целом конфигурационный файл stunnel.conf должен иметь такой вид:

client = no
[squid] accept = 8888
connect = 127.0.0.1:3128
cert = /etc/stunnel/stunnel.pem

Примечание: параметр client = no не является обязательным, поскольку Stunnel по умолчанию работает в режиме сервера.

4: Создание SSL-сертификата

Stunnel использует сертификат SSL для защиты соединений. Такой сертификат можно легко создать с помощью пакета OpenSSL:

openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
cat key.pem cert.pem >> /etc/stunnel/stunnel.pem

Вышеприведенные команды генерируют закрытый ключ, создают сертификат при помощи этого ключа, а затем объединяют эти файлы в один файл по имени stunnel.pem, который и будет использовать Stunnel.

Примечание: при создании сертификата нужно указать некоторую информацию; обратите внимание на поле Common Name – в нем нужно указать имя хоста или IP-адрес сервера.

Затем настройте автоматический запуск Stunnel. Для этого откройте файл /etc/default/stunnel4 в текстовом редакторе:

и измените значение параметра ENABLED на 1:

В завершение перезапустите Stunnel, чтобы обновить настройки.

5: Установка прокси-сервера Squid

Чтобы установить Squid, используйте:

apt-get install squid3 -y

6: Настройка Stunnel как клиента

Примечание: данный раздел демонстрирует установку и настройку Stunnel в качестве клиента в Windows, но настройки и инструкции по установке программы в Linux или даже Android останутся такими же. Единственное отличие – местонахождение конфигурационного файла stunnel.conf.

Для того, чтобы Stunnel мог взаимодействовать с сервером, сертификат SSL (см. раздел 4) должен находиться на клиенте. Существует множество способов перемещение файла stunnel.pem с сервера, но в данном случае для этого используется протокол SFTP – одновременно достаточно простой и безопасный.

При помощи SFTP-клиента (например, Filezilla) подключитесь к серверу и загрузите файл stunnel.pem из каталога /etc/stunnel/ на клиент.

Примечание: чтобы получить больше информации о работе SFTP, читайте руководство «Использование SFTP для безопасного обмена файлами с удаленным сервером».

Скачайте Stunnel с сайта проекта.

Установите Stunnel в любой удобной точке системы. Затем перейдите в папку Stunnel и переместите в нее файл сертификата stunnel.pem.

Создайте в папке Stunnel файл stunnel.conf (если такого файла еще нет). Откройте файл при помощи текстового редактора (например, Notepad).

Для начала нужно указать путь к сертификату, который в Windows находится в каталоге Stunnel.

Примечание: в Ubuntu этот файл находится в каталоге /etc/stunnel/.

В данном случае нужно перевести Stunnel в режим клиента. Поместите следующую строку в файл:

Далее нужно указать конфигурации сервиса, который нужно использовать.

Сначала укажите имя сервиса, затем его IP и порт, который должна прослушивать программа Stunnel на клиенте.

[squid] accept = 127.0.0.1:8080

Для этого подойдет любой порт на клиентском компьютере, если он не занят другим сервисом и не блокируется брандмауэром.

Затем нужно настроить Stunnel для передачи пакетов, поступающих на данный порт, серверу Stunnel; для этого укажите IP-адрес виртуального сервера и порт, заданный при настройке сервера Stunnel (в данном случае это порт 8888):

connect = [внешний IP-адрес]:8888

В итоге файл stunnel.conf будет иметь такой вид:

cert = stunnel.pem
client = yes
[squid] accept = 127.0.0.1:8080
connect = [Server’s Public IP]:8888

Сохраните и закройте файл.

Готово! Взаимодействие клиента и сервера надежно защищено SSL-туннелем. Теперь для подключения к любому сервису VPS нужно вводить не только IP, но также и порт, заданный в параметре accept конфигурационного файла Stunnel.

Например, чтобы подключиться к прокси-серверу Squid на облачном сервере, нужно указать 127.0.0.1:8080, и Stunnel автоматически подключится к сервису, запущенному на указанном порте. Чтобы защитить трафик, настройте браузер использовать порт 8080 в качестве прокси.

Очень часто возникает потребность защитить от различных систем мониторинга работу SSH, VPN, либо других сервисов. С этим отлично справится stunnel, который мы и рассмотрим в данной статье.

Введение

Мы рассмотрим работу с данным программным продуктом на примере дистрибутива Fedora (и CentOS с подключённым репозиторием EPEL7) и будем защищать OVN сервер.

Установка stunnel

Пакет доступен в главном репозитории Fedora. Установим его:

Настройка сервера stunnel

Все файлы конфигурации сервера должны находиться в каталоге /etc/stunnel, поэтому создадим главный конфиг stunnel.conf и укажем правильные права доступа:

Листинг файла /etc/stunnel/stunnel.conf:

Создадим каталог для индивидуальных конфигов защищаемых сервисов:

Листинг файла /etc/stunnel/conf.d/ovn.conf:

Создание сертификатов

Stunnel будет осуществлять аутентификацию клиентов при помощи сертификатов.

Создадим каталог для их хранения:

Сгенерируем сертификат для нашего сервера:

На выходе мы получим файлы server.crt (открытый ключ) и server.key (секретный ключ). Загрузим их на сервер в каталог /etc/stunnel/certs любым удобным для нас способом и установим chmod 0600:

Сгенерируем сертификаты для клиентов (каждый клиент должен выполнять этот шаг самостоятельно, а затем лишь передать свой открытый ключ (файл client.crt) на сервер):

Объединим все открытые ключи клиентов в единый бандл:

Скопируем полученный clients.pem на сервер любым способом и установим chmod 0644:

При появлении нового клиента его публичный ключ должен быть добавлен в бандл, а сервис stunnel перезапущен.

Запуск сервера

Теперь мы наконец готовы запустить наш сервер:

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

Создадим каталог для хранения пользовательских сертификатов:

Создадим конфиг клиента client.conf и установим ему корректные права доступа:

Листинг файла /etc/stunnel/client.conf:

Скопируем публичный ключ сервера server.crt, а также клиентский сертификат (открытый (client1.crt) и закрытый (client1.key) ключи) в /etc/stunnel/certs и установим им правильный chmod:

Теперь изменим OVN подключение так, чтобы в качестве IP-адреса сервера использовался 127.0.0.1:1194.

Информация о пакете

Контрольная сумма: 7d53af550a1c2e01e146b936e58b8860

Требуемое дисковое пространство: 3.9 MB

Расчетное время сборки: 0.11 SBU

Зависимости Stunnel

Требуемые
Опционально

Установка Stunnel

Демон stunnel будет запущен в chroot окружении любым непривилегированным пользователем. Создадаим нового пользователя, группу и структуру домашней директории chroot , используя следующие команды, как пользователь root:

[Замечание]

Замечание

Для запуска демона необходимы подписанный SSL сертификат и личный ключ stunnel . Если вы владелец или имеете уже созданный подписанный SSL сертификат и хотите его использовать, скопируйте его в tools/stunnel.pem директорию исходников перед началом сборки, в противном случае вас запросят для его создания. Файл .pem должен быть отформатирован, как показано ниже:

Установим Stunnel запуском следующих команд:

А теперь, как пользователь root:

Описание команд

--sysconfdir=/etc: Этот параметр установит директорию конфигурации в /etc вместо /usr/etc.

--localstatedir=/var/lib/stunnel: Этот параметр заставит процесс установки создать /var/lib/stunnel/stunnel вместо /usr/var/stunnel.

make : Эта команда построит пакет и, если вы не скопировали файл stunnel.pem в директорию исходников tools/, запросит у вас необходимую информацию для его создания. Обеспечте ваш запрос к

ввод с именем или IP адресом будет использован для доступа сервиса.

Конфигурация Stunnel

Файлы конфигурации

Конфигурационная информация

Создайте основной файл конфигурации /etc/stunnel/stunnel.conf используя следующие команды:

Затем вам необходимо добавить сервис, который хотите шифровать, в файл конфигурации, который имеет следующий формат:

Если вы используете Stunnel для шифрования демона, запущенного из [x]inetd , вам может понадобиться исключить этот демон в файле /etc/[x]inetd.conf и включить соответствующий [service]_stunnel сервис. Вы можете захотеть добавить подходящее содержание в /etc/services.

Для полного ознакомления с командами и синтаксисом, используемыми в файле конфигурации, запустите man stunnel . Для просмотра BLFS примера актуальной установки шифрованного сервиса stunnel , прочтите раздел “Конфигурация SWAT” в инструкциях к Samba .

Для автоматического старта демона stunnel при перезагрузке системы установите стартовый скрипт /etc/rc.d/init.d/stunnel из пакета blfs-bootscripts-6.0.

Содержание

Установленные программы: stunnel и stunnel3 Установленные библиотеки: libstunnel.so Установленные директории: /etc/stunnel, /var/lib/stunnel и /usr/share/doc/stunnel

Короткое описание

прграмма, разработанная для работы в качестве SSL шифрующей обертки между удаленными клиентами и локальными (запускаемыми [x]inetd ) или удаленными серверами.

stunnel3

Perl скрипт для использования синтаксиса stunnel 3.x с stunnel >=4.05.

Читайте также: