- Home »

Как подключиться к управляемому Redis через TLS с помощью Stunnel и Redis CLI
Если вы используете управляемый Redis от облачного провайдера, рано или поздно столкнётесь с необходимостью подключения через TLS. Стандартный redis-cli не умеет работать с TLS «из коробки», и вот тут на помощь приходит Stunnel — простой и надёжный инструмент для создания TLS-туннелей. В этой статье разберём, как настроить безопасное соединение с Redis через Stunnel, избежать типичных ошибок и автоматизировать процесс.
## Как работает связка Redis + Stunnel
Stunnel выступает посредником между вашим локальным redis-cli и удалённым Redis-сервером. Он создаёт локальный TCP-сокет, который принимает незащищённые соединения и проксирует их через TLS к целевому серверу.
Схема работы:
• redis-cli подключается к localhost:6379 (или другому локальному порту)
• Stunnel перехватывает соединение и устанавливает TLS-туннель к реальному Redis-серверу
• Весь трафик шифруется и передаётся безопасно
Для полноценной работы понадобится VPS или выделенный сервер с установленным Stunnel.
## Установка и настройка Stunnel
### Установка на Ubuntu/Debian:
sudo apt update
sudo apt install stunnel4
### Установка на CentOS/RHEL:
sudo yum install stunnel
# или для более новых версий
sudo dnf install stunnel
### Базовая конфигурация
Создайте файл конфигурации `/etc/stunnel/redis.conf`:
[redis]
accept = 6379
connect = your-redis-server.com:6380
cert = /path/to/cert.pem
key = /path/to/key.pem
Где:
• `accept` — локальный порт для подключения
• `connect` — адрес и порт управляемого Redis
• `cert` и `key` — сертификаты (если требуются)
## Пошаговая настройка для популярных провайдеров
### Настройка для AWS ElastiCache
# /etc/stunnel/redis-aws.conf
[redis-aws]
accept = 6379
connect = your-cluster.cache.amazonaws.com:6379
cert = /etc/ssl/certs/aws-cert.pem
### Настройка для Azure Cache for Redis
# /etc/stunnel/redis-azure.conf
[redis-azure]
accept = 6379
connect = your-cache.redis.cache.windows.net:6380
cert = /etc/ssl/certs/azure-cert.pem
### Запуск Stunnel
# Запуск с конкретным конфигом
sudo stunnel /etc/stunnel/redis.conf
# Проверка статуса
sudo systemctl status stunnel4
sudo systemctl enable stunnel4
## Практические примеры подключения
### Базовое подключение через redis-cli
# Подключение к локальному порту Stunnel
redis-cli -h localhost -p 6379
# Подключение с аутентификацией
redis-cli -h localhost -p 6379 -a your-password
# Выбор конкретной базы данных
redis-cli -h localhost -p 6379 -n 1
### Проверка соединения
redis-cli -h localhost -p 6379 ping
# Должно вернуть: PONG
redis-cli -h localhost -p 6379 info server
# Покажет информацию о сервере
## Сравнение подходов к TLS-подключению
Метод | Сложность настройки | Производительность | Гибкость |
---|---|---|---|
Stunnel | Низкая | Высокая | Высокая |
Redis 6+ native TLS | Средняя | Высокая | Средняя |
SSH tunnel | Низкая | Средняя | Средняя |
HAProxy | Высокая | Очень высокая | Очень высокая |
## Типичные ошибки и их решения
### Ошибка: Connection refused
# Проверьте, запущен ли Stunnel
sudo netstat -tlnp | grep 6379
sudo systemctl status stunnel4
# Проверьте конфигурацию
sudo stunnel -test /etc/stunnel/redis.conf
### Ошибка: Certificate verification failed
# Отключите проверку сертификатов для тестирования
# Добавьте в конфиг:
verify = 0
### Проблемы с правами доступа
# Убедитесь, что stunnel имеет доступ к сертификатам
sudo chmod 600 /path/to/cert.pem
sudo chown stunnel4:stunnel4 /path/to/cert.pem
## Автоматизация и скрипты
### Скрипт для автоматического подключения
#!/bin/bash
# redis-connect.sh
STUNNEL_CONFIG="/etc/stunnel/redis.conf"
REDIS_HOST="localhost"
REDIS_PORT="6379"
# Проверяем, запущен ли Stunnel
if ! pgrep -x "stunnel" > /dev/null; then
echo "Запускаем Stunnel..."
sudo stunnel $STUNNEL_CONFIG
sleep 2
fi
# Подключаемся к Redis
redis-cli -h $REDIS_HOST -p $REDIS_PORT "$@"
### Мониторинг соединения
#!/bin/bash
# redis-monitor.sh
while true; do
if redis-cli -h localhost -p 6379 ping > /dev/null 2>&1; then
echo "$(date): Redis доступен"
else
echo "$(date): Redis недоступен, перезапускаем Stunnel"
sudo systemctl restart stunnel4
fi
sleep 30
done
## Альтернативные решения
### SSH-туннель
# Создание SSH-туннеля
ssh -L 6379:redis-server:6379 user@jumphost
# Подключение через туннель
redis-cli -h localhost -p 6379
### Использование socat
# Установка socat
sudo apt install socat
# Создание TLS-прокси
socat TCP-LISTEN:6379,fork OPENSSL:redis-server:6380,verify=0
## Интересные факты и нестандартные применения
### Балансировка нагрузки через Stunnel
Можно настроить несколько секций для разных Redis-серверов:
[redis-master]
accept = 6379
connect = master.redis.com:6380
[redis-slave]
accept = 6380
connect = slave.redis.com:6380
### Интеграция с Docker
# Dockerfile для контейнера со Stunnel
FROM ubuntu:20.04
RUN apt update && apt install -y stunnel4 redis-tools
COPY redis.conf /etc/stunnel/
CMD ["stunnel", "/etc/stunnel/redis.conf"]
### Использование в CI/CD
# .gitlab-ci.yml
test:
script:
- stunnel /path/to/redis.conf &
- sleep 5
- redis-cli -h localhost -p 6379 ping
- run-tests.sh
## Оптимизация производительности
### Настройка буферов
[redis]
accept = 6379
connect = redis-server:6380
# Увеличиваем буферы
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
### Настройка пула соединений
# Максимальное количество соединений
[redis]
accept = 6379
connect = redis-server:6380
# Ограничиваем количество соединений
maxconn = 100
## Безопасность и лучшие практики
### Настройка логирования
[redis]
accept = 6379
connect = redis-server:6380
# Включаем детальное логирование
debug = 7
output = /var/log/stunnel-redis.log
### Ограничение доступа
# Разрешаем подключения только с localhost
[redis]
accept = 127.0.0.1:6379
connect = redis-server:6380
## Статистика и мониторинг
### Получение статистики Stunnel
# Включаем статистику в конфиге
[redis]
accept = 6379
connect = redis-server:6380
# Веб-интерфейс статистики
[https]
accept = 9443
connect = 127.0.0.1:8080
cert = /etc/ssl/certs/stunnel.pem
### Мониторинг через systemd
# Создание systemd service
# /etc/systemd/system/stunnel-redis.service
[Unit]
Description=Stunnel Redis TLS Proxy
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/stunnel /etc/stunnel/redis.conf
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
Restart=always
[Install]
WantedBy=multi-user.target
## Интеграция с другими инструментами
### Использование с Redis Sentinel
# Конфигурация для Sentinel
[redis-sentinel]
accept = 26379
connect = sentinel-server:26379
cert = /etc/ssl/certs/sentinel.pem
### Интеграция с Prometheus
# Экспорт метрик Stunnel
stunnel_exporter --stunnel.stats-file=/var/run/stunnel4/stunnel.stats
## Заключение и рекомендации
Stunnel — это надёжное и проверенное временем решение для организации TLS-подключений к Redis. Основные преимущества:
• **Простота настройки**: минимальная конфигурация для быстрого старта
• **Стабильность**: работает годами без сбоев
• **Гибкость**: поддерживает различные сценарии использования
• **Производительность**: минимальные накладные расходы
Используйте Stunnel, когда:
• Работаете с управляемым Redis без встроенной TLS-поддержки
• Нужно быстро настроить безопасное соединение
• Требуется совместимость со старыми версиями redis-cli
Избегайте Stunnel, если:
• Используете Redis 6+ с нативной TLS-поддержкой
• Нужны сложные балансировка и маршрутизация (лучше HAProxy)
• Критична минимальная задержка (прямое TLS-соединение эффективнее)
Для продуктивной работы рекомендую настроить мониторинг, автоматический перезапуск и регулярное обновление сертификатов. Не забывайте про безопасность — ограничивайте доступ к локальному порту и используйте актуальные версии Stunnel.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.