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