Как использовать stunnel для https доступа к веб-интерфейсу устройства

Введение

Во многих случаях веб-интерфейсы устройств доступны только по HTTP. При размещении таких устройств в удаленных сетях возникает задача обеспечить безопасный доступ к ним через интернет. Открытие HTTP-доступа напрямую недопустимо, поскольку трафик передается в открытом виде.

Одним из простых и быстроразворачиваемых решений является использование stunnel — прокси-сервиса, который оборачивает незащищенное соединение в TLS. Это позволяет организовать HTTPS-доступ к устройству без изменения его конфигурации.

Принцип работы решения

В схеме участвуют три стороны:

  • Устройство — сервер, маршрутизатор, контроллер или любое оборудование с веб-интерфейсом. Работает только по HTTP, находится в локальной сети или на удаленной площадке. Его конфигурация не меняется.
  • Промежуточный сервер (VPS или собственный сервер с публичным IP) — на нем разворачивается stunnel. Он принимает входящие HTTPS-соединения снаружи и пересылает их на устройство по HTTP внутри сети. Именно здесь происходит шифрование и терминация TLS.
  • Клиент — браузер или любой HTTP-клиент администратора. Обращается к промежуточному серверу по HTTPS через интернет.

Таким образом, трафик между клиентом и промежуточным сервером защищен TLS. Трафик между промежуточным сервером и устройством идет по HTTP внутри защищенной или доверенной сети.

Подготовка сервера (на примере Debian/Ubuntu)

Для реализации потребуется сервер с доступом в интернет и публичным IP-адресом. Это может быть VPS или собственный сервер.

Установка stunnel:


apt update
apt install stunnel4 -y

После установки необходимо разрешить запуск сервиса. На Debian/Ubuntu stunnel4 по умолчанию отключен — нужно явно задать флаг в файле /etc/default/stunnel4:


ENABLED=1

Без этого шага команда systemctl restart stunnel4 завершится без ошибок, но сервис фактически не запустится. Убедитесь, что флаг установлен до перезапуска.

Генерация сертификата

Для работы HTTPS требуется TLS-сертификат. Поддерживаются два режима: односторонняя аутентификация (только сервер) и двусторонняя (сервер + клиент). Выберите подходящий вариант в зависимости от требований к безопасности. Для генерации сертификата используется библиотека openssl (универсальная библиотека с открытым исходным кодом, предназначенная для защиты сетевых данных с помощью криптографических алгоритмов и протоколов TLS/SSL).

Если пакет openssl не установлен, установите его:


apt install openssl -y

Вариант 1: Односторонняя аутентификация (только сертификат сервера)

Это минимальная конфигурация: сервер предъявляет сертификат клиенту, клиент не аутентифицируется. Подходит для быстрого развертывания и тестирования.

Генерация самоподписанного сертификата сервера:


openssl req -new -x509 -days 3650 -nodes \
  -out /etc/stunnel/stunnel.pem \
  -keyout /etc/stunnel/stunnel.pem

После генерации ограничьте права доступа к файлу — он содержит приватный ключ:


chmod 600 /etc/stunnel/stunnel.pem

При односторонней аутентификации после настройки веб-интерфейс устройства будет доступен из интернета по HTTPS любому, кто знает адрес сервера. Шифруется только канал передачи данных. Единственная защита от несанкционированного входа — имя пользователя и пароль самого устройства. Если устройство не защищено паролем или использует стандартные учетные данные, это создает серьезный риск безопасности.

Вариант 2: Двусторонняя аутентификация (сертификаты сервера и клиента)

В этом варианте сервер принимает подключения только от клиентов, предъявивших доверенный сертификат. Это исключает доступ посторонних даже при знании адреса сервера — без сертификата соединение будет отклонено на уровне TLS.

Шаг 1. Создайте центр сертификации (CA):


# Создаём директорию для CA
mkdir -p /etc/stunnel/ca

# Генерируем ключ и самоподписанный сертификат CA
openssl req -new -x509 -days 3650 -nodes \
  -keyout /etc/stunnel/ca/ca.key \
  -out /etc/stunnel/ca/ca.crt \
  -subj "/CN=stunnel-ca"

# Ограничиваем права доступа
chmod 600 /etc/stunnel/ca/ca.key

Шаг 2. Выпустите сертификат сервера, подписанный CA:


# Генерируем ключ и запрос на сертификат (CSR) для сервера
openssl req -new -nodes \
  -keyout /etc/stunnel/server.key \
  -out /etc/stunnel/server.csr \
  -subj "/CN=stunnel-server"

# Подписываем CSR нашим CA
openssl x509 -req -days 3650 \
  -in /etc/stunnel/server.csr \
  -CA /etc/stunnel/ca/ca.crt \
  -CAkey /etc/stunnel/ca/ca.key \
  -CAcreateserial \
  -out /etc/stunnel/server.crt

# Объединяем ключ и сертификат в один файл для stunnel
cat /etc/stunnel/server.key /etc/stunnel/server.crt > /etc/stunnel/server.pem

# Ограничиваем права доступа
chmod 600 /etc/stunnel/server.pem

Шаг 3. Выпустите сертификат клиента:


# Генерируем ключ и CSR для клиента
openssl req -new -nodes \
  -keyout /etc/stunnel/client.key \
  -out /etc/stunnel/client.csr \
  -subj "/CN=stunnel-client"

# Подписываем CSR нашим CA
openssl x509 -req -days 3650 \
  -in /etc/stunnel/client.csr \
  -CA /etc/stunnel/ca/ca.crt \
  -CAkey /etc/stunnel/ca/ca.key \
  -CAcreateserial \
  -out /etc/stunnel/client.crt

# Объединяем для использования в браузере или stunnel-клиенте
cat /etc/stunnel/client.key /etc/stunnel/client.crt > /etc/stunnel/client.pem

Файл client.pem (или пара client.key + client.crt) необходимо передать на клиентское устройство. В браузере клиентский сертификат импортируется в хранилище сертификатов. При подключении браузер автоматически предъявит его серверу.

Файл ca.crt используется сервером для проверки клиентских сертификатов. Конфигурация stunnel для двусторонней аутентификации описана в следующем разделе.

Настройка stunnel

Конфигурация для односторонней аутентификации

Основной конфигурационный файл /etc/stunnel/stunnel.conf:


pid = /run/stunnel4/stunnel.pid
cert = /etc/stunnel/stunnel.pem

[https]
accept = 443
connect = 192.168.1.100:80

Конфигурация для двусторонней аутентификации

Для включения проверки клиентского сертификата добавьте директивы CAfile и verify:


pid = /run/stunnel4/stunnel.pid
cert = /etc/stunnel/server.pem
CAfile = /etc/stunnel/ca/ca.crt
verify = 2

[https]
accept = 443
connect = 192.168.1.100:80

Где:

  • pid — путь к PID-файлу; явное указание предотвращает ошибки прав доступа при запуске;
  • cert — путь к файлу сертификата и ключа сервера;
  • CAfile — сертификат CA, которым подписаны клиентские сертификаты (только для двусторонней аутентификации);
  • verify = 2 — требовать и проверять сертификат клиента (только для двусторонней аутентификации);
  • accept — порт, на котором stunnel принимает HTTPS-запросы от клиентов;
  • connect — адрес устройства, к которому пересылаются запросы.

После настройки перезапустите сервис:


systemctl restart stunnel4
systemctl status stunnel4

Убедитесь, что в выводе status статус — active (running). Если сервис не запустился, проверьте флаг ENABLED=1 в /etc/default/stunnel4.

Для отладки можно временно запустить stunnel в режиме переднего плана, добавив в конфиг строку:


foreground = yes

В этом режиме все сообщения выводятся в консоль, что упрощает диагностику проблем.

Настройка фаервола

Порт 443 необходимо ограничить, чтобы исключить несанкционированный доступ. Рекомендуется разрешать подключение только с конкретных IP-адресов:


# Разрешить доступ только с вашего IP
ufw allow from <ваш_IP> to any port 443

# Если IP динамический — можно ограничить диапазоном
ufw allow from 203.0.113.0/24 to any port 443

# Включить фаервол
ufw enable

Если открыть порт 443 без ограничений, доступ к интерфейсу получат все желающие. stunnel не выполняет аутентификацию пользователей — фаервол является единственным рубежом защиты на сетевом уровне. Исключение — вариант с двусторонними сертификатами, где доступ без клиентского сертификата невозможен на уровне TLS.

Настройка доступа: устройство с белым IP

Если устройство находится в локальной сети с публичным IP, stunnel может быть развернут на отдельном сервере в той же сети. Stunnel принимает HTTPS-запросы и напрямую обращается к устройству.

В настройках stunnel в директиве connect указывается IP-адрес устройства в локальной сети.

Настройка доступа: устройство без белого IP

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

Если промежуточный сервер и устройство находятся в разных сетях, соединенных через публичный интернет (например, через reverse SSH-туннель), HTTP-участок маршрута будет проходить через незащищенный канал. В этом случае необходимо дополнительно зашифровать соединение между сервером и устройством — например, с помощью VPN.

Один из способов — reverse SSH-туннель.

На устройстве в локальной сети (или на шлюзе) выполняется команда, которая пробрасывает локальный порт устройства на промежуточный сервер:


# Выполняется на устройстве в локальной сети
ssh -N -R 8080:192.168.1.100:80 user@<IP_сервера>

После этого на промежуточном сервере порт 8080 соответствует порту 80 устройства. Конфигурация stunnel на сервере в этом случае:


pid = /run/stunnel4/stunnel.pid
cert = /etc/stunnel/stunnel.pem # или server.pem при двусторонней аутентификации

[https]
accept = 443
connect = 127.0.0.1:8080

В этом варианте connect указывает на localhost, а не на адрес в локальной сети — это принципиальное отличие от схемы с прямым доступом. Reverse SSH-туннель необходимо поддерживать активным (например, через systemd или autossh) — при обрыве связи туннель потребует перезапуска.

Проверка работы

После настройки доступ осуществляется через браузер:


https://<IP_сервера>

При использовании самоподписанного сертификата браузер выдаст предупреждение безопасности — его необходимо подтвердить вручную.

Для проверки соединения из командной строки:


curl -k https://<IP_сервера>

Флаг -k отключает проверку сертификата — допустимо только для тестирования с самоподписанным сертификатом.

При использовании двусторонней аутентификации сервер потребует клиентский сертификат. В этом случае команда принимает вид:


curl -k --cert /etc/stunnel/client.pem https://<IP_сервера>

Ограничения и особенности

  • stunnel обеспечивает только шифрование канала. При односторонней аутентификации он не ограничивает круг клиентов — доступ открыт всем, кто знает адрес сервера.
  • Самоподписанный сертификат не верифицируется центром сертификации — браузер будет показывать предупреждение. Для производственного использования рекомендуется сертификат от Let’s Encrypt.
  • Двусторонняя аутентификация (verify = 2) надежно ограничивает доступ на уровне TLS, но требует управления клиентскими сертификатами.
  • Фаервол является дополнительным рубежом защиты — его настройка обязательна в любом варианте.

Заключение

Использование stunnel позволяет быстро организовать защищенный доступ к веб-интерфейсам устройств, которые изначально не поддерживают HTTPS. Решение не требует изменения конфигурации устройства.

Для корректной работы необходимо убедиться в нескольких ключевых моментах: флаг ENABLED=1 в /etc/default/stunnel4, права 600 на файл сертификата, явное указание pid в конфигурации и ограничение доступа по IP через фаервол.

Для сред с повышенными требованиями к безопасности рекомендуется использовать двустороннюю аутентификацию с клиентскими сертификатами — это исключает подключение посторонних даже при открытом порте 443.

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