Redis - Conecte-se ao servidor remoto

122

Acabei de instalar o Redis com sucesso usando as instruções no guia Início Rápido em http://redis.io/topics/quickstart no meu servidor Ubuntu 10.10. Estou executando o serviço como dameon (para que ele possa ser executado pelo init.d)

O servidor faz parte do Rackspace Cluster com IPs internos e externos. O host está sendo executado na porta 6379 (padrão para Redis)

Adicionei uma linha no iptables para permitir conexões de entrada da porta 6379, como mostrado abaixo:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

No meu código PHP em outro servidor, estou tentando me conectar ao novo servidor Redis aqui:

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

$hostname = "IP ADDRESS HERE";

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

Quando faço isso - sempre recebo uma conexão recusada. No meu arquivo redis.conf, tenho o comando de ligação local comentado; portanto, ele deve estar ouvindo mais do que o IP do host local. Posso me conectar ao banco de dados na máquina local, mas não em outro servidor. Eu tentei os IPs externos e internos sem sorte.

Alguma sugestão para que isso funcione?

Gregegola
fonte
Você consegue se conectar usando a ferramenta de linha de comando Redis? redis-cli -h hostname
Jlundqvist
Falha no servidor tem uma pergunta canônica sobre a conexão recusada .
Raedwald

Respostas:

129

Primeiro, eu verificaria se está ouvindo os IPs que você espera que sejam:

netstat -nlpt | grep 6379

Dependendo de como você iniciar / parar, talvez você não tenha realmente reiniciado a instância quando pensou que tinha. O netstat lhe dirá se está ouvindo onde você pensa que está. Caso contrário, reinicie-o e verifique se ele é reiniciado. Se ele reiniciar e ainda não estiver ouvindo onde você espera, verifique seu arquivo de configuração apenas para ter certeza.

Depois de estabelecer, ele está ouvindo onde você espera, de um nó remoto que deve ter acesso, tente:

redis-cli -h REMOTE.HOST ping

Você também pode tentar isso a partir do host local, mas usar o IP que espera ouvir em vez de um nome de host ou host local. Você deve ver o PONG em resposta nos dois casos.

Caso contrário, seus firewalls estão / estão bloqueando você. Seriam as IPTables locais ou possivelmente um firewall entre os nós. Você pode adicionar uma instrução de log à configuração do IPtables para registrar conexões em 6379 para ver o que está acontecendo. Além disso, tentar rediscar ping de local e não local para o mesmo IP deve ser ilustrativo. Se ele responder localmente, mas não remotamente, eu me inclinaria para um firewall intermediário, dependendo da complexidade das regras das tabelas de IP no nó.

The Real Bill
fonte
16
Portanto, para deixar claro, você está com uma resposta negativa ao problema postado porque possui um problema relacionado (mas claramente não idêntico) que ele não soluciona? Embora eu concorde em postar sua solução, diminuir a votação de uma resposta correta porque seu problema foi diferente não parece a coisa certa a ser feita. Dito isso, sua solução não é uma boa opção para a pergunta porque o OP tem vários IPs e pode não querer escutar todos eles, e o OP referenciou especificamente a seção de ligação no arquivo de configuração na pergunta. Portanto, sua solução não aborda a pergunta.
The Real Bill
2
Bem, li a pergunta novamente e não me pareceu tão óbvio que o OP definiu a configuração correta para essa linha de 'ligação'. Além disso, não tenho certeza de que haja algum firewall envolvido no caso dele. De qualquer forma, eu posso remover meu -1 se você achar que é rude. Eu só descobri que a sua resposta foi totalmente off-topic, e que não seria muito útil para a maioria dos usuários que vêm aqui com um problema muito comum ... (o parâmetro padrão ligamento)
Orabîg
1
O OP disse que comentou a regra de ligação local, que diz ao redis para ligar a todos os endereços no sistema. Eu não chamaria o -1 de rude, apenas inapropriado. O OP declarou especificamente que ele tinha regras de tabelas de IP em vigor, portanto, é claro que existem regras de firewall em vigor na pergunta. Dada a presença declarada de um firewall e a remoção do vínculo local na configuração, sua resposta não é correta ou relevante para a pergunta.
O projeto de lei real
Sim, você está certo, desculpe. Eu não sou um inglês nativo e interpretou mal o verbo "comentar fora" ... pensei que o OP havia "removido" o comentário. (infelizmente, não posso retirar o meu -1, até que você editar seu post)
Orabîg
Não se preocupe, isso acontece. Eu adicionei alguns esclarecimentos sobre a validação de que ele está sendo executado onde você deseja. Espero que ajude a esclarecê-lo para futuros leitores.
The Real Bill
327

Eu fiquei com o mesmo problema, e a resposta anterior não me ajudou (embora esteja bem escrita).

A solução está aqui: verifique seu /etc/redis/redis.confe certifique-se de alterar o padrão

bind 127.0.0.1

para

bind 0.0.0.0

Em seguida, reinicie seu serviço ( service redis-server restart)

Agora você pode verificar se o redis está escutando na interface não local com

redis-cli -h 192.168.x.x ping

(substitua 192.168.xx pelo seu endereço IP)

Nota importante: como vários usuários declararam, não é seguro configurá-lo em um servidor exposto à Internet. Você deve ter certeza de que redis está protegido com qualquer meio que atenda às suas necessidades.

Orabîg
fonte
1
Mesmo aqui, você deve permitir conexões remotas do servidor Redis antes de pensar nas configurações do firewall ou nos problemas de rede. Obrigado Orabig
securecurve
Esta é a resposta correta óbvia. O de cima tem um monte de sysadmin técnico "Dark-artes" patranhas ... mas não é útil em todos os :)
Henley Chiu
7
Esse problema não é o mesmo que o OP. O OP declarou especificamente que já havia feito as alterações necessárias no arquivo de configuração. Desde que o OP fez alterações no arquivo de configuração e você fez. Não, são duas questões separadas. A resposta dada abordou o problema fornecido. Não era para resolver todos os problemas. Apenas o que perguntou. Não se trata de admitir que algo está errado, mas de perceber que seu problema é diferente. É como alguém dizendo que o carro não liga, mas eles têm gasolina, e você está dizendo que eles precisam de gasolina.
O projeto de lei real
1
Você também saberia como especificar a pilha dupla IPv4 e IPv6? Eu tentei o seguinte: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(onde \ n é uma nova linha) e bind 0 [::], mas a única coisa que funciona é não ter uma bindlinha na configuração em tudo. O padrão é escutar 0 (ou 0.0.0.0/0) e [::] para que não haja problema, mas eu gostaria de saber o método adequado, caso precise. Não parece estar documentado em nenhum lugar.
Luc
7
O que essa resposta faz é tornar seu servidor Redis acessível ao mundo. Esse é um grande risco de segurança. Se você fizer isso, bloqueie o servidor Redis de outras maneiras, como adicionar uma senha AUTH no Redis e configurar seu firewall (por exemplo iptables) para bloquear clientes não autorizados.
Sffc
14

Além da excelente resposta dada por Orabîg:

Resolvi esse problema removendo a bindseção completamente e definindo protected-modecomono .

#bind 127.0.0.1
protected-mode no

Nunca use esse método em servidores expostos publicamente.

zen
fonte
1
Para quem usa o método não seguro: Proteja seu servidor Redis !! ou você perderá todos os seus arquivos :( Meu servidor foi comprometido porque não estou protegendo o Redis Server. O invasor deseja que eu pague uma quantia em dinheiro (grande o suficiente para mim). O invasor é algo como: duo.com/ blog /…
MonkimoE
4

Orabig está correto.

Você pode ligar 10.0.2.15 no Ubuntu (VirtualBox) e depois encaminhar uma porta do host para o Ubuntu convidado.

em /etc/redis/redis.conf

bind 10.0.2.15

em seguida, reinicie o redis:

sudo systemctl restart redis

Deverá funcionar!

Michael Qin
fonte
4

Eu estava lutando com a conexão remota com Redis por alguns dias. Finalmente eu consegui. Aqui está a lista de verificação completa que eu montei para seguir para se conectar. Algumas das soluções são dadas nas respostas acima. No entanto, queria que minha resposta fosse um nano-wiki sobre o assunto :) Adicionei alguns links úteis também.

Se o redis funcionar localmente:

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

Se a senha não estiver definida

Veja /etc/redis/redis.confconfig (este é o local padrão para o Ubuntu 18.04, você pode encontrá-lo em outro local):

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

Se o modo protegido estiver definido como 'não' na configuração:

# The following line should be uncommented
protected-mode no

se a ligação IP estiver aberta para acesso da Internet na configuração:

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

Se o firewall do Linux permitir conexões

(aqui para Ubuntu 18.04) Verifique se o tráfego da Internet de entrada é direcionado à porta 6379(a porta padrão 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

Reinicie o serviço Redis

Não se esqueça de reiniciar o serviço Redis para que as alterações entrem em vigor e veja se ele está sendo executado:

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

Verifique se funciona como um servidor remoto

na linha de comando, use redis-clicomo se o servidor Redis estivesse no servidor remoto:

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

Se você puder executar ping-PONG no servidor Redis por meio do servidor da Internet conectado como servidor remoto, a conexão Redis remota funcionará.

Aviso de segurança

Tudo isso faz com que seus dados Redis sejam completamente abertos a qualquer pessoa da Internet.

Para basicamente proteger o uso requirepasse as protected-mode yesconfigurações do Redis na configuração do Redis (veja acima) e bloquear os perigosos comandos Redis (veja o link acima), para uma compreensão mais profunda, consulte este artigo e a seção de segurança do site Redis ).

Links Úteis

Alguns links para ajudar Como instalar e proteger o Redis no Ubuntu 18.04 e como configurar o firewall Ubuntu 18.04 .

Espero que ajude.

Valentine Shi
fonte
2
  • se você baixou o redis você mesmo (não apt-get install redis-server) e editou o redis.conf com as sugestões acima, certifique-se de que você inicie o redis com a configuração da seguinte maneira:./src/redis-server redis.conf

    • Também note que estou incluindo uma captura de tela da configuração da caixa virtual para conectar-se ao redis, se você estiver no Windows e se conectando a um virtualbox vm.

insira a descrição da imagem aqui

Robot70
fonte
0

Definir tcp-keepalive como 60 (foi definido como 0) na configuração redis do servidor me ajudou a resolver esse problema.

Saurabh
fonte