如何关闭Redis中的“保护模式”?

Tho*_*rzl 10 redis redis-sentinel

我想protected-mode在我的生产 Redis上禁用。关于我从我的另一个 Redis-Sentinel 实例中得到的以下错误,我可以通过从它运行的主计算机连接到 Redis 来实时禁用它。

DENIED Redis 在保护模式下运行,因为已启用保护模式,未指定绑定地址,未向客户端请求身份验证密码。在此模式下,仅接受来自环回接口的连接。如果您想从外部计算机连接到 Redis,您可以采用以下解决方案之一:

1)只需禁用保护模式,通过从运行服务器的同一主机连接到Redis,从环回接口发送命令'CONFIG SET protected-mode no',但是如果这样做,请确保Redis不能从互联网公开访问。使用 CONFIG REWRITE 使此更改永久化。

2) 或者,您可以通过编辑 Redis 配置文件并将保护模式选项设置为“no”,然后重新启动服务器来禁用保护模式。

3) 如果您手动启动服务器只是为了测试,请使用“--protected-mode no”选项重新启动它。

4) 设置绑定地址或认证密码。

注意:您只需要执行上述操作之一,服务器就可以开始接受来自外部的连接。

但是当我连接并尝试禁用它时,我收到了 Error (error) ERR Unsupported CONFIG parameter: protected-mode

没有配置身份验证或其他任何东西 - 所有安全性都由防火墙规则管理。在redis.conf几乎是默认的。

演示

root@svim-redis03 /etc/redis # redis-cli

127.0.0.1:6379> CONFIG GET protected*
(empty list or set)
127.0.0.1:6379> CONFIG GET bind*
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> CONFIG SET protected-mode no
(error) ERR Unsupported CONFIG parameter: protected-mode
127.0.0.1:6379> exit

root@svim-redis03 /etc/redis # redis-server --version
Redis server v=3.2.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=86450d2ba8219c1e
Run Code Online (Sandbox Code Playgroud)

之前有什么我需要检查或更改的吗?我在文档GitHub 问题中找不到任何提示。

更新 01

甚至无法更改绑定地址或任何其他配置参数。我需要先启用配置更改吗?

127.0.0.1:6379> config set bind "127.0.0.1 11.12.13.14"
(error) ERR Unsupported CONFIG parameter: bind
Run Code Online (Sandbox Code Playgroud)

Tho*_*rzl 7

事实证明,当前运行的服务器与我安装的二进制文件版本不同。

如何重现这个?

只需通过连接redis-cli到您的 redis 实例并输入INFO server返回一堆信息的类型。

127.0.0.1:6379> INFO server
# Server
redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:869e89100d5ea8c2
redis_mode:standalone
os:Linux 4.2.0-35-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.4
process_id:26720
run_id:6645270dd2ac6a7f96caa054f9dbba9e66566755
tcp_port:6379
uptime_in_seconds:10971777
uptime_in_days:126
hz:10
lru_clock:6676576
config_file:/etc/redis/redis.conf
Run Code Online (Sandbox Code Playgroud)

如您所见,此 redis-instance 运行了将近 127 天并使用redis_version:3.0.7.

如何解决这个问题?

重新启动您的服务器并确保您真的重新启动了它!例如,对于大多数 Linux 发行版,您可以通过点击以下命令来实现。

root@svim-redis03 ~ # service redis-server stop
Stopping redis-server: redis-server.
Run Code Online (Sandbox Code Playgroud)

通过尝试连接来检查它是否真的离线redis-cli。如果您仍然可以连接,则实例仍在运行。通过搜索活动的 redis 进程来检查这一点。

root@svim-redis03 ~ # ps -efl |grep redis
1 S redis    12418     1  0  80   0 - 10673 ep_pol  2016 ?        05:33:17 /usr/bin/redis-server 127.0.0.1:6381
1 S redis    12442     1  0  80   0 - 11697 ep_pol  2016 ?        05:33:46 /usr/bin/redis-server 127.0.0.1:6382
1 S redis    12453     1  0  80   0 - 10673 ep_pol  2016 ?        05:40:17 /usr/bin/redis-server 127.0.0.1:6383
4 S root     16570 16386  0  80   0 -  2489 wait_w 10:42 pts/7    00:00:00 tail -f /var/log/redis/redis-server-6379.log
0 S root     17064 12637  0  80   0 -  3617 pipe_w 10:47 pts/1    00:00:00 grep --color=auto redis
1 S redis    26720     1  0  80   0 - 453041 ep_pol Mar07 ?       08:37:01 /usr/bin/redis-server 127.0.0.1:6379
Run Code Online (Sandbox Code Playgroud)

如您所见,实例(进程 ID:26720)仍在运行。使用以下命令退出它。

kill 26720
Run Code Online (Sandbox Code Playgroud)

杀死进程后,再次检查ps -efl |grep redis实例是否真的关闭了。

最后重新开始

root@svim-redis03 ~ # service redis-server start
Starting redis-server: redis-server.
Run Code Online (Sandbox Code Playgroud)

现在检查实例是否以正确的版本运行。

root@svim-redis03 ~ # redis-cli
127.0.0.1:6379> INFO server
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:86450d2ba8219c1e
redis_mode:standalone
os:Linux 4.2.0-35-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.4
process_id:17135
run_id:40d6fa2e2b25e8f5b97a3c97ec1bddb8edda0014
tcp_port:6379
uptime_in_seconds:11
uptime_in_days:0
hz:10
lru_clock:6677102
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
Run Code Online (Sandbox Code Playgroud)