Redis - Uzak Sunucuya Bağlan


122

Redis'i Ubuntu 10.10 sunucumda http://redis.io/topics/quickstart adresindeki Hızlı Başlangıç ​​kılavuzundaki talimatları kullanarak başarılı bir şekilde kurdum . Hizmeti dameon olarak çalıştırıyorum (böylece init.d tarafından çalıştırılabilir)

Sunucu, Dahili ve Harici IP'lere sahip Rackspace Kümesinin bir parçasıdır. Ana bilgisayar 6379 numaralı bağlantı noktasında çalışıyor (Redis için standart)

Aşağıda gösterildiği gibi 6379 numaralı bağlantı noktasından gelen bağlantılara izin vermek için iptables'a bir satır ekledim:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

Başka bir sunucudaki PHP kodumda, burada yeni Redis sunucusuna bağlanmaya çalışıyorum:

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

$hostname = "IP ADDRESS HERE";

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

Bunu yaptığımda - her zaman bir bağlantı reddedilir. Redis.conf dosyamda, yerel bağlama komutunu yorumladım, bu yüzden localhost IP'sinden daha fazlasını dinliyor olmalı. Başka bir sunucuda değil, yerel makinedeki veritabanına bağlanabiliyorum. Şanssız harici ve dahili IP'leri denedim.

Bunu çalıştırmak için herhangi bir öneriniz var mı?


Redis komut satırı aracını kullanarak bağlanabiliyor musunuz? redis-cli -h hostname
jlundqvist

Sunucu Hatası, Bağlantı Reddedildi hakkında kanonik bir soruyu içeriyor .
Raedwald

Yanıtlar:


129

Önce, olmasını beklediğiniz IP'leri dinlediğini doğrulamak için kontrol ettim:

netstat -nlpt | grep 6379

Nasıl başlattığınıza / durdurduğunuza bağlı olarak, sahip olduğunuzu düşündüğünüz sırada örneği gerçekten yeniden başlatmamış olabilirsiniz. Netstat, düşündüğünüz yerde dinleyip dinlemediğini size söyleyecektir. Değilse, yeniden başlatın ve yeniden başladığından emin olun. Yeniden başlarsa ve beklediğiniz yerde hala dinlemiyorsa, emin olmak için yapılandırma dosyanızı kontrol edin.

Kurduktan sonra, erişime sahip olması gereken uzak bir düğümden beklediğiniz yerde dinliyor, deneyin:

redis-cli -h REMOTE.HOST ping

Bunu yerel ana bilgisayardan da deneyebilirsiniz, ancak bir ana bilgisayar adı veya yerel ana bilgisayar yerine dinlemesini beklediğiniz IP'yi kullanabilirsiniz. Her iki durumda da yanıt olarak PONG'u görmelisiniz.

Değilse, güvenlik duvarlarınız sizi engelliyor demektir. Bu, yerel IP Tabloları veya muhtemelen düğümler arasında bir güvenlik duvarı olabilir. Ne olduğunu görmek için 6379 üzerindeki bağlantıları günlüğe kaydetmek için IPtables yapılandırmanıza bir günlük kaydı ifadesi ekleyebilirsiniz. Ayrıca, yerel ve yerel olmayandan aynı IP'ye ping atmayı denemek açıklayıcı olmalıdır. Yerel olarak yanıt veriyorsa ancak uzaktan yanıt vermiyorsa, düğüm üzerindeki IP Tabloları kurallarınızın karmaşıklığına bağlı olarak araya giren bir güvenlik duvarına eğilirim.


16
Öyleyse, açık olmak gerekirse, ilgili (ama açıkça özdeş olmayan) bir probleminiz olduğu için yayınlanan problemin cevabını aşağı oyluyorsunuz? Çözümünüzü yayınlamak konusunda hemfikir olsam da, probleminiz farklı olduğu için doğru cevaba olumsuz oy vermek yapılacak doğru şey gibi görünmüyor. Bununla birlikte, çözümünüz soru için iyi bir seçim değildir, çünkü OP'nin birden fazla IP'si vardır ve hepsini dinlemek istemeyebilir ve OP, sorudaki yapılandırma dosyasındaki bağlama bölümüne özel olarak atıfta bulunmuştur. Dolayısıyla, çözümünüz sorulan soruyu yanıtlamaz.
The Real Bill

2
Peki, soruyu tekrar okudum ve OP'nin bu 'bağlama' satırı için doğru yapılandırmayı ayarladığı benim için o kadar açık görünmedi. Ayrıca, davasına herhangi bir güvenlik duvarının dahil olup olmadığından da emin değilim. Neyse, kaba olduğunu düşünüyorsanız -1'imi kaldırabilirim. Cevabınızın tamamen konu dışı olduğunu ve çok yaygın bir sorunla buraya gelen kullanıcıların çoğunluğu için pek yararlı olmayacağını
öğrendim

1
OP, redis'e sistemdeki tüm adreslere bağlanmasını söyleyen yerel bağlama kuralını yorumladığını söyledi. -1'e kaba demezdim, sadece uygunsuz. OP, özellikle IPtables kurallarına sahip olduğunu belirtti, bu nedenle sorulan soruda güvenlik duvarı kuralları olduğu açıktır. Belirtilen bir güvenlik duvarının varlığı ve yapılandırmadaki yerel bağlantının kaldırılması göz önüne alındığında, yanıtınız sorulan soru için doğru veya alakalı değildir.
The Real Bill

Evet, haklısın, üzgünüm. Ben anadili İngilizce değilim ve "açıklama" fiilini yanlış yorumladım ... OP'nin yorumu "kaldırdığını" sanıyordum. (ne yazık ki, siz yayınınızı düzenleyene kadar
-1'imi kaldıramıyorum

Endişelenme, olur. İstediğiniz yerde çalıştığını doğrulamakla ilgili bazı açıklamalar ekledim. Umarım bu, gelecekteki okuyucular için bunu netleştirmeye yardımcı olur.
The Real Bill

328

Aynı sorunla sıkışıp kaldım ve önceki cevap bana yardımcı olmadı (iyi yazılmış olsa da).

Çözüm burada: kontrol edin /etc/redis/redis.confve varsayılanı değiştirdiğinizden emin olun

bind 127.0.0.1

için

bind 0.0.0.0

Ardından hizmetinizi yeniden başlatın ( service redis-server restart)

Artık redis'in yerel olmayan arayüzde dinlediğini kontrol edebilirsiniz.

redis-cli -h 192.168.x.x ping

(192.168.xx'i IP adresinizle değiştirin)

Önemli not: Birkaç kullanıcının belirttiği gibi, bunu İnternet'e açık bir sunucuda ayarlamak güvenli değildir . İhtiyaçlarınıza uyan herhangi bir yolla redis'in korunduğundan emin olmalısınız.


1
Burada da aynı şekilde, güvenlik duvarı ayarlarını veya ağ sorunlarını düşünmeden önce Redis sunucusundan uzak bağlantılara izin vermelisiniz. Teşekkürler Orabig
securecurve

Bu apaçık doğru cevaptır. Yukarıdakiler çok sayıda teknik sistem yöneticisi "karanlık sanat" mumbo jumbo'yu içeriyor ... ama hiç yardımcı olmuyor :)
Henley Chiu

7
Bu problem OP ile aynı değil. OP özellikle yapılandırma dosyasında gerekli değişiklikleri zaten yaptıklarını belirtti. OP yapılandırma dosyasında değişiklikler yaptığından ve siz de yaptınız. Hayır, bunlar iki ayrı konu. Verilen cevap, verilen soruna değindi. Tüm sorunları ele almak değildi. Sadece biri sordu. Bir şeyin yanlış olduğunu kabul etmekle ilgili değil, probleminizin farklı olduğunu fark etmekle ilgili. Sanki birinin arabasının çalışmayacağını ama içinde benzin olduğunu söylemesi ve siz onlara gaza ihtiyaçları olduğunu söylemeniz gibi.
The Real Bill

1
IPv4 ve IPv6 çift yığınını nasıl belirleyeceğinizi de biliyor musunuz? Aşağıdaki çalıştı: bind 0, ::, bind 0, [::], bind 0\nbind6 ::ve (\ n yeni satır olduğu) bind 0 [::]ama işler bir sahip olmadığını tek şey bindhiç config çizgi. Varsayılan olarak 0 (veya 0.0.0.0/0) ve [::] 'yi dinlemeye ayarlıdır, bu nedenle sorun yoktur, ancak bir kez ihtiyacım olursa uygun yöntemi bilmek istiyorum. Görünüşe göre hiçbir yerde belgelenmemiş.
Luc

7
Bu cevabın yaptığı şey, Redis sunucunuzu dünya için erişilebilir kılmaktır. Bu büyük bir güvenlik riski. Bunu yaparsanız, Redis sunucunuzu Redis'e bir AUTH parolası eklemek ve iptablesyetkisiz istemcileri engellemek için güvenlik duvarınızı yapılandırmak (örn. ) Gibi başka yollarla kilitlediğinizden emin olun .
sffc

14

Orabîg'in ​​verdiği mükemmel cevaba ek olarak:

Ben kaldırarak bu sorunu çözmüş bindtamamen bölümü ve ayar protected-modeiçin no.

#bind 127.0.0.1
protected-mode no

Bu yöntemi asla herkese açık sunucularda kullanmayın.


1
Güvenli olmayan yöntemi kullananlar için: Lütfen Redis Sunucunuzu Koruyun !! yoksa tüm dosyalarınızı kaybedersiniz :( Redis Sunucusunun güvenliğini sağlamadığım için sunucum tehlikeye girdi. Saldırgan benden bir miktar para ödememi
MonkimoE

4

Orabig haklı.

10.0.2.15'i Ubuntu'da (VirtualBox) bağlayabilir ve ardından bir bağlantı noktası yönlendirme yapabilirsiniz. ana bilgisayardan konuk Ubuntu'ya .

/etc/redis/redis.conf içinde

bind 10.0.2.15

sonra, redis'i yeniden başlatın:

sudo systemctl restart redis

Çalışacak!


4

Birkaç gün boyunca Redis ile uzaktan bağlantı kurmakta zorlanıyordum. Sonunda başardım. Bağlanmak için bir araya getirdiğim tam kontrol listesi burada. Yukarıdaki cevaplarda bazı çözümler verilmiştir. Yine de cevabımın konuyla ilgili bir nano-wiki olmasını istedim :) Ben de bazı yararlı bağlantılar ekledim.

Redis yerel olarak çalışıyorsa:

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

Parola ayarlanmamışsa

/etc/redis/redis.confYapılandırmaya bakın (bu, Ubuntu 18.04 için varsayılan konumdur, farklı bir konumda olabilir):

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

Korumalı mod yapılandırmada 'hayır' olarak ayarlanmışsa:

# The following line should be uncommented
protected-mode no

IP bağlama internetten erişim için yapılandırmada açıksa:

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

Linux güvenlik duvarı bağlantılara izin veriyorsa

(Ubuntu 18.04 için burada) Gelen internet trafiğinin bağlantı noktasına gitmesine izin verdiğini kontrol edin 6379(Redis varsayılan bağlantı noktası)

# 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

Redis hizmetini yeniden başlatın

Değişikliklerin etkili olması ve çalıştığını görmek için Redis hizmetini yeniden başlatmayı unutmayın:

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

Uzak sunucu olarak çalışıp çalışmadığını kontrol edin

komut satırınızdan redis-cliRedis sunucusu uzak sunucudaymış gibi kullanın:

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

Redis sunucunuza, uzak bir sunucu olarak bağlı internet sunucunuz aracılığıyla, uzak Redis bağlantısının çalıştığından daha fazla ping-PONG yapabiliyorsanız.

Güvenlik uyarısı

Yukarıdakilerin tümü, Redis verilerinizin internetteki herkese tamamen açık olmasını sağlar.

Redis yapılandırmasında temel olarak Redis kullanımını requirepassve protected-mode yesayarlarını güvence altına almak (yukarıya bakın) ve tehlikeli Redis komutlarını engellemek (yukarıdaki bağlantıya bakın), daha derin bir anlayış için bu makaleye ve Redis site güvenliği bölümüne bakın ).

Kullanışlı bağlantılar

Yardımına bazı bağlantılar kurmak ve Ubuntu 18.04 üzerinde REDIS güvenliğini sağlama ve kurulum Ubuntu 18.04 firewall nasıl .

Umarım yardımcı olur.


2
  • Eğer REDIS kendini indirilen eğer (değil apt-get REDIS-sunucu yüklemek) emin başlangıç REDIS yapmak, yukarıdaki önerilerle redis.conf düzenlenmiş ve daha sonra birlikte şöyle yapılandırma:./src/redis-server redis.conf

    • ayrıca yan not, pencerelerdeyseniz ve bir sanal kutu vm'ye bağlanıyorsanız, redis'e bağlanmak için sanal kutu ayarının bir ekran görüntüsünü ekliyorum.

görüntü açıklamasını buraya girin


0

Sunucunun redis yapılandırmasında tcp-keepalive'ı 60'a (0'a ayarlandı) ayarlamak bu sorunu çözmeme yardımcı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.