教程 · 应用与数据库
Redis 安装与安全配置:别让它裸奔在公网
难度
进阶
预计时长
15 分钟
步骤
6 步
最近修订
基准系统
Debian 12
要点
Redis 安装与安全配置:别让它裸奔在公网
apt 安装的 Redis 默认只监听 127.0.0.1,这个默认值是对的,不要改。必须补上的三件事是 requirepass 设置密码、maxmemory 与淘汰策略限制内存、确认 protected-mode 为 yes;把 6379 开放到公网且不设密码的实例,会在很短时间内被自动化脚本接管。
前置条件
开始之前,先确认这些都具备
- 一台 Debian/Ubuntu 服务器与 sudo 权限
- 已配置防火墙
操作步骤
共 6 步
步骤 01 / 06
安装 #
官方仓库的版本对绝大多数缓存场景够用。装完先确认服务在跑,并且监听的是回环地址。
Shell sudo apt update && sudo apt install -y redis-server systemctl status redis-server --no-pager sudo ss -tlnp | grep 6379 # 期望 127.0.0.1:6379步骤 02 / 06
设置密码与内存上限 #
requirepass 必须设,即使只监听本地 —— 同一台机器上任何一个被攻破的应用都能连上无密码的 Redis。maxmemory 同样必须设:不设的话 Redis 会一直吃内存直到被 OOM Killer 结束,而那时它带走的往往还有你的数据库进程。
配置文件 # /etc/redis/redis.conf bind 127.0.0.1 -::1 protected-mode yes requirepass 换成一个足够长的随机密码 maxmemory 512mb maxmemory-policy allkeys-lru # 纯缓存用途可以关掉持久化以减少 IO; # 作为队列或有状态存储时保持 appendonly yes appendonly yes appendfsync everysec步骤 03 / 06
重启并验证 #
不要在命令行里用 -a 传密码 —— 它会进入 shell 历史,也会出现在其他用户可见的进程列表里。进入 redis-cli 之后再用 AUTH 命令。
Shell sudo systemctl restart redis-server redis-cli # 在交互界面里: # AUTH 你的密码 # PING -> PONG # INFO memory # CONFIG GET maxmemory步骤 04 / 06
调整内核参数 #
Redis 在做后台保存(bgsave)时会 fork 一份进程,内存不足时可能失败。vm.overcommit_memory = 1 是官方推荐值。另外内核的透明大页(THP)会导致延迟毛刺,建议关闭。
Shell echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/99-redis.conf sudo sysctl --system # 关闭透明大页(重启后失效,需要时可写成 systemd 单元固化) echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled sudo journalctl -u redis-server -n 30 --no-pager步骤 05 / 06
(可选)重命名危险命令 #
在多人协作或应用权限不细的环境里,把 FLUSHALL、FLUSHDB、KEYS 这类命令改名或禁用,可以避免一次手滑清空整个缓存。KEYS 在大库上还会阻塞整个实例。
配置文件 # /etc/redis/redis.conf rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command KEYS "" rename-command CONFIG "CONFIG_9f2c1a"步骤 06 / 06
需要远程访问时走 SSH 隧道 #
本地图形客户端要连远端 Redis,用端口转发,而不是修改 bind 让它监听公网。命令在自己的电脑上执行。
Shell ssh -N -L 6379:127.0.0.1:6379 -p 22022 [email protected] # 之后客户端连 127.0.0.1:6379
常见错误
这一步最容易踩的坑
下面每一条都对应一个真实会发生的故障。先读完再动手,比出问题之后再回来查要省时间。
- bind 改成 0.0.0.0 又没设密码。这是最经典的入侵入口,被扫到之后通常会被写入定时任务挖矿。
- 在命令行用 redis-cli -a 密码。密码会留在 shell 历史和进程列表里,等于没设。
- 不设 maxmemory。缓存无限增长,最后 OOM Killer 出手,被杀掉的常常是数据库而不是 Redis。
- 以为装了 Redis 就等于数据持久。默认配置下重启可能丢失最近的写入,作为队列使用时务必确认 appendonly 与 appendfsync 的取值。
- 把 Redis 当主数据库用。它是内存优先的存储,容量与持久化保证都不是为这个设计的。
- 忽略日志里的 THP 与 overcommit 警告。它们不影响启动,但会在压力上来时变成难以定位的延迟毛刺。
这篇教程的边界
- 命令以 Debian 12 为准。Ubuntu 与 Rocky Linux 的差异只在正文明确标注之处,未标注的部分请以你所用发行版的官方文档为准。
- 示例中的 IP 来自文档保留段 203.0.113.0/24,域名为 example.com,端口为示意值。复制后必须替换成自己的值, 原样执行不会有任何效果。
- 教程不能替代备份。任何会改动数据或线上流量的步骤,执行前先确认有一份验证过能恢复的备份。
- 本站不提供任何用于绕过网络审查的配置或说明,这篇也不例外。
发现命令过时或有误,请发邮件到 [email protected]。 指出错误的邮件比沉默的旧文档有价值得多。