Redis - Conéctese al servidor remoto

122

Acabo de instalar Redis con éxito usando las instrucciones de la guía de inicio rápido en http://redis.io/topics/quickstart en mi servidor Ubuntu 10.10. Estoy ejecutando el servicio como dameon (por lo que puede ser ejecutado por init.d)

El servidor es parte de Rackspace Cluster con IP internas y externas. El host se ejecuta en el puerto 6379 (estándar para Redis)

Agregué una fila en iptables para permitir conexiones entrantes desde el puerto 6379 como se muestra a continuación:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

En mi código PHP en otro servidor, estoy tratando de conectarme al nuevo servidor Redis aquí:

$this->load->helper("iredis");

$hostname = "IP ADDRESS HERE";

$redis = new iRedis(array('hostname' => $hostname, 'port' => 6379));

Una vez que hago esto, siempre recibo una conexión rechazada. En mi archivo redis.conf, he comentado el comando de enlace local, por lo que debería estar escuchando más que la IP localhost. Puedo conectarme a la base de datos en la máquina local, pero no en otro servidor. He probado las IP externas e internas sin suerte.

¿Alguna sugerencia para que esto funcione?

gregavola
fuente
¿Puede conectarse usando la herramienta de línea de comando Redis? redis-cli -h hostname
jlundqvist
Server Fault tiene una pregunta canónica sobre Connection Refused .
Raedwald

Respuestas:

129

Primero verificaría para verificar que está escuchando las IP que espera que sean:

netstat -nlpt | grep 6379

Dependiendo de cómo inicie / pare, es posible que no haya reiniciado la instancia cuando creía que sí. El netstat le dirá si está escuchando donde cree que está. Si no, reinícielo y asegúrese de que se reinicie. Si se reinicia y aún no está escuchando donde espera, verifique su archivo de configuración solo para estar seguro.

Después de establecer que está escuchando donde espera que lo haga, desde un nodo remoto que debería tener acceso intente:

redis-cli -h REMOTE.HOST ping

También puede intentarlo desde el host local, pero use la IP que espera que escuche en lugar de un nombre de host o localhost. Debería verlo PONG en respuesta en ambos casos.

Si no, su (s) firewall (s) lo está (n) bloqueando. Esto sería las IPTables locales o posiblemente un firewall entre los nodos. Puede agregar una declaración de registro a su configuración de IPtables para registrar conexiones a través de 6379 para ver qué está sucediendo. Además, tratar de redistribuir de local y no local a la misma IP debería ser ilustrativo. Si responde localmente pero no remotamente, me inclinaría hacia un firewall intermedio dependiendo de la complejidad de las reglas de sus tablas IP en el nodo.

El verdadero proyecto de ley
fuente
16
Entonces, para ser claros, ¿está rechazando una respuesta al problema publicado porque tiene un problema relacionado (pero claramente no idéntico) que no aborda? Si bien estoy de acuerdo con publicar su solución, rechazar una respuesta correcta porque su problema era diferente no parece lo correcto. Dicho esto, su solución no es una buena opción para la pregunta porque el OP tiene varias IP y es posible que no quiera escucharlas todas, y el OP hizo referencia específicamente a la sección de enlace en el archivo de configuración en la pregunta. Por lo tanto, su solución no aborda la pregunta formulada.
The Real Bill
2
Bueno, leí la pregunta nuevamente, y no me pareció tan obvio que OP estableciera la configuración correcta para esta línea de 'vinculación'. Además, no estoy seguro de que haya algún firewall involucrado en su caso. De todos modos, puedo eliminar mi -1 si crees que es grosero. Me acabo de dar cuenta de que su respuesta estaba totalmente fuera de tema, y ​​que no sería muy útil para la mayoría de los usuarios que vienen aquí con un problema muy común ... (el parámetro predeterminado de enlace)
Orabîg
1
El OP dijo que comentó la regla de vinculación local, que le dice a redis que se vincule a todas las direcciones en el sistema. No llamaría al -1 grosero, simplemente inapropiado. El OP declaró específicamente que tenía reglas de IPtables establecidas, por lo tanto, está claro que hay reglas de firewall establecidas en la pregunta formulada. Dada la presencia declarada de un firewall y la eliminación del enlace local en la configuración, su respuesta no es correcta o relevante para la pregunta formulada.
The Real Bill
Sí, tienes razón, lo siento. No soy un inglés nativo, e interpreté mal el verbo "comentar" ... Pensé que OP había "eliminado" el comentario. (desafortunadamente, no puedo eliminar mi -1, hasta que edite su publicación)
Orabîg
No se preocupe, sucede. He agregado algunas aclaraciones sobre la validación de que se está ejecutando donde lo desea. Espero que ayude a aclararlo para futuros lectores.
The Real Bill
328

Me he quedado atrapado con el mismo problema, y ​​la respuesta anterior no me ayudó (aunque bien escrito).

La solución está aquí: verifique su /etc/redis/redis.confy asegúrese de cambiar el valor predeterminado

bind 127.0.0.1

a

bind 0.0.0.0

Luego reinicie su servicio ( service redis-server restart)

Ahora puede verificar que redis está escuchando en una interfaz no local con

redis-cli -h 192.168.x.x ping

(reemplace 192.168.xx con su dirección IP)

Nota importante: como indicaron varios usuarios, no es seguro configurar esto en un servidor que está expuesto a Internet. Debe estar seguro de que su redis está protegida con cualquier medio que se ajuste a sus necesidades.

Orabîg
fuente
1
Lo mismo aquí, debe permitir conexiones remotas desde el servidor Redis en primer lugar antes de pensar en la configuración del firewall o los problemas de red. Gracias Orabig
securecurve
Esta es la respuesta correcta obvia. El anterior tiene un montón de mumbo jumbo "artes oscuras" técnicas del administrador de sistemas ... pero no es útil en absoluto :)
Henley Chiu
77
Este problema no es lo mismo que el OP. El OP declaró específicamente que ya habían realizado los cambios necesarios en el archivo de configuración. Dado que el OP hizo cambios en el archivo de configuración y usted lo hizo. No, son dos cuestiones separadas. La respuesta dada abordó el problema proporcionado. No fue para abordar todos los problemas. Solo el que preguntaba. No se trata de admitir que algo está mal, se trata de darse cuenta de que su problema es diferente. Es como si alguien dijera que su automóvil no arrancará pero tiene gasolina, y usted les dice que necesitan gasolina.
The Real Bill
1
¿También sabría cómo especificar IPv4 e IPv6 dual-stack? He intentado lo siguiente: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(donde \ n es un salto de línea) y bind 0 [::]pero el único que funciona es no tener una bindlínea en la configuración en absoluto. El valor predeterminado es escuchar en 0 (o 0.0.0.0/0) y [::] por lo que no hay problema, pero me gustaría saber el método adecuado si alguna vez lo necesito. No parece estar documentado en ningún lado.
Luc
77
Lo que hace esta respuesta es que hace que su servidor Redis sea accesible al mundo. Ese es un gran riesgo de seguridad. Si hace esto, asegúrese de bloquear su servidor Redis de otras maneras, como agregar una contraseña AUTH en Redis y configurar su firewall (por ejemplo iptables) para bloquear clientes no autorizados.
sffc
14

Además de la excelente respuesta dada por Orabîg:

Resolví este problema eliminando la bindsección por completo y configurándola protected-modeen no.

#bind 127.0.0.1
protected-mode no

Nunca use este método en servidores expuestos públicamente.

zen
fuente
1
Para cualquiera que use un método no seguro: ¡Proteja su servidor Redis! o perderá todos sus archivos :( Mi servidor se ha visto comprometido porque no estoy asegurando el servidor Redis. El atacante quiere que pague una cantidad de dinero (lo suficientemente grande para mí). El atacante algo como esto: duo.com/ blog / ...
MonkimoE
4

Orabig está en lo correcto.

Puede vincular 10.0.2.15 en Ubuntu (VirtualBox) y luego hacer un reenvío de puertos desde el host al Ubuntu invitado.

en /etc/redis/redis.conf

bind 10.0.2.15

luego, reinicie redis:

sudo systemctl restart redis

¡Funcionará!

Michael Qin
fuente
4

Estuve luchando con la conexión remota a Redis durante algunos días. Finalmente lo logré. Aquí está la lista de verificación completa que preparé para seguir para conectarme. Algunas de las soluciones se dan en las respuestas anteriores. Sin embargo, quería que mi respuesta fuera un nano-wiki sobre el tema :) También agregué algunos enlaces útiles.

Si redis funciona localmente:

$ redis-cli
127.0.0.1:6379>ping
PONG
127.0.0.1:6379>

Si la contraseña no está configurada

Consulte /etc/redis/redis.confconfig (esta es la ubicación predeterminada para Ubuntu 18.04, puede tenerla en una ubicación diferente):

# The following line should be commented
# requirepass <some pass if any>

Si el modo protegido se establece en 'no' en la configuración:

# The following line should be uncommented
protected-mode no

Si el enlace IP está abierto para acceder desde Internet en la configuración:

# The following line should be commented
# bind 127.0.0.1 ::1

Si el firewall de Linux permite conexiones

(aquí para Ubuntu 18.04) Verifique que permita que el tráfico entrante de Internet vaya al puerto 6379(el puerto predeterminado de Redis)

# To check if it the port is open
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
...
6379/tcp                   ALLOW       Anywhere
6379/tcp (v6)              ALLOW       Anywhere (v6)
...

# To open the port
$ sudo ufw allow 6379/tcp

Reiniciar el servicio Redis

No olvide reiniciar el servicio Redis para que los cambios surtan efecto y ver que se está ejecutando:

$ sudo systemctl restart redis.service
$ sudo systemctl status redis

Comprueba si funciona como un servidor remoto

desde su línea de comando use redis-clicomo si el servidor Redis estuviera en el servidor remoto:

$ redis-cli -h <your-server-ip>
<your-server-ip>:6379> ping
PONG
<your-server-ip>:6379> exit
$

Si puede hacer ping-PONG a su servidor Redis a través de su servidor de Internet conectado como un servidor remoto, entonces la conexión remota de Redis funciona.

Advertencia de seguridad

Todo lo anterior hace que sus datos de Redis estén completamente abiertos para cualquier persona desde Internet.

Para asegurar básicamente el uso requirepassy la protected-mode yesconfiguración de Redis en la configuración de Redis (ver arriba) y bloquear los peligrosos comandos de Redis (ver el enlace de arriba), para una comprensión más profunda, vea este artículo y la sección de seguridad del sitio de Redis ).

Enlaces útiles

Algunos enlaces para ayudar Cómo instalar y asegurar Redis en Ubuntu 18.04 y cómo configurar el firewall de Ubuntu 18.04 .

Espero eso ayude.

Valentine Shi
fuente
2
  • si descargó usted mismo redis (no apt-get install redis-server) y luego editó redis.conf con las sugerencias anteriores, asegúrese de comenzar de nuevo con la configuración de la siguiente manera:./src/redis-server redis.conf

    • también nota al margen que incluyo una captura de pantalla de la configuración de la caja virtual para conectarse a redis, si está en Windows y se conecta a una virtualbox vm.

ingrese la descripción de la imagen aquí

Robot70
fuente
0

Establecer tcp-keepalive en 60 (se estableció en 0) en la configuración de redis del servidor me ayudó a resolver este problema.

Saurabh
fuente