跳到主要内容
注册无需实名认证
安云主机 AnYun VPS

教程 · 应用与数据库

Redis 安装与安全配置:别让它裸奔在公网

难度

进阶

预计时长

15 分钟

步骤

6

最近修订

基准系统

Debian 12

要点

Redis 安装与安全配置:别让它裸奔在公网

apt 安装的 Redis 默认只监听 127.0.0.1,这个默认值是对的,不要改。必须补上的三件事是 requirepass 设置密码、maxmemory 与淘汰策略限制内存、确认 protected-mode 为 yes;把 6379 开放到公网且不设密码的实例,会在很短时间内被自动化脚本接管。

前置条件

开始之前,先确认这些都具备

  • 一台 Debian/Ubuntu 服务器与 sudo 权限
  • 已配置防火墙

操作步骤

6

  1. 步骤 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
  2. 步骤 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
  3. 步骤 03 / 06

    重启并验证 #

    不要在命令行里用 -a 传密码 —— 它会进入 shell 历史,也会出现在其他用户可见的进程列表里。进入 redis-cli 之后再用 AUTH 命令。

    Shell
    sudo systemctl restart redis-server
    
    redis-cli
    # 在交互界面里:
    #   AUTH 你的密码
    #   PING        -> PONG
    #   INFO memory
    #   CONFIG GET maxmemory
  4. 步骤 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
  5. 步骤 05 / 06

    (可选)重命名危险命令 #

    在多人协作或应用权限不细的环境里,把 FLUSHALL、FLUSHDB、KEYS 这类命令改名或禁用,可以避免一次手滑清空整个缓存。KEYS 在大库上还会阻塞整个实例。

    配置文件
    # /etc/redis/redis.conf
    rename-command FLUSHALL ""
    rename-command FLUSHDB  ""
    rename-command KEYS     ""
    rename-command CONFIG   "CONFIG_9f2c1a"
  6. 步骤 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]。 指出错误的邮件比沉默的旧文档有价值得多。

联系 工单
扫码
手机访问

扫码在手机上打开