Redis - połącz się z serwerem zdalnym


122

Właśnie pomyślnie zainstalowałem Redis, korzystając z instrukcji zawartych w przewodniku Szybki start na http://redis.io/topics/quickstart na moim serwerze Ubuntu 10.10. Uruchamiam usługę jako dameon (więc może być uruchamiana przez init.d)

Serwer jest częścią klastra Rackspace z wewnętrznymi i zewnętrznymi adresami IP. Host działa na porcie 6379 (standard dla Redis)

Dodałem wiersz w iptables, aby umożliwić połączenia przychodzące z portu 6379, jak pokazano poniżej:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

W moim kodzie PHP na innym serwerze próbuję połączyć się z nowym serwerem Redis tutaj:

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

$hostname = "IP ADDRESS HERE";

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

Kiedy to zrobię - zawsze odmawiam połączenia. W moim pliku redis.conf mam zakomentowane lokalne polecenie bind, więc powinno nasłuchiwać więcej niż adres IP localhost. Mogę połączyć się z bazą danych na komputerze lokalnym, ale nie na innym serwerze. Próbowałem zewnętrznych i wewnętrznych adresów IP bez powodzenia.

Jakieś sugestie, jak to zadziała?


Czy możesz nawiązać połączenie za pomocą narzędzia wiersza poleceń Redis? redis-cli -h hostname
jlundqvist

Błąd serwera zawiera kanoniczne pytanie dotyczące odmowy połączenia .
Raedwald,

Odpowiedzi:


129

Najpierw sprawdzę, czy nasłuchuje adresów IP, których oczekujesz:

netstat -nlpt | grep 6379

W zależności od tego, jak uruchomiłeś / zatrzymałeś, być może nie uruchomiłeś ponownie instancji, tak jak myślałeś, że to zrobiłeś. Netstat powie ci, czy nasłuchuje tam, gdzie myślisz. Jeśli nie, uruchom go ponownie i upewnij się, że uruchamia się ponownie. Jeśli uruchomi się ponownie i nadal nie nasłuchuje w oczekiwanym miejscu, sprawdź plik konfiguracyjny, aby się upewnić.

Po ustaleniu, że nasłuchuje tam, gdzie tego oczekujesz, ze zdalnego węzła, który powinien mieć dostęp, spróbuj:

redis-cli -h REMOTE.HOST ping

Możesz również spróbować tego z lokalnego hosta, ale użyj adresu IP, którego oczekujesz, zamiast nazwy hosta lub lokalnego hosta. Powinieneś zobaczyć to PONG w odpowiedzi w obu przypadkach.

Jeśli nie, to Twoja zapora (e) blokuje Cię. Mogą to być lokalne tabele IPTables lub być może zapora ogniowa między węzłami. Możesz dodać instrukcję rejestrowania do konfiguracji IPtables, aby rejestrować połączenia ponad 6379, aby zobaczyć, co się dzieje. Również próba ponownego wysłania polecenia ping z lokalnego i nielokalnego do tego samego adresu IP powinna być przykładowa. Jeśli odpowiada lokalnie, ale nie zdalnie, skłaniałbym się ku interweniującej zaporze ogniowej w zależności od złożoności reguł tabel adresów IP w węźle.


16
Tak więc, żeby było jasne, głosujesz w dół na odpowiedź na opublikowany problem, ponieważ masz powiązany (ale wyraźnie nie identyczny) problem, którego nie rozwiązuje? Chociaż zgadzam się z opublikowaniem twojego rozwiązania, odrzucenie poprawnej odpowiedzi, ponieważ twój problem był inny, nie wydaje się właściwym rozwiązaniem. To powiedziawszy, twoje rozwiązanie nie jest dobrym wyborem na to pytanie, ponieważ OP ma wiele adresów IP i może nie chcieć nasłuchiwać na nich wszystkich, a OP w pytaniu konkretnie odwoływał się do sekcji powiązania w pliku konfiguracyjnym. Dlatego Twoje rozwiązanie nie odpowiada na zadane pytanie.
The Real Bill

2
Cóż, ponownie przeczytałem pytanie i nie wydawało mi się tak oczywiste, że OP ustawił poprawną konfigurację dla tej linii „bind”. Nie jestem też pewien, czy w jego przypadku jest zaangażowany jakikolwiek firewall. W każdym razie mogę usunąć moje -1, jeśli uważasz, że jest niegrzeczne. Właśnie stwierdziłem, że Twoja odpowiedź była całkowicie niezwiązana z tematem i nie byłaby zbyt pomocna dla większości użytkowników przybywających tutaj z bardzo częstym problemem ... (parametr domyślny bind)
Orabîg

1
OP powiedział, że wykomentował lokalną regułę wiązania, która nakazuje redis wiązać się ze wszystkimi adresami w systemie. Nie nazwałbym -1 niegrzeczne, po prostu nieodpowiednie. OP wyraźnie stwierdził, że ma wdrożone reguły IPtables, dlatego jasne jest, że w zadanym pytaniu obowiązują reguły zapory ogniowej. Biorąc pod uwagę obecność zapory ogniowej i usunięcie lokalnego powiązania w konfiguracji, Twoja odpowiedź nie jest poprawna lub nie dotyczy zadanego pytania.
The Real Bill

Tak, masz rację, przepraszam. Nie jestem rodzimym językiem angielskim i źle zinterpretowałem czasownik „skomentuj”… Myślałem, że OP „usunął” komentarz. (niestety, nie mogę usunąć mojego -1, dopóki nie wyedytujesz swojego postu)
Orabîg

Nie martw się, to się zdarza. Dodałem wyjaśnienie dotyczące sprawdzania, czy działa tam, gdzie chcesz. Mam nadzieję, że pomoże to wyjaśnić to przyszłym czytelnikom.
The Real Bill

328

Utknąłem z tym samym problemem, a poprzednia odpowiedź nie pomogła mi (choć dobrze napisana).

Rozwiązanie jest tutaj: sprawdź swoje /etc/redis/redis.confi pamiętaj, aby zmienić domyślne

bind 127.0.0.1

do

bind 0.0.0.0

Następnie uruchom ponownie usługę ( service redis-server restart)

Możesz teraz sprawdzić, czy redis nasłuchuje na interfejsie nielokalnym z

redis-cli -h 192.168.x.x ping

(zastąp 192.168.xx swoim adresem IP)

Ważna uwaga: jak stwierdziło kilku użytkowników, ustawienie tej opcji na serwerze, który jest wystawiony na działanie Internetu , nie jest bezpieczne . Powinieneś mieć pewność, że Twoja redis jest chroniona wszelkimi środkami, które odpowiadają Twoim potrzebom.


1
To samo tutaj, powinieneś najpierw zezwolić na połączenia zdalne z serwera Redis, zanim pomyślisz o ustawieniach zapory lub problemach z siecią. Dzięki Orabig
securecurve

To jest oczywiście poprawna odpowiedź. Ten powyżej ma dużo technicznego sysadmin "dark-arts" mumbo jumbo ... ale to wcale nie jest pomocne :)
Henley Chiu

7
Ten problem nie jest tym samym, co PO. OP wyraźnie oświadczył, że wprowadził już niezbędne zmiany w pliku konfiguracyjnym. Ponieważ OP wprowadził zmiany w pliku konfiguracyjnym i ty to zrobiłeś. Nie, to dwie odrębne kwestie. Podana odpowiedź dotyczyła przedstawionego problemu. Nie chodziło o rozwiązanie wszystkich problemów. Tylko ten zapytał. Nie chodzi o przyznanie się, że coś jest nie tak, ale o uświadomienie sobie, że twój problem jest inny. To tak, jakby ktoś powiedział, że jego samochód się nie uruchomi, ale jest w nim paliwo, a ty mówisz mu, że potrzebuje benzyny.
The Real Bill

1
Czy wiesz również, jak określić podwójny stos IPv4 i IPv6? Próbowałem następujące: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(gdzie \ n jest znakiem nowej linii) i bind 0 [::]ale jedyną rzeczą, która działa nie ma bindlinii w config w ogóle. Domyślnie nasłuchuje na 0 (lub 0.0.0.0/0) i [::], więc nie ma problemu, ale chciałbym znać właściwą metodę, gdybym jej kiedyś potrzebował. Nie wydaje się być nigdzie udokumentowany.
Luc

7
Ta odpowiedź sprawia, że ​​Twój serwer Redis jest dostępny dla świata. To duże zagrożenie bezpieczeństwa. Jeśli to zrobisz, upewnij się, że zablokowałeś serwer Redis w inny sposób, na przykład poprzez dodanie hasła AUTH w Redis i skonfigurowanie zapory (np. iptables) W celu blokowania nieautoryzowanych klientów.
sffc

14

Oprócz doskonałej odpowiedzi udzielonej przez Orabîg:

I rozwiązany ten problem, usuwając bindcałkowicie sekcję i ustawiania protected-modesię no.

#bind 127.0.0.1
protected-mode no

Nigdy nie używaj tej metody na publicznie dostępnych serwerach.


1
Dla każdego, kto używa niezabezpieczonej metody: Chroń swój serwer Redis !! albo stracisz wszystkie swoje pliki :( Mój serwer został przejęty, ponieważ nie zabezpieczam serwera Redis. Atakujący chce, żebym zapłacił pewną kwotę pieniędzy (wystarczająco dużą dla mnie). Atakujący coś takiego: duo.com/ blog /…
MonkimoE

4

Orabig ma rację.

Możesz powiązać 10.0.2.15 w Ubuntu (VirtualBox), a następnie wykonać przekierowanie portu z hosta do gościa Ubuntu.

w /etc/redis/redis.conf

bind 10.0.2.15

następnie uruchom ponownie redis:

sudo systemctl restart redis

To zadziała!


4

Przez kilka dni zmagałem się ze zdalnym połączeniem z Redis. Wreszcie się udało. Oto pełna lista kontrolna, którą stworzyłem, aby uzyskać połączenie. Niektóre rozwiązania podano w odpowiedziach powyżej. Chciałem jednak, aby moją odpowiedzią była nano-wiki na ten temat :) Dodałem też kilka przydatnych linków.

Jeśli redis działa lokalnie:

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

Jeśli hasło nie jest ustawione

Zobacz /etc/redis/redis.confkonfigurację (jest to domyślna lokalizacja dla Ubuntu 18.04, możesz ją mieć w innej lokalizacji):

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

Jeśli tryb chroniony jest ustawiony na „nie” w konfiguracji:

# The following line should be uncommented
protected-mode no

jeśli powiązanie IP jest otwarte dla dostępu z Internetu w konfiguracji:

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

Jeśli zapora systemu Linux zezwala na połączenia

(tutaj dla Ubuntu 18.04) Sprawdź, czy przychodzący ruch internetowy przechodzi do portu 6379(domyślny port 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

Uruchom ponownie usługę Redis

Nie zapomnij ponownie uruchomić usługi Redis, aby zmiany zaczęły obowiązywać i zobacz, czy działa:

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

Sprawdź, czy działa jako serwer zdalny

z linii poleceń użyj redis-clitak, jakby serwer Redis był na serwerze zdalnym:

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

Jeśli możesz wysłać ping-PONG do serwera Redis za pośrednictwem serwera internetowego podłączonego jako serwer zdalny, wtedy zdalne połączenie Redis działa.

Ostrzeżenie bezpieczeństwa

Wszystko to sprawia, że ​​Twoje dane Redis są całkowicie otwarte dla każdego z internetu.

Aby w zasadzie zabezpieczyć użycie requirepassi protected-mode yesustawienia Redis w konfiguracji Redis (patrz powyżej) oraz zablokować niebezpieczne polecenia Redis (zobacz łącze powyżej), aby uzyskać dokładniejsze informacje, zobacz ten artykuł i sekcję dotyczącą zabezpieczeń witryny Redis ).

Przydatne linki

Kilka linków do pomocy Jak zainstalować i zabezpieczyć Redis na Ubuntu 18.04 i jak skonfigurować zaporę sieciową Ubuntu 18.04 .

Mam nadzieję, że to pomoże.


2
  • jeśli sam pobrałeś redis (nie apt-get install redis-server), a następnie edytowałeś redis.conf zgodnie z powyższymi sugestiami, upewnij się, że zaczynasz redis z taką konfiguracją:./src/redis-server redis.conf

    • również uwaga boczna, dołączam zrzut ekranu ustawień wirtualnego pudełka do połączenia z redis, jeśli korzystasz z systemu Windows i łączysz się z maszyną wirtualną virtualbox.

wprowadź opis obrazu tutaj


0

Ustawienie tcp-keepalive na 60 (było ustawione na 0) w konfiguracji serwera redis pomogło mi rozwiązać ten problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.