1. bind

对于Redis中bind的正确的理解是:

bind ip是将指定的ip设置为redis的对外开放地址。

一个网卡对应一个IP地址,如果某个机器上有多个网卡,那么就对应多个IP,假设为ip1、ip2。如果没有设置bind,我们可以通过ip1:6379或ip2:6379来访问redis,即任意网卡的ip都可以访问redis。

如果指定了bind,则说明只允许通过指定网卡的ip来访问Redis。即如果bind ip1,则ip1:6379可以访问,而ip2:6379就访问失败。

1.1 bind 127.0.0.1

既然bind是设置对外开放的ip,那么为bind 127.0.0.1只有本机可以连接,而外部网络不可以连接?这恰好刚好给人一种错误的感觉,即“bing 是设置白名单,哪些ip可以访问redis”。

很好解释,查看本地的网卡对应的IP地址:使用ifconfig命令查看网卡

在这里插入图片描述
从上面我们可以看到eth0和lo2个网卡,他们分别对应172.18.235.206和127.0.0.1,也就是说当你绑定了后者时,你只能通过127.0.0.1:6379访问redis。

lo网卡(对应127.0.0.1IP地址)是一个特殊的网卡:是一个回环地址(Local Loopback),也就是只有本地才能访问到这个回环地址,而其他的计算机也只能访问他们自己的回环地址。

因此,redis所在环境的本地访问是ok的,如果是客户端是外部网络,通过127.0.0.1:6379访问redis时,回环地址会解析为客户端的自己本地的网络,导致无法访问目标redis。

如果我们想限制只有指定的主机可以连接到redis中,我们只能通过防火墙来控制,而不能通过redis中的bind参数来限制。

2. protected-mode

redis本身无法限制【只有指定主机】连接到redis中,就像我上面说的一样,bind指定只是用来设置redis对外开放的地址。

如果我有好朋友张三,一个仇人李四。我只想让张三访问,不让李四访问怎么办?除了设置防火墙怎么办?可以简单粗暴,设置密码,告诉张三,这样李四不知道密码就无法访问了。

如果搭建一个新环境,不想让外部网络访问,只让本地访问,那么可以设置protected-mode yes,当然也是默认值。

redis3.2版本后新增protected-mode配置

protected-mode是redis本身的一个安全层,这个安全层的作用:就是只有【本机】可以访问redis,其他任何都不可以访问redis。这个安全层开启必须满足三个条件,不然安全层处于关闭状态:

(1)protected-mode yes(处于开启)

(2)没有bind指令。原文:The server is not binding explicitly to a set of addresses using the “bind” directive.

(3)没有设置密码。原文:No password is configured。密码的优先级高。

这时redis的保护机制就会开启。开启之后,只有本机才可以访问redis。 如果上面三个条件任何一个不满足,就不会开启保护机制。


参考:
《Redis的bind的误区》

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐