⏱️ Час читання: ~10 хвилин | 📅 Оновлено: 7 грудня 2025
Redis обробляє мільйони запитів на секунду, зберігає сесії користувачів, кешує дані для миттєвого доступу. Але є проблема: за замовчуванням Redis слухає порт 6379 без будь-якої автентифікації. Хакери знають це і сканують інтернет 24/7.
У 2025 році близько 40 000 Redis серверів були публічно доступні без пароля. Результат — викрадені дані, криптомайнери на серверах, знищені бази даних. І все через неправильно налаштований порт.
Цей гайд — про те, як правильно налаштувати порти Redis у 2026 році: від базової конфігурації до production-ready безпеки з ACL та TLS. Незалежно від того, чи ви запускаєте Redis на VPS чи виділеному сервері, ці знання збережуть ваші дані.
Redis (Remote Dictionary Server) — це in-memory база даних, яка зберігає все в оперативній пам'яті. Поки традиційні бази читають з диска за 10-15 мілісекунд, Redis віддає дані за мікросекунди.
Традиційні бази даних зберігають дані на диску і читають їх при кожному запиті. Redis тримає все в оперативній пам'яті — звідси швидкість. Диск використовується тільки для persistence (збереження даних при перезапуску).
Клієнти (ваш сайт, додаток, API) підключаються до Redis через мережевий порт. За замовчуванням це порт 6379. Сервер постійно слухає цей порт, готовий прийняти команди: зберегти ключ, отримати значення, додати елемент до списку.
Redis 8 — найбільше оновлення за всю історію:
Redis використовує кілька портів для різних функцій. Розуміння кожного — ключ до правильної конфігурації.
| Порт | Призначення | Коли використовується |
|---|---|---|
| 6379 | Основний порт Redis | Всі клієнтські підключення |
| 16379 | Cluster Bus | Комунікація між нодами кластера |
| 26379 | Redis Sentinel | Моніторинг та автоматичний failover |
| Кастомний | Ваш вибір (6380, 6381...) | Кілька інстансів на одному сервері |
Це стандартний порт, який знає кожна клієнтська бібліотека — Python redis-py, Node.js ioredis, PHP Predis. Коли ви пишете redis.connect() без параметрів, підключення йде саме сюди.
Проблема: 6379 — перший порт, який сканують хакери. Shodan показує десятки тисяч відкритих Redis серверів щодня.
Коли Redis працює в cluster mode, ноди спілкуються між собою через порт 16379 (основний порт + 10000). Це внутрішній протокол для синхронізації даних та розподілу слотів.
Важливо: Цей порт ніколи не повинен бути доступний з інтернету — тільки між нодами кластера.
Redis Sentinel забезпечує High Availability — моніторить master-ноду і автоматично перемикає на replica, якщо master впав. Sentinel слухає порт 26379 для координації з іншими Sentinel-інстансами.
Незахищений Redis — це не питання "чи зламають", а "коли". Ось що потрібно налаштувати.
За замовчуванням Redis може слухати всі мережеві інтерфейси. Це небезпечно.
# redis.conf — слухати тільки localhost
bind 127.0.0.1
# Або конкретний приватний IP
bind 127.0.0.1 10.0.0.5
# НЕБЕЗПЕЧНО — слухати все
# bind 0.0.0.0
Redis 3.2+ має protected mode — якщо немає пароля і bind не налаштований, сервер відхиляє зовнішні підключення.
# redis.conf — завжди увімкнено
protected-mode yes
Старий requirepass — це один пароль для всіх. ACL (Access Control Lists) з Redis 6+ дозволяють створювати користувачів з різними правами.
# redis.conf — створення користувачів з ACL
# Вимкнути дефолтного користувача без пароля
user default off
# Адмін з повним доступом
user admin on >SuperStr0ngP@ssw0rd ~* +@all
# Користувач тільки для читання
user readonly on >R3adOnlyP@ss ~cached:* +@read -@dangerous
# Користувач для додатку — обмежені команди
user webapp on >W3bAppP@ss ~session:* ~cache:* +get +set +del +expire
Розшифровка ACL синтаксису:
on/off — активувати/деактивувати користувача>password — встановити пароль~pattern — доступ до ключів за патерном+command — дозволити команду-@category — заборонити категорію командRedis 6+ підтримує нативний TLS. Обов'язково для production, особливо якщо трафік йде через мережу.
# redis.conf — налаштування TLS
# Використовувати TLS на порту 6379, вимкнути незашифрований
tls-port 6379
port 0
# Сертифікати
tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
# Вимагати клієнтські сертифікати (опційно, але рекомендовано)
tls-auth-clients yes
# Мінімальна версія TLS
tls-protocols "TLSv1.2 TLSv1.3"
Навіть з усіма налаштуваннями Redis, firewall — обов'язковий.
# UFW — дозволити Redis тільки з конкретних IP
sudo ufw allow from 10.0.0.0/24 to any port 6379
sudo ufw deny 6379
# iptables — те саме
iptables -A INPUT -p tcp --dport 6379 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
Деякі команди можуть знищити дані або скомпрометувати сервер.
# redis.conf — захист небезпечних команд
# Повністю вимкнути
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command DEBUG ""
# Або перейменувати на щось складне
rename-command CONFIG "CONFIG_b4ckd00r_pr0t3ct"
rename-command SHUTDOWN "SHUTDOWN_s3cur3_2026"
⚠️ Увага: Після перейменування команд, деякі інструменти моніторингу можуть перестати працювати. Тестуйте в staging середовищі.
Зміна стандартного порту 6379 на кастомний — один зі способів ускладнити автоматичні атаки. Це не замінює інші заходи безпеки, але додає ще один рівень захисту.
# Типові локації
/etc/redis/redis.conf # Debian/Ubuntu
/etc/redis.conf # CentOS/RHEL
/usr/local/etc/redis.conf # macOS (Homebrew)
# Знайти файл
sudo find / -name redis.conf 2>/dev/null
# Відкрийте файл
sudo nano /etc/redis/redis.conf
# Знайдіть рядок (приблизно лінія 98)
port 6379
# Змініть на новий порт
port 6380
# UFW
sudo ufw allow 6380/tcp
sudo ufw delete allow 6379/tcp
# iptables
sudo iptables -A INPUT -p tcp --dport 6380 -j ACCEPT
sudo iptables -D INPUT -p tcp --dport 6379 -j ACCEPT
# Systemd
sudo systemctl restart redis
# Або
sudo service redis-server restart
# Підключення через новий порт
redis-cli -p 6380 ping
# Очікувана відповідь: PONG
# Перевірка, що сервер слухає
sudo netstat -tlnp | grep redis
# tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 1234/redis-server
Не забудьте оновити підключення у всіх додатках!
# Python
import redis
r = redis.Redis(host='localhost', port=6380)
# PHP
$redis = new Redis();
$redis->connect('127.0.0.1', 6380);
# Node.js
const Redis = require('ioredis');
const redis = new Redis({ port: 6380 });
Часто потрібно розділити Redis для різних завдань: один для кешу, інший для сесій, третій для черг. Кожен інстанс працює на своєму порту.
# Копіюємо конфігурацію для кожного інстансу
sudo cp /etc/redis/redis.conf /etc/redis/redis-cache.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-session.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-queue.conf
# /etc/redis/redis-cache.conf
port 6379
pidfile /var/run/redis/redis-cache.pid
logfile /var/log/redis/redis-cache.log
dir /var/lib/redis-cache
dbfilename dump-cache.rdb
# /etc/redis/redis-session.conf
port 6380
pidfile /var/run/redis/redis-session.pid
logfile /var/log/redis/redis-session.log
dir /var/lib/redis-session
dbfilename dump-session.rdb
# /etc/redis/redis-queue.conf
port 6381
pidfile /var/run/redis/redis-queue.pid
logfile /var/log/redis/redis-queue.log
dir /var/lib/redis-queue
dbfilename dump-queue.rdb
# /etc/systemd/system/redis-cache.service
[Unit]
Description=Redis Cache Instance
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis/redis-cache.conf
ExecStop=/usr/bin/redis-cli -p 6379 shutdown
Restart=always
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
# Активація сервісів
sudo systemctl daemon-reload
sudo systemctl enable redis-cache redis-session redis-queue
sudo systemctl start redis-cache redis-session redis-queue
# Перевірка
sudo systemctl status redis-cache
redis-cli -p 6379 ping # cache
redis-cli -p 6380 ping # session
redis-cli -p 6381 ping # queue
| Інстанс | Порт | Призначення | Рекомендована RAM |
|---|---|---|---|
| redis-cache | 6379 | Кеш сторінок, API відповідей | 2-8 GB |
| redis-session | 6380 | Сесії користувачів | 1-4 GB |
| redis-queue | 6381 | Черги завдань (Celery, Bull) | 1-2 GB |
Redis давно вийшов за межі простого кешу. Ось для чого його використовують.
Зберігання результатів важких запитів, API відповідей, відрендерених сторінок. Знижує навантаження на основну БД на 70-90%.
# Python приклад кешування
import redis
import json
r = redis.Redis(host='localhost', port=6379)
def get_user(user_id):
# Спроба отримати з кешу
cached = r.get(f"user:{user_id}")
if cached:
return json.loads(cached)
# Якщо немає — запит до БД (використовуйте параметризовані запити!)
user = db.query("SELECT * FROM users WHERE id = %s", (user_id,))
# Зберегти в кеш на 1 годину
r.setex(f"user:{user_id}", 3600, json.dumps(user))
return user
Швидший за file-based сесії в 100+ разів. Ідеально для розподілених систем з кількома серверами.
Обмеження кількості запитів — захист API від зловживань.
# Rate limiter: 100 запитів на хвилину
def is_rate_limited(user_ip):
key = f"rate:{user_ip}"
current = r.incr(key)
if current == 1:
r.expire(key, 60) # TTL 60 секунд
return current > 100
Sorted Sets — ідеальна структура для рейтингів з миттєвим оновленням.
# Оновити рахунок гравця
r.zadd("leaderboard:game1", {"player123": 5000})
# Топ-10 гравців
top10 = r.zrevrange("leaderboard:game1", 0, 9, withscores=True)
# Позиція конкретного гравця
rank = r.zrevrank("leaderboard:game1", "player123")
Real-time комунікація між сервісами, чати, нотифікації.
Новий тренд 2025-2026 — Redis як векторна база даних для AI застосунків.
# Semantic caching для LLM
# Замість точного збігу — пошук семантично схожих запитів
# Економія до 30% на API викликах до OpenAI/Claude
# Vector Sets в Redis 8 (синтаксис може змінюватись)
VADD embeddings doc1 VECTOR [0.1, 0.2, 0.3, ...]
VSIM embeddings VECTOR [0.15, 0.22, 0.28, ...] COUNT 5
Пошук найближчих об'єктів — ресторани, таксі, магазини.
# Додати локацію
r.geoadd("restaurants", 30.5234, 50.4501, "restaurant:1")
# Знайти ресторани в радіусі 5 км
nearby = r.georadius("restaurants", 30.52, 50.45, 5, unit="km")
Приклади підключення для популярних мов програмування.
import redis
# Базове підключення
r = redis.Redis(host='localhost', port=6379, db=0)
# З паролем (ACL)
r = redis.Redis(
host='localhost',
port=6379,
username='webapp',
password='W3bAppP@ss'
)
# З TLS
r = redis.Redis(
host='redis.example.com',
port=6379,
ssl=True,
ssl_certfile='/path/to/client.crt',
ssl_keyfile='/path/to/client.key',
ssl_ca_certs='/path/to/ca.crt'
)
# Connection Pool (рекомендовано для production)
pool = redis.ConnectionPool(
host='localhost',
port=6379,
max_connections=50
)
r = redis.Redis(connection_pool=pool)
// Predis
$client = new Predis\Client([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => 'your_password'
]);
// З TLS
$client = new Predis\Client([
'scheme' => 'tls',
'host' => 'redis.example.com',
'port' => 6379,
'ssl' => ['verify_peer' => true]
]);
// phpredis extension (швидше)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth(['webapp', 'W3bAppP@ss']); // ACL username + password
const Redis = require('ioredis');
// Базове підключення
const redis = new Redis({
host: 'localhost',
port: 6379
});
// З ACL
const redis = new Redis({
host: 'localhost',
port: 6379,
username: 'webapp',
password: 'W3bAppP@ss'
});
// З TLS
const redis = new Redis({
host: 'redis.example.com',
port: 6379,
tls: {
cert: fs.readFileSync('/path/to/client.crt'),
key: fs.readFileSync('/path/to/client.key'),
ca: fs.readFileSync('/path/to/ca.crt')
}
});
// Cluster mode
const cluster = new Redis.Cluster([
{ host: 'node1', port: 6379 },
{ host: 'node2', port: 6379 },
{ host: 'node3', port: 6379 }
]);
import "github.com/redis/go-redis/v9"
// Базове підключення
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Username: "webapp",
Password: "W3bAppP@ss",
DB: 0,
})
// З TLS
rdb := redis.NewClient(&redis.Options{
Addr: "redis.example.com:6379",
TLSConfig: &tls.Config{
MinVersion: tls.VersionTLS12,
},
})
# Підключення
redis-cli -h localhost -p 6379
# Перевірка з'єднання
PING
# Відповідь: PONG
# Повна інформація про сервер
INFO
# Тільки пам'ять
INFO memory
# Тільки клієнти
INFO clients
# Статистика команд
INFO commandstats
| Метрика | Команда | Критичний поріг |
|---|---|---|
| Використання RAM | INFO memory |
> 80% maxmemory |
| Підключені клієнти | INFO clients |
> 90% maxclients |
| Cache hit ratio | INFO stats |
< 80% |
| Evicted keys | INFO stats |
> 0 (потрібно більше RAM) |
| Blocked clients | INFO clients |
> 0 тривалий час |
# redis.conf — логувати команди повільніше 10мс
slowlog-log-slower-than 10000
slowlog-max-len 128
# Переглянути slow log
redis-cli SLOWLOG GET 10
Безкоштовний інструмент від Redis для візуального моніторингу, перегляду даних та налагодження.
Redis не запущений або слухає інший порт/інтерфейс.
# Перевірте, чи Redis запущений
sudo systemctl status redis
# Перевірте, на якому порту слухає
sudo netstat -tlnp | grep redis
# Перевірте bind в конфігурації
grep "^bind" /etc/redis/redis.conf
Redis відхиляє підключення з зовнішніх IP без пароля.
Рішення: Налаштуйте ACL або bind на конкретний IP.
Redis вимагає автентифікацію, але клієнт не передав пароль.
# Підключення з паролем
redis-cli -a 'your_password'
# Або з ACL username
redis-cli --user webapp --pass 'W3bAppP@ss'
Інший процес вже використовує порт 6379.
# Знайти процес на порту
sudo lsof -i :6379
# Або
sudo fuser 6379/tcp
# Завершити процес
sudo kill -9 <PID>
Firewall блокує підключення до порту Redis.
# UFW статус
sudo ufw status verbose
# Дозволити порт
sudo ufw allow from 10.0.0.0/24 to any port 6379
# iptables перевірка
sudo iptables -L -n | grep 6379
Проблема з сертифікатами або конфігурацією TLS.
# Перевірте сертифікати
openssl x509 -in /etc/redis/tls/redis.crt -text -noout
# Перевірте з'єднання
openssl s_client -connect localhost:6379
# Переконайтесь, що redis.conf має правильні шляхи
grep "tls-" /etc/redis/redis.conf
Використовуйте цей чеклист перед запуском Redis у production.
bind налаштований на конкретні IP (не 0.0.0.0)protected-mode yesmaxmemory встановлено (не більше 70-80% RAM сервера)maxmemory-policy налаштовано (volatile-lru для кешу)tcp-keepalive 300✓ Порада: Пройдіться по цьому чеклісту для кожного нового Redis сервера. Пропущений пункт може коштувати даних або безпеки.
Обирайте сервери з нашою техпідтримкою - стабільно, швидко й без зайвих клопотів. У Hostiserver — потужне обладнання та команда з глибокою експертизою, яка налаштує все правильно з першого разу.
💬 Не впевнені який варіант вам необхідний?
💬 Напишіть нам і ми зі всім допоможемо!
Redis використовує порт 6379 для клієнтських підключень. Додатково: 16379 для cluster bus (комунікація між нодами кластера) і 26379 для Sentinel (моніторинг та failover).
Порт 6379 сам по собі не проблема. Проблема — відкритий доступ без автентифікації. Якщо у вас налаштовані ACL, TLS, firewall і bind на localhost або приватний IP — порт 6379 цілком безпечний.
Відредагуйте redis.conf, змініть значення port 6379 на бажане (наприклад, 6380), перезапустіть Redis і оновіть firewall та всі клієнтські підключення.
Обов'язково — якщо трафік йде через публічну мережу або між різними серверами. Опційно — якщо Redis і клієнт на одному сервері (localhost). Redis 6+ підтримує нативний TLS без stunnel.
ACL (Redis 6+) завжди краще. Він дозволяє створювати різних користувачів з різними правами — один для читання, інший для запису, третій для адміністрування. requirepass — один пароль для всіх, без гранулярного контролю.
Скільки завгодно, якщо вистачає RAM. Кожен інстанс потребує свого порту (6379, 6380, 6381...), конфігураційного файлу, PID-файлу та директорії для даних. Практично 3-5 інстансів на сервер — типова конфігурація.
Порт вже зайнятий іншим процесом. Знайдіть його командою sudo lsof -i :6379 і або завершіть процес, або змініть порт Redis на інший.
Кілька способів:
redis-cli INFO server | grep tcp_portsudo netstat -tlnp | grep redisgrep "^port" /etc/redis/redis.conf