Redis - Verbindung zum Remote-Server herstellen

122

Ich habe Redis gerade erfolgreich installiert, indem ich die Anweisungen in der Kurzanleitung unter http://redis.io/topics/quickstart auf meinem Ubuntu 10.10-Server verwendet habe. Ich führe den Dienst als Dameon aus (damit er von init.d ausgeführt werden kann).

Der Server ist Teil des Rackspace-Clusters mit internen und externen IPs. Der Host läuft auf Port 6379 (Standard für Redis)

Ich habe eine Zeile in den iptables hinzugefügt, um eingehende Verbindungen von Port 6379 zuzulassen, wie unten gezeigt:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

In meinem PHP-Code auf einem anderen Server versuche ich hier, eine Verbindung zum neuen Redis-Server herzustellen:

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

$hostname = "IP ADDRESS HERE";

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

Sobald ich das mache, wird mir immer eine Verbindung verweigert. In meiner Datei redis.conf ist der Befehl local bind auskommentiert, sodass mehr als die IP-Adresse localhost abgehört werden sollte. Ich kann eine Verbindung zur Datenbank auf dem lokalen Computer herstellen, nur nicht auf einem anderen Server. Ich habe die externen und internen IPs ohne Glück ausprobiert.

Irgendwelche Vorschläge, wie dies funktioniert?

Gregavola
quelle
Können Sie eine Verbindung mit dem Redis-Befehlszeilentool herstellen? redis-cli -h hostname
Jlundqvist
Serverfehler hat eine kanonische Frage zu Verbindung abgelehnt .
Raedwald

Antworten:

129

Zuerst würde ich überprüfen, ob es die IPs abhört, die Sie erwarten:

netstat -nlpt | grep 6379

Abhängig davon, wie Sie starten / stoppen, haben Sie die Instanz möglicherweise nicht neu gestartet, als Sie dachten, dass Sie dies getan haben. Der Netstat sagt Ihnen, ob er zuhört, wo Sie denken, dass er ist. Wenn nicht, starten Sie es neu und stellen Sie sicher, dass es neu startet. Wenn es neu gestartet wird und immer noch nicht hört, wo Sie es erwarten, überprüfen Sie Ihre Konfigurationsdatei, um sicherzugehen.

Nach dem Einrichten wird von einem Remote-Knoten, der Zugriff haben sollte, abgehört, wo Sie es erwarten: Versuchen Sie:

redis-cli -h REMOTE.HOST ping

Sie können dies auch vom lokalen Host aus versuchen, aber anstelle eines Hostnamens oder eines lokalen Hosts die IP-Adresse verwenden, die Sie abhören möchten. Sie sollten es in beiden Fällen als Antwort PONG sehen.

Wenn nicht, blockieren Sie Ihre Firewall (s). Dies sind entweder die lokalen IPTables oder möglicherweise eine Firewall zwischen den Knoten. Sie können Ihrer IPtables-Konfiguration eine Protokollierungsanweisung hinzufügen, um Verbindungen über 6379 zu protokollieren, um zu sehen, was passiert. Der Versuch, den Ping von lokal und nicht lokal auf dieselbe IP zu ändern, sollte ebenfalls veranschaulichend sein. Wenn es lokal, aber nicht remote reagiert, würde ich mich abhängig von der Komplexität Ihrer IP-Tabellenregeln auf dem Knoten zu einer dazwischenliegenden Firewall neigen.

Die echte Rechnung
quelle
16
Um ganz klar zu sein, stimmen Sie eine Antwort auf das veröffentlichte Problem ab, weil Sie ein verwandtes (aber eindeutig nicht identisches) Problem haben, das nicht behoben wird? Obwohl ich mit der Veröffentlichung Ihrer Lösung einverstanden bin, scheint es nicht richtig zu sein, eine korrekte Antwort herunterzustimmen, da Ihr Problem anders war. Ihre Lösung ist jedoch keine gute Wahl für die Frage, da das OP mehrere IP-Adressen hat und möglicherweise nicht alle abhören möchte. Das OP hat in der Frage speziell auf den Bindungsabschnitt in der Konfigurationsdatei verwiesen. Somit geht Ihre Lösung nicht auf die gestellte Frage ein.
Die echte Rechnung
2
Nun, ich habe die Frage noch einmal gelesen und es schien mir nicht so offensichtlich, dass OP die richtige Konfiguration für diese 'Bind'-Zeile festgelegt hat. Ich bin mir auch nicht sicher, ob eine Firewall in seinen Fall involviert ist. Wie auch immer, ich kann meine -1 entfernen, wenn Sie denken, dass es unhöflich ist. Ich habe gerade festgestellt, dass Ihre Antwort völlig vom Thema
abweicht
1
Das OP sagte, er habe die lokale Bindungsregel auskommentiert, die redis anweist, an alle Adressen im System zu binden. Ich würde das -1 nicht als unhöflich bezeichnen, nur als unangemessen. Das OP gab ausdrücklich an, dass er IPtables-Regeln eingerichtet habe. Daher ist klar, dass in der gestellten Frage Firewall-Regeln vorhanden sind. Angesichts des angegebenen Vorhandenseins einer Firewall und des Entfernens der lokalen Bindung in der Konfiguration ist Ihre Antwort für die gestellte Frage nicht korrekt oder relevant.
Die echte Rechnung
Ja, du hast recht, sorry. Ich bin kein Muttersprachler und habe das Verb "Auskommentieren" falsch interpretiert ... Ich dachte, dass OP den Kommentar "entfernt" hat. (Leider kann ich meine -1 nicht entfernen, bis Sie Ihren Beitrag bearbeiten)
Orabîg
Keine Sorge, es passiert. Ich habe einige Erläuterungen zur Überprüfung hinzugefügt, ob es dort ausgeführt wird, wo Sie es möchten. Hoffe, das hilft, es für zukünftige Leser zu klären.
Die echte Rechnung
327

Ich bin mit dem gleichen Problem festgefahren, und die vorhergehende Antwort hat mir nicht geholfen (wenn auch gut geschrieben).

Die Lösung ist hier: Überprüfen Sie Ihre /etc/redis/redis.confund stellen Sie sicher, dass Sie die Standardeinstellung ändern

bind 127.0.0.1

zu

bind 0.0.0.0

Starten Sie dann Ihren Dienst neu ( service redis-server restart)

Sie können dann jetzt überprüfen, ob redis auf einer nicht lokalen Schnittstelle mit lauscht

redis-cli -h 192.168.x.x ping

(Ersetzen Sie 192.168.xx durch Ihre IP-Adresse)

Wichtiger Hinweis: Wie mehrere Benutzer angegeben haben, ist es nicht sicher , dies auf einem Server festzulegen, der dem Internet ausgesetzt ist. Sie sollten sicher sein, dass Ihre Redis mit allen Mitteln geschützt sind, die Ihren Anforderungen entsprechen.

Orabîg
quelle
1
Ebenso sollten Sie zunächst Remoteverbindungen vom Redis-Server zulassen, bevor Sie über die Firewall-Einstellungen oder Netzwerkprobleme nachdenken. Vielen Dank Orabig
Securecurve
Dies ist die offensichtlich richtige Antwort. Das obige hat eine Menge technischer Sysadmin "Dark-Arts" Hokuspokus ... aber es ist überhaupt nicht hilfreich :)
Henley Chiu
7
Dieses Problem ist nicht dasselbe wie das OP. Das OP gab ausdrücklich an, dass die Änderungen an der Konfigurationsdatei bereits erforderlich waren. Da das OP Änderungen an der Konfigurationsdatei vorgenommen hat und Sie dies getan haben. Nicht, es sind zwei getrennte Themen. Die gegebene Antwort bezog sich auf das bereitgestellte Problem. Es sollte nicht alle Probleme angehen. Nur der eine fragte. Es geht nicht darum zuzugeben, dass etwas nicht stimmt, es geht darum zu erkennen, dass Ihr Problem anders ist. Es ist, als würde jemand sagen, dass sein Auto nicht anspringt, aber er hat Benzin darin, und Sie sagen ihm, dass er Benzin braucht.
The Real Bill
1
Möchten Sie auch IPv4- und IPv6-Dual-Stack angeben? Ich habe versucht , die folgenden: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(wobei \ n ein Zeilenumbruch ist) und , bind 0 [::]aber das einzige , was funktioniert , ist nicht eine, die bindLinie in der Config überhaupt. Standardmäßig wird 0 (oder 0.0.0.0/0) und [::] abgehört, sodass es kein Problem gibt, aber ich würde gerne die richtige Methode kennen, falls ich sie einmal brauche. Es scheint nirgendwo dokumentiert zu sein.
Luc
7
Diese Antwort macht Ihren Redis-Server für die Welt zugänglich. Das ist ein großes Sicherheitsrisiko. Wenn Sie dies tun, stellen Sie sicher, dass Sie Ihren Redis-Server auf andere Weise sperren, z. B. durch Hinzufügen eines AUTH-Kennworts in Redis und Konfigurieren Ihrer Firewall (z. B. iptables) zum Blockieren nicht autorisierter Clients.
sffc
14

Zusätzlich zu der hervorragenden Antwort von Orabîg:

Ich habe dieses Problem behoben, indem ich den bindAbschnitt vollständig entfernt und protected-modeauf gesetzt habe no.

#bind 127.0.0.1
protected-mode no

Verwenden Sie diese Methode niemals auf öffentlich zugänglichen Servern.

Zen
quelle
1
Für alle, die eine nicht gesicherte Methode verwenden: Bitte schützen Sie Ihren Redis Server !! oder Sie verlieren alle Ihre Dateien :( Mein Server wurde kompromittiert, weil ich Redis Server nicht sichere. Der Angreifer möchte, dass ich etwas Geld bezahle (groß genug für mich). Der Angreifer etwa so: duo.com/ Blog /…
MonkimoE
4

Orabig ist richtig.

Sie können 10.0.2.15 in Ubuntu (VirtualBox) binden und dann eine Portweiterleitung vom Host zum Gast-Ubuntu durchführen.

in /etc/redis/redis.conf

bind 10.0.2.15

Starten Sie dann redis neu:

sudo systemctl restart redis

Es soll funktionieren!

Michael Qin
quelle
4

Ich hatte einige Tage mit der Fernverbindung zu Redis zu kämpfen. Endlich habe ich es geschafft. Hier ist die vollständige Checkliste, die ich zusammengestellt habe, um eine Verbindung herzustellen. Einige der Lösungen sind in den obigen Antworten angegeben. Ich wollte jedoch, dass meine Antwort ein Nano-Wiki zu diesem Thema ist :) Ich habe auch einige nützliche Links hinzugefügt.

Wenn redis lokal funktioniert:

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

Wenn das Passwort nicht festgelegt ist

Siehe /etc/redis/redis.confconfig (dies ist der Standardspeicherort für Ubuntu 18.04, möglicherweise an einem anderen Speicherort):

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

Wenn der geschützte Modus in der Konfiguration auf "Nein" gesetzt ist:

# The following line should be uncommented
protected-mode no

Wenn die IP-Bindung für einen Internetzugang in der Konfiguration geöffnet ist:

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

Wenn die Linux-Firewall Verbindungen zulässt

(hier für Ubuntu 18.04) Überprüfen Sie, ob eingehender Internetverkehr zum Port 6379(dem Redis-Standardport) geleitet werden kann.

# 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

Starten Sie den Redis-Dienst neu

Vergessen Sie nicht, den Redis-Dienst neu zu starten, damit die Änderungen wirksam werden und angezeigt werden:

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

Überprüfen Sie, ob es als Remote-Server funktioniert

Verwenden Sie in Ihrer Befehlszeile Folgendes, redis-clials ob sich der Redis-Server auf dem Remote-Server befinden würde:

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

Wenn Sie Ihren Redis-Server über Ihren als Remote-Server verbundenen Internet-Server pingen können, funktioniert die Remote-Redis-Verbindung.

Sicherheitswarnung

All dies macht Ihre Redis-Daten für jedermann aus dem Internet vollständig offen.

Um die Verwendung requirepassund protected-mode yesEinstellungen von Redis in der Redis-Konfiguration (siehe oben) grundsätzlich zu sichern und die gefährlichen Redis-Befehle zu blockieren (siehe den obigen Link), finden Sie in diesem Artikel und im Abschnitt zur Sicherheit der Redis-Site ein tieferes Verständnis .

Nützliche Links

Einige Links zur Installation und Sicherung von Redis unter Ubuntu 18.04 und Einrichten der Ubuntu 18.04-Firewall .

Ich hoffe es hilft.

Valentine Shi
quelle
2
  • Wenn Sie redis selbst heruntergeladen haben (nicht apt-get install redis-server) und dann die redis.conf mit den obigen Vorschlägen bearbeitet haben, stellen Sie sicher, dass Sie mit der Konfiguration wie folgt neu starten :./src/redis-server redis.conf

    • Nebenbei bemerkt, ich füge einen Screenshot der Virtual Box-Einstellung hinzu, um eine Verbindung zu Redis herzustellen, wenn Sie unter Windows arbeiten und eine Verbindung zu einer Virtualbox VM herstellen.

Geben Sie hier die Bildbeschreibung ein

Robot70
quelle
0

Das Setzen von tcp-keepalive auf 60 (es wurde auf 0 gesetzt) ​​in der Redis-Konfiguration des Servers half mir, dieses Problem zu beheben.

Saurabh
quelle