Redis - Se connecter au serveur distant

122

Je viens d'installer Redis avec succès en utilisant les instructions du guide de démarrage rapide sur http://redis.io/topics/quickstart sur mon serveur Ubuntu 10.10. J'exécute le service en tant que dameon (il peut donc être exécuté par init.d)

Le serveur fait partie de Rackspace Cluster avec des adresses IP internes et externes. L'hôte fonctionne sur le port 6379 (standard pour Redis)

J'ai ajouté une ligne dans les iptables pour autoriser les connexions entrantes du port 6379 comme indiqué ci-dessous:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

Dans mon code PHP sur un autre serveur, j'essaye de me connecter au nouveau serveur Redis ici:

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

$hostname = "IP ADDRESS HERE";

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

Une fois que je fais cela, je reçois toujours une connexion refusée. Dans mon fichier redis.conf, j'ai la commande de liaison locale commentée, elle devrait donc écouter plus que l'IP localhost. Je peux me connecter à la base de données sur la machine locale mais pas sur un autre serveur. J'ai essayé les adresses IP externes et internes sans succès.

Des suggestions pour que cela fonctionne?

Gregavola
la source
Pouvez-vous vous connecter à l'aide de l'outil de ligne de commande Redis? redis-cli -h hostname
jlundqvist
Server Fault a une question canonique sur la connexion refusée .
Raedwald

Réponses:

129

Tout d'abord, je vérifierais qu'il écoute sur les adresses IP que vous attendez:

netstat -nlpt | grep 6379

Selon la façon dont vous démarrez / arrêtez, vous n'avez peut-être pas redémarré l'instance alors que vous pensiez l'avoir fait. Le netstat vous dira s'il écoute là où vous le pensez. Sinon, redémarrez-le et assurez-vous qu'il redémarre. S'il redémarre et n'écoute toujours pas là où vous le souhaitez, vérifiez votre fichier de configuration pour être sûr.

Après avoir établi qu'il écoute là où vous vous attendez, à partir d'un nœud distant qui devrait avoir accès, essayez:

redis-cli -h REMOTE.HOST ping

Vous pouvez également essayer cela à partir de l'hôte local, mais utilisez l'adresse IP sur laquelle vous vous attendez à ce qu'il écoute au lieu d'un nom d'hôte ou d'un hôte local. Vous devriez le voir PONG en réponse dans les deux cas.

Sinon, votre ou vos pare-feu vous bloquent. Ce serait soit les IPTables locaux, soit éventuellement un pare-feu entre les nœuds. Vous pouvez ajouter une instruction de journalisation à votre configuration IPtables pour enregistrer les connexions sur 6379 pour voir ce qui se passe. En outre, essayer de redisposer le ping de local et non local vers la même adresse IP devrait être illustratif. S'il répond localement mais pas à distance, je pencherais vers un pare-feu intervenant en fonction de la complexité de vos règles de tables IP sur le nœud.

Le vrai projet de loi
la source
16
Donc, pour être clair, vous votez contre une réponse au problème affiché parce que vous avez un problème connexe (mais clairement pas identique) qu'il ne résout pas? Bien que je sois d'accord avec l'affichage de votre solution, voter contre une réponse correcte parce que votre problème était différent ne semble pas la bonne chose à faire. Cela dit, votre solution n'est pas un bon choix pour la question car l'OP a plusieurs adresses IP et peut ne pas vouloir les écouter toutes, et l'OP a spécifiquement référencé la section bind dans le fichier de configuration de la question. Ainsi votre solution ne répond pas à la question posée.
The Real Bill
2
Eh bien, j'ai relu la question, et cela ne me semblait pas si évident qu'OP ait défini la configuration correcte pour cette ligne 'bind'. De plus, je ne suis pas sûr qu'un pare-feu soit impliqué dans son cas. Quoi qu'il en soit, je peux supprimer mon -1 si vous pensez que c'est impoli. Je viens de trouver que votre réponse était totalement hors sujet et que cela ne serait pas très utile pour la majorité des utilisateurs qui viennent ici avec un problème très courant ... (le paramètre par défaut de liaison)
Orabîg
1
L'OP a dit qu'il avait commenté la règle de liaison locale, qui dit à redis de se lier à toutes les adresses du système. Je n'appellerais pas le -1 impoli, juste inapproprié. Le PO a spécifiquement déclaré qu'il avait des règles IPtables en place, il est donc clair que des règles de pare-feu sont en place dans la question posée. Compte tenu de la présence déclarée d'un pare-feu et de la suppression de la liaison locale dans la configuration, votre réponse n'est pas correcte ou pertinente pour la question posée.
The Real Bill
Oui, vous avez raison, désolé. Je ne suis pas de langue maternelle anglaise et j'ai mal interprété le verbe "comment out" ... Je pensais qu'OP avait "supprimé" le commentaire. (malheureusement, je ne peux pas supprimer mon -1, jusqu'à ce que vous
modifiiez
Pas de soucis, ça arrive. J'ai ajouté quelques précisions concernant la validation de son exécution là où vous le souhaitez. J'espère que cela aidera à le clarifier pour les futurs lecteurs.
The Real Bill
328

J'ai été coincé avec le même problème, et la réponse précédente ne m'a pas aidé (bien que bien écrite).

La solution est ici: vérifiez votre /etc/redis/redis.conf, et assurez-vous de changer la valeur par défaut

bind 127.0.0.1

à

bind 0.0.0.0

Puis redémarrez votre service ( service redis-server restart)

Vous pouvez alors maintenant vérifier que redis écoute sur une interface non locale avec

redis-cli -h 192.168.x.x ping

(remplacez 192.168.xx par votre adresse IP)

Remarque importante: comme plusieurs utilisateurs l'ont déclaré, il n'est pas sûr de le configurer sur un serveur exposé à Internet. Vous devez être certain que votre redis est protégé par tous les moyens qui correspondent à vos besoins.

Orabîg
la source
1
De même ici, vous devez d'abord autoriser les connexions à distance depuis le serveur Redis avant de penser aux paramètres du pare-feu ou aux problèmes de réseau. Merci Orabig
securecurve
C'est la bonne réponse évidente. Celui ci-dessus a beaucoup de jumbo technique sysadmin "dark-arts" mumbo ... mais ce n'est pas du tout utile :)
Henley Chiu
7
Ce problème n'est pas le même que l'OP. L'OP a spécifiquement déclaré qu'il avait déjà apporté les modifications nécessaires au fichier de configuration. Depuis l'OP a apporté des modifications au fichier de configuration et vous l'avez fait. Non, ce sont deux problèmes distincts. La réponse apportée répondait au problème posé. Il ne s'agissait pas de régler tous les problèmes. Juste celui demandé. Il ne s'agit pas d'admettre que quelque chose ne va pas, il s'agit de réaliser que votre problème est différent. C'est comme si quelqu'un disait que sa voiture ne démarre pas mais qu'il y avait de l'essence dedans et que vous lui disiez qu'il a besoin d'essence.
The Real Bill
1
Sauriez-vous également comment spécifier la double pile IPv4 et IPv6? J'ai essayé ce qui suit: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(où \ n est un saut de ligne) et bind 0 [::]mais la seule chose qui fonctionne est de ne pas avoir une bindligne dans la configuration du tout. Par défaut, il écoute sur 0 (ou 0.0.0.0/0) et [::] donc il n'y a pas de problème, mais j'aimerais connaître la méthode appropriée si j'en ai besoin une fois. Cela ne semble être documenté nulle part.
Luc
7
Cette réponse rend votre serveur Redis accessible au monde entier. C'est un gros risque pour la sécurité. Si vous faites cela, assurez-vous de verrouiller votre serveur Redis par d'autres moyens, tels que l' ajout d'un mot de passe AUTH dans Redis et la configuration de votre pare-feu (par exemple iptables) pour bloquer les clients non autorisés.
sffc
14

En plus de l'excellente réponse d'Orabîg:

J'ai résolu ce problème en supprimant bindentièrement la section et en la définissant protected-modesur no.

#bind 127.0.0.1
protected-mode no

N'utilisez jamais cette méthode sur des serveurs exposés publiquement.

Zen
la source
1
À toute personne utilisant une méthode non sécurisée: veuillez protéger votre serveur Redis !! ou vous perdrez tous vos fichiers: (Mon serveur a été compromis car je ne sécurise pas le serveur Redis. L'attaquant veut que je paie une somme d'argent (assez gros pour moi). L'attaquant quelque chose comme ceci: duo.com/ blog /…
MonkimoE
4

Orabig a raison.

Vous pouvez lier 10.0.2.15 dans Ubuntu (VirtualBox) puis effectuer un transfert de port de l'hôte à l'invité Ubuntu.

dans /etc/redis/redis.conf

bind 10.0.2.15

puis, redémarrez redis:

sudo systemctl restart redis

Cela fonctionnera!

Michael Qin
la source
4

J'ai eu des problèmes avec la connexion à distance à Redis pendant quelques jours. Enfin je l'ai fait. Voici la liste de contrôle complète que j'ai préparée pour suivre pour me connecter. Certaines des solutions sont données dans les réponses ci-dessus. Pourtant, je voulais que ma réponse soit un nano-wiki sur le sujet :) J'ai également ajouté des liens utiles.

Si redis fonctionne localement:

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

Si le mot de passe n'est pas défini

Voir /etc/redis/redis.confconfig (c'est l'emplacement par défaut pour Ubuntu 18.04, vous pouvez l'avoir à un emplacement différent):

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

Si le mode protégé est défini sur `` non '' dans la configuration:

# The following line should be uncommented
protected-mode no

si la liaison IP est ouverte pour un accès depuis Internet dans la configuration:

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

Si le pare-feu Linux autorise les connexions

(ici pour Ubuntu 18.04) Vérifiez qu'il permet au trafic Internet entrant d'aller au port 6379(le port par défaut 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

Redémarrez le service Redis

N'oubliez pas de redémarrer le service Redis pour que les modifications prennent effet et voir qu'il est en cours d'exécution:

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

Vérifiez s'il fonctionne comme un serveur distant

à partir de votre ligne de commande, utilisez redis-clicomme si le serveur Redis était sur le serveur distant:

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

Si vous pouvez envoyer un ping-PONG à votre serveur Redis via votre serveur Internet connecté en tant que serveur distant, la connexion Redis à distance fonctionne.

Avertissement de sécurité

Tout ce qui précède rend vos données Redis complètement ouvertes à quiconque sur Internet.

Pour sécuriser fondamentalement l'utilisation requirepasset les protected-mode yesparamètres de Redis dans la configuration de Redis (voir ci-dessus) et bloquer les commandes Redis dangereuses (voir le lien ci-dessus), pour une compréhension plus approfondie, consultez cet article et la section sur la sécurité du site Redis ).

Liens utiles

Quelques liens pour vous aider Comment installer et sécuriser Redis sur Ubuntu 18.04 et comment configurer le pare-feu Ubuntu 18.04 .

J'espère que ça aide.

Valentine Shi
la source
2
  • si vous avez téléchargé vous-même redis (pas apt-get install redis-server) et que vous avez ensuite édité le redis.conf avec les suggestions ci-dessus, assurez-vous que votre démarrage est redis avec la configuration comme ceci:./src/redis-server redis.conf

    • note également que j'inclus une capture d'écran du paramètre de boîte virtuelle pour vous connecter à redis, si vous êtes sous Windows et que vous vous connectez à une virtualbox vm.

entrez la description de l'image ici

Robot70
la source
0

La définition de tcp-keepalive sur 60 (il a été défini sur 0) dans la configuration redis du serveur m'a aidé à résoudre ce problème.

Saurabh
la source