Home » Как подключиться к управляемому Redis через TLS с помощью Stunnel и Redis CLI
Как подключиться к управляемому Redis через TLS с помощью Stunnel и Redis CLI

Как подключиться к управляемому 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.


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

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

Leave a reply

Your email address will not be published. Required fields are marked