Redis: connessione al server remoto


122

Ho appena installato Redis con successo usando le istruzioni sulla guida di avvio rapido su http://redis.io/topics/quickstart sul mio server Ubuntu 10.10. Sto eseguendo il servizio come dameon (quindi può essere eseguito da init.d)

Il server fa parte di Rackspace Cluster con IP interno ed esterno. L'host è in esecuzione sulla porta 6379 (standard per Redis)

Ho aggiunto una riga in iptables per consentire le connessioni in entrata dalla porta 6379 come mostrato di seguito:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

Nel mio codice PHP su un altro server, sto cercando di connettermi al nuovo server Redis qui:

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

$hostname = "IP ADDRESS HERE";

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

Una volta che lo faccio, ottengo sempre una connessione rifiutata. Nel mio file redis.conf, ho il comando bind locale commentato, quindi dovrebbe essere in ascolto su più dell'IP localhost. Posso connettermi al database sulla macchina locale solo non su un altro server. Ho provato gli IP esterni e interni senza fortuna.

Qualche suggerimento su come farlo funzionare?


Riesci a connetterti utilizzando lo strumento della riga di comando di Redis? redis-cli -h hostname
jlundqvist

Server Fault ha una domanda canonica sulla connessione rifiutata .
Raedwald

Risposte:


129

Per prima cosa controllerei per verificare che sia in ascolto sugli IP che ti aspetti che siano:

netstat -nlpt | grep 6379

A seconda di come avvii / arresti, potresti non aver riavviato effettivamente l'istanza quando pensavi di averlo fatto. Il netstat ti dirà se sta ascoltando dove pensi che sia. In caso contrario, riavvialo e assicurati che si riavvii. Se si riavvia e ancora non ascolta dove ti aspetti, controlla il tuo file di configurazione solo per esserne sicuro.

Dopo aver stabilito che sta ascoltando dove ti aspetti, da un nodo remoto che dovrebbe avere accesso prova:

redis-cli -h REMOTE.HOST ping

Puoi anche provarlo dall'host locale ma usa l'IP su cui ti aspetti che sia in ascolto invece di un hostname o localhost. Dovresti vederlo PONG in risposta in entrambi i casi.

In caso contrario, il tuo firewall ti sta bloccando. Questo potrebbe essere l'IPTables locale o forse un firewall tra i nodi. È possibile aggiungere una dichiarazione di registrazione alla configurazione di IPtables per registrare le connessioni su 6379 per vedere cosa sta succedendo. Inoltre, provare a ridisegnare il ping da locale e non locale allo stesso IP dovrebbe essere illustrativo. Se risponde localmente ma non in remoto, mi propenderei per un firewall che interviene a seconda della complessità delle regole delle tabelle IP sul nodo.


16
Quindi, per essere chiari, stai votando una risposta al problema pubblicato perché hai un problema correlato (ma chiaramente non identico) che non risolve? Sebbene sia d'accordo con la pubblicazione della tua soluzione, il downvoting di una risposta corretta perché il tuo problema era diverso non sembra la cosa giusta da fare. Detto questo, la tua soluzione non è una buona scelta per la domanda perché l'OP ha più IP e potrebbe non voler ascoltare tutti loro, e l'OP ha fatto riferimento specificamente alla sezione bind nel file di configurazione nella domanda. Quindi la tua soluzione non risponde alla domanda posta.
The Real Bill

2
Bene, ho letto di nuovo la domanda e non mi sembrava così ovvio che OP avesse impostato la configurazione corretta per questa riga di "bind". Inoltre, non sono sicuro che nel suo caso sia coinvolto un firewall. Ad ogni modo, posso rimuovere il mio -1 se pensi che sia maleducato. Ho appena scoperto che la tua risposta era totalmente fuori tema e che non sarebbe molto utile per la maggior parte degli utenti che vengono qui con un problema molto comune ... (il parametro predefinito di bind)
Orabîg

1
L'OP ha detto di aver commentato la regola di associazione locale, che dice a redis di collegarsi a tutti gli indirizzi sul sistema. Non definirei il -1 maleducato, semplicemente inappropriato. L'OP ha dichiarato espressamente di avere le regole IPtables in atto, quindi è chiaro che nella domanda posta sono presenti regole firewall. Data la presenza dichiarata di un firewall e la rimozione del bind locale nella configurazione, la tua risposta non è corretta o pertinente per la domanda posta.
The Real Bill

Sì, hai ragione, scusa. Non sono un madrelingua inglese, e ho interpretato male il verbo "comment out" ... Pensavo che OP avesse "rimosso" il commento. (sfortunatamente, non posso rimuovere il mio -1, finché non modifichi il tuo post)
Orabîg

Nessun problema, succede. Ho aggiunto alcuni chiarimenti sulla convalida che sta funzionando dove vuoi. Spero che questo aiuti a chiarirlo per i futuri lettori.
The Real Bill

328

Sono rimasto bloccato con lo stesso problema e la risposta precedente non mi ha aiutato (anche se ben scritta).

La soluzione è qui: controlla il tuo /etc/redis/redis.confe assicurati di cambiare l'impostazione predefinita

bind 127.0.0.1

per

bind 0.0.0.0

Quindi riavvia il servizio ( service redis-server restart)

Ora puoi controllare che redis sia in ascolto su un'interfaccia non locale con

redis-cli -h 192.168.x.x ping

(sostituisci 192.168.xx con il tuo indirizzo IP)

Nota importante: come hanno affermato diversi utenti, non è sicuro impostarlo su un server esposto a Internet. Dovresti essere certo che redis sia protetto con qualsiasi mezzo che si adatti alle tue esigenze.


1
Lo stesso qui, dovresti consentire le connessioni remote dal server Redis in primo luogo prima di pensare alle impostazioni del firewall o ai problemi di rete. Grazie Orabig
securecurve

Questa è l'ovvia risposta corretta. Quello sopra ha un sacco di mumbo jumbo "arti oscure" di amministratore di sistema tecnico ... ma non è affatto utile :)
Henley Chiu

7
Questo problema non è lo stesso dell'OP. L'OP ha dichiarato espressamente di aver già apportato le modifiche necessarie al file di configurazione. Poiché l'OP ha apportato modifiche al file di configurazione e tu l'hai fatto. No, sono due questioni separate. La risposta fornita ha affrontato il problema fornito. Non era per affrontare tutti i problemi. Solo quello ha chiesto. Non si tratta di ammettere che qualcosa non va, si tratta di rendersi conto che il tuo problema è diverso. È come se qualcuno dicesse che la sua macchina non si avvia ma c'è benzina e tu gli dici che ha bisogno di benzina.
The Real Bill

1
Sapresti anche come specificare il dual-stack IPv4 e IPv6? Ho provato la seguente: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(dove \ n è una nuova riga) e bind 0 [::], ma l'unica cosa che le opere non sta avendo un bindlinea nella configurazione a tutti. Il valore predefinito è l'ascolto su 0 (o 0.0.0.0/0) e [::] quindi non ci sono problemi, ma vorrei conoscere il metodo corretto se ne avessi bisogno una volta. Non sembra essere documentato da nessuna parte.
Luc

7
Ciò che fa questa risposta è che rende il tuo server Redis accessibile al mondo. Questo è un grosso rischio per la sicurezza. In tal caso, assicurati di bloccare il server Redis in altri modi, ad esempio aggiungendo una password AUTH in Redis e configurando il firewall (ad esempio iptables) per bloccare i client non autorizzati.
sffc

14

Oltre all'ottima risposta data da Orabîg:

Ho risolto questo problema rimuovendo completamente la bindsezione e impostando protected-modesu no.

#bind 127.0.0.1
protected-mode no

Non utilizzare mai questo metodo su server esposti pubblicamente.


1
A chiunque utilizzi un metodo non protetto: Proteggi il tuo server Redis !! o perderai tutti i tuoi file :( Il mio server è stato compromesso perché non sto proteggendo Redis Server. L'aggressore vuole che paghi una certa somma di denaro (abbastanza grande per me). L'aggressore qualcosa del genere: duo.com/ blog /…
MonkimoE

4

Orabig ha ragione.

Puoi associare 10.0.2.15 in Ubuntu (VirtualBox) quindi eseguire un port forwarding dall'host al guest Ubuntu.

in /etc/redis/redis.conf

bind 10.0.2.15

quindi, riavvia redis:

sudo systemctl restart redis

Funzionerà!


4

Ho lottato con la connessione remota a Redis per alcuni giorni. Finalmente ce l'ho fatta. Ecco la lista di controllo completa che ho messo insieme per seguire per connettermi. Alcune delle soluzioni sono fornite nelle risposte sopra. Eppure volevo che la mia risposta fosse un nano-wiki sull'argomento :) Ho aggiunto anche alcuni link utili.

Se redis funziona localmente:

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

Se la password non è impostata

Vedi /etc/redis/redis.confconfig (questa è la posizione predefinita per Ubuntu 18.04, potresti averla in una posizione diversa):

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

Se la modalità protetta è impostata su "no" nella configurazione:

# The following line should be uncommented
protected-mode no

se l'associazione IP è aperta per un accesso da Internet nella configurazione:

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

Se il firewall Linux consente le connessioni

(qui per Ubuntu 18.04) Controlla che consenta al traffico Internet in entrata di andare alla porta 6379(la porta predefinita di 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

Riavvia il servizio Redis

Non dimenticare di riavviare il servizio Redis affinché le modifiche abbiano effetto e vedi che è in esecuzione:

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

Controlla se funziona come un server remoto

dalla riga di comando usa redis-clicome se il server Redis fosse sul server remoto:

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

Se puoi eseguire il ping-PONG del tuo server Redis tramite il tuo server Internet connesso come server remoto, allora la connessione Redis remota funziona.

Avviso di sicurezza

Tutto quanto sopra rende i tuoi dati Redis completamente aperti a chiunque da Internet.

Per proteggere fondamentalmente l'uso requirepasse le protected-mode yesimpostazioni di Redis nella configurazione di Redis (vedere sopra) e bloccare i pericolosi comandi di Redis (vedere il collegamento sopra), per una comprensione più approfondita vedere questo articolo e la sezione sulla sicurezza del sito Redis ).

Link utili

Alcuni collegamenti per aiutare come installare e proteggere Redis su Ubuntu 18.04 e come configurare il firewall di Ubuntu 18.04 .

Spero che sia d'aiuto.


2
  • se hai scaricato redis da solo (non apt-get install redis-server) e poi modificato il redis.conf con i suggerimenti di cui sopra, assicurati di avviare redis con la configurazione in questo modo:./src/redis-server redis.conf

    • anche nota a margine sto includendo uno screenshot dell'impostazione della scatola virtuale per connettersi a Redis, se sei su Windows e ti connetti a una virtualbox vm.

inserisci qui la descrizione dell'immagine


0

L'impostazione di tcp-keepalive su 60 (era impostata su 0) nella configurazione redis del server mi ha aiutato a risolvere questo problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.