简介

        本文介绍如何将Redis设置为外网可以访问。

        默认情况下,Redis服务端只允许它所在服务器上的客户端访问,如果Redis服务端和Redis客户端不在同一个机器上,就要进行配置。

1.修改bind

修改redis.conf

配置方法

原来的配置:

bind 127.0.0.1

修改为:

#bind 127.0.0.1

或者:

bind 0.0.0.0

详解

来源于redis.conf的github地址:​​https://github.com/redis/redis/blob/unstable/redis.conf​

说明

        默认情况下,如果没有指定bind配置指令,则 Redis 监听来自服务器上所有可用网络接口的连接。可以使用bind配置指令来监听一个或多个选定的接口,在bind后拼接一个或多个 IP 地址即可。例如:

bind 192.168.1.100 10.0.0.1
bind 127.0.0.1 ::1

        警告:如果运行 Redis 的计算机直接暴露在互联网上,绑定到所有的接口是很危险的,并会将实例暴露给互联网上的每个人。因此,默认情况下,我们取消注释以下绑定指令,这将强制 Redis 只监听 IPv4 回环接口地址(这意味着 Redis 只接受来自运行它的计算机上的客户端的连接)。

        如果你确定希望你的实例能够监听所有的接口,只需要注释下面的这一行即可。

bind 127.0.0.1

网络接口

        bind 是 network interfaces,即网络接口(网卡)。服务器可以有一个或者多个网络接口。可以使用 ifconfig 查看当前 Linux 服务器上的网络接口。

$ ifconfig
docker0 Link encap:Ethernet HWaddr 3A:F3:20:12:AE:6A
inet addr:192.168.42.1 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:362879 errors:0 dropped:0 overruns:0 frame:0
TX packets:894703 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:28218097 (26.9 MiB) TX bytes:1326305089 (1.2 GiB)

eth0 Link encap:Ethernet HWaddr 00:16:3E:08:18:35
inet addr:10.25.102.37 Bcast:10.25.103.255 Mask:255.255.252.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4958304 errors:0 dropped:0 overruns:0 frame:0
TX packets:2766733 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:534516269 (509.7 MiB) TX bytes:13382719049 (12.4 GiB)

eth1 Link encap:Ethernet HWaddr 00:16:3E:08:13:6B
inet addr:120.76.207.187 Bcast:120.76.207.255 Mask:255.255.252.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13183600 errors:0 dropped:0 overruns:0 frame:0
TX packets:14070363 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6460933699 (6.0 GiB) TX bytes:8462002985 (7.8 GiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:156288093 errors:0 dropped:0 overruns:0 frame:0
TX packets:156288093 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:19039024606 (17.7 GiB) TX bytes:19039024606 (17.7 GiB)

veth802443e Link encap:Ethernet HWaddr 56:E8:12:D0:88:96
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:120 errors:0 dropped:0 overruns:0 frame:0
TX packets:162 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:44625 (43.5 KiB) TX bytes:18533 (18.0 KiB)

我的服务器是阿里云的ECS,当前有5个网络接口。

网络接口

说明

docker0

安装 docker 时自动创建的网桥

eth0

阿里云内网接口

eth1

阿里云公网接口

lo

本地回环接口

veth88f3e3c

运行 docker 容器创建的 veth pair 的一端

        所以,如果要让公网可以连接该服务器上的 Redis 服务,除了直接注释掉 bind 这一行来绑定到所有的网络接口之外,更正确的做法应该是不注释,再绑定多 eth1 这个公网接口,地址是 120.76.207.187。

bind 127.0.0.1 120.76.207.187

然后重启下 redis 服务即可,这样配置,Redis 就只监听 IPv4 的本地回环接口和公网接口。

2.关闭保护模式

修改redis.conf

配置方法

protected-mode no

        Reids默认开启保护模式(protected-mode yes),开启之后只有本机可以连接,其他机器无法连接。

        保护模式开启的两个条件

  1. 没有使用bind
  2. 没有设置密码(即:没有设置requirepass)

3.设置Redis密码

修改redis.conf

requirepass yourPassword

4.允许端口通过防火墙

设置iptables规则,允许外部访问6379端口。

iptables -I INPUT 1 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
iptables save