Redis - Hubungkan ke Server Jarak Jauh


122

Saya baru saja menginstal Redis dengan sukses menggunakan petunjuk pada panduan Mulai Cepat di http://redis.io/topics/quickstart di server Ubuntu 10.10 saya. Saya menjalankan layanan sebagai dameon (sehingga dapat dijalankan oleh init.d)

Server adalah bagian dari Rackspace Cluster dengan IP Internal dan Eksternal. Host berjalan pada port 6379 (standar untuk Redis)

Saya telah menambahkan baris di iptables untuk mengizinkan koneksi masuk dari port 6379 seperti yang ditunjukkan di bawah ini:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

Dalam kode PHP saya di server lain, saya mencoba menyambung ke server Redis baru di sini:

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

$hostname = "IP ADDRESS HERE";

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

Setelah saya melakukan ini - saya selalu mendapatkan koneksi ditolak. Di file redis.conf saya, saya memiliki perintah bind lokal yang dikomentari, jadi itu harus mendengarkan lebih dari IP localhost. Saya dapat terhubung ke database di mesin lokal tidak hanya di server lain. Saya sudah mencoba IP eksternal dan internal tidak berhasil.

Ada saran untuk membuat ini bekerja?


Apakah Anda dapat terhubung menggunakan alat baris perintah Redis? redis-cli -h hostname
jlundqvist

Kesalahan Server memiliki pertanyaan kanonik tentang Sambungan Ditolak .
Raedwald

Jawaban:


129

Pertama saya akan memeriksa untuk memverifikasi itu mendengarkan pada IP yang Anda harapkan:

netstat -nlpt | grep 6379

Bergantung pada bagaimana Anda memulai / menghentikan, Anda mungkin tidak benar-benar memulai ulang instans saat Anda mengira telah melakukannya. Netstat akan memberi tahu Anda jika ia mendengarkan di tempat yang Anda pikirkan. Jika tidak, restart dan pastikan restart. Jika restart dan masih tidak mendengarkan seperti yang Anda harapkan, periksa file konfigurasi Anda hanya untuk memastikan.

Setelah menetapkan itu mendengarkan di mana Anda mengharapkannya, dari node jarak jauh yang seharusnya memiliki akses coba:

redis-cli -h REMOTE.HOST ping

Anda juga dapat mencobanya dari host lokal tetapi gunakan IP yang Anda harapkan untuk didengarkan daripada nama host atau host lokal. Anda seharusnya melihatnya sebagai tanggapan PONG dalam kedua kasus tersebut.

Jika tidak, firewall Anda sedang / memblokir Anda. Ini bisa berupa IPTables lokal atau mungkin firewall di antara node. Anda dapat menambahkan pernyataan pencatatan ke konfigurasi IPtables Anda untuk mencatat koneksi melalui 6379 untuk melihat apa yang terjadi. Selain itu, mencoba me-redis ping dari lokal dan non-lokal ke IP yang sama harus memberikan gambaran. Jika merespons secara lokal tetapi tidak dari jarak jauh, saya akan condong ke firewall intervensi tergantung pada kompleksitas aturan Tabel IP on-node Anda.


16
JADI, untuk memperjelas, Anda merendahkan jawaban atas masalah yang diposting karena Anda memiliki masalah terkait (tetapi jelas tidak identik) yang tidak diatasi? Sementara saya setuju dengan memposting solusi Anda, downvoting jawaban yang benar karena masalah Anda berbeda tampaknya bukan hal yang tepat untuk dilakukan. Meskipun demikian, solusi Anda bukanlah pilihan yang baik untuk pertanyaan tersebut karena OP memiliki banyak IP dan mungkin tidak ingin mendengarkan semuanya, dan OP secara khusus mereferensikan bagian bind di file konfigurasi dalam pertanyaan. Jadi solusi Anda tidak menjawab pertanyaan yang diajukan.
The Real Bill

2
Yah, saya membaca pertanyaan itu lagi, dan tampaknya tidak begitu jelas bagi saya bahwa OP memang mengatur conf yang benar untuk baris 'bind' ini. Juga, saya tidak yakin ada firewall yang terlibat dalam kasusnya. Bagaimanapun, saya bisa menghapus -1 saya jika menurut Anda itu tidak sopan. Saya baru saja menemukan bahwa jawaban Anda benar-benar di luar topik, dan itu tidak akan terlalu membantu bagi sebagian besar pengguna yang datang ke sini dengan masalah yang sangat umum ... (parameter default bind)
Orabîg

1
OP mengatakan bahwa dia mengomentari aturan pengikatan lokal, yang memberi tahu redis untuk mengikat ke semua alamat di sistem. Saya tidak akan menyebut -1 kasar, hanya tidak pantas. OP secara khusus menyatakan bahwa dia memiliki aturan IPtables, sehingga jelas ada aturan firewall dalam pertanyaan yang diajukan. Mengingat keberadaan firewall yang dinyatakan dan penghapusan pengikatan lokal di konfigurasi, jawaban Anda tidak benar atau relevan untuk pertanyaan yang diajukan.
The Real Bill

Ya, Anda benar, maaf. Saya bukan penutur asli bahasa Inggris, dan salah menafsirkan kata kerja "komentar keluar" ... Saya pikir OP telah "menghapus" komentar tersebut. (sayangnya, saya tidak dapat menghapus -1 saya, sampai Anda mengedit posting Anda)
Orabîg

Jangan khawatir, itu terjadi. Saya telah menambahkan beberapa klarifikasi tentang memvalidasinya berjalan di tempat yang Anda inginkan. Harapan yang membantu memperjelasnya untuk pembaca selanjutnya.
The Real Bill

328

Saya telah terjebak dengan masalah yang sama, dan jawaban sebelumnya tidak membantu saya (meskipun ditulis dengan baik).

Solusinya ada di sini: periksa Anda /etc/redis/redis.conf, dan pastikan untuk mengubah default

bind 127.0.0.1

untuk

bind 0.0.0.0

Kemudian restart layanan Anda ( service redis-server restart)

Sekarang Anda dapat memeriksa apakah redis sedang mendengarkan di antarmuka non-lokal dengan

redis-cli -h 192.168.x.x ping

(ganti 192.168.xx dengan alamat IP Anda)

Catatan penting: seperti yang dinyatakan beberapa pengguna, tidak aman untuk menyetel ini di server yang terpapar ke Internet. Anda harus yakin bahwa redis dilindungi dengan cara apa pun yang sesuai dengan kebutuhan Anda.


1
Sama di sini, Anda harus mengizinkan koneksi jarak jauh dari server Redis terlebih dahulu sebelum memikirkan pengaturan firewall atau masalah jaringan. Terima kasih Orabig
securecurve

Ini adalah jawaban yang benar dan jelas. Yang di atas memiliki banyak sysadmin teknis "seni gelap" omong kosong ... tapi itu tidak membantu sama sekali :)
Henley Chiu

7
Masalah ini tidak sama dengan OP. OP secara khusus menyatakan bahwa mereka telah melakukan perubahan pada file konfigurasi yang diperlukan. Karena OP membuat perubahan pada file konfigurasi dan Anda melakukannya. Tidak, mereka adalah dua masalah yang berbeda. Jawaban yang diberikan menjawab masalah yang diberikan. Itu tidak untuk mengatasi semua masalah. Hanya satu yang bertanya. Ini bukan tentang mengakui ada yang salah, ini tentang menyadari masalah Anda berbeda. Ini seperti seseorang mengatakan bahwa mobil mereka tidak mau hidup tetapi ada bensin di dalamnya, dan Anda memberi tahu mereka bahwa mereka perlu bensin.
The Real Bill

1
Apakah Anda juga tahu cara menentukan tumpukan ganda IPv4 dan IPv6? Saya mencoba yang berikut ini: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(di mana \ n adalah baris baru) dan bind 0 [::]tetapi satu-satunya yang bekerja tidak memiliki bindgaris di konfigurasi sama sekali. Secara default mendengarkan pada 0 (atau 0.0.0.0/0) dan [::] jadi tidak ada masalah, tapi saya ingin tahu metode yang tepat jika saya membutuhkannya. Tampaknya tidak didokumentasikan di mana pun.
Luc

7
Apa yang dilakukan jawaban ini adalah membuat server Redis Anda dapat diakses oleh dunia. Itu risiko keamanan yang besar. Jika Anda melakukan ini, pastikan Anda mengunci server Redis Anda dengan cara lain, seperti menambahkan kata sandi AUTH di Redis dan mengkonfigurasi firewall Anda (misalnya iptables) untuk memblokir klien yang tidak sah.
sffc

14

Selain jawaban luar biasa yang diberikan oleh Orabîg:

Saya menyelesaikan masalah ini dengan menghapus seluruh bindbagian dan mengatur protected-modeke no.

#bind 127.0.0.1
protected-mode no

Jangan pernah menggunakan metode ini di server yang terbuka secara publik.


1
Kepada siapa pun yang menggunakan metode tidak aman: Harap Lindungi Server Redis Anda !! atau Anda akan kehilangan semua file Anda :( Server saya telah disusupi karena saya tidak mengamankan Server Redis. Penyerang ingin saya membayar sejumlah uang (cukup besar untuk saya). Penyerang melakukan sesuatu seperti ini: duo.com/ blog /…
MonkimoE

4

Orabig benar.

Anda dapat mengikat 10.0.2.15 di Ubuntu (VirtualBox) kemudian melakukan penerusan port dari host ke guest Ubuntu.

di /etc/redis/redis.conf

bind 10.0.2.15

lalu, mulai ulang redis:

sudo systemctl restart redis

Ini akan berhasil!


4

Saya kesulitan dengan koneksi jarak jauh ke Redis selama beberapa hari. Akhirnya saya berhasil. Berikut adalah daftar lengkap yang saya kumpulkan untuk diikuti agar dapat terhubung. Beberapa solusi diberikan dalam jawaban di atas. Namun saya ingin jawaban saya menjadi nano-wiki tentang subjek tersebut :) Saya juga menambahkan beberapa tautan yang berguna.

Jika redis bekerja secara lokal:

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

Jika kata sandi tidak disetel

Lihat /etc/redis/redis.confconfig (ini adalah lokasi default untuk Ubuntu 18.04, Anda mungkin memilikinya di lokasi yang berbeda):

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

Jika mode terproteksi disetel ke 'no' dalam konfigurasi:

# The following line should be uncommented
protected-mode no

jika pengikatan IP terbuka untuk akses dari internet di konfigurasi:

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

Jika firewall Linux memungkinkan koneksi

(di sini untuk Ubuntu 18.04) Periksa ini memungkinkan lalu lintas internet masuk untuk pergi ke port 6379(port default 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

Mulai ulang layanan Redis

Jangan lupa untuk me-restart layanan Redis agar perubahan diterapkan dan melihatnya sedang berjalan:

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

Periksa apakah itu berfungsi sebagai server jarak jauh

dari baris perintah Anda, gunakan redis-cliseolah-olah server Redis berada di server jarak jauh:

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

Jika Anda dapat melakukan ping-PONG server Redis Anda melalui server internet yang terhubung sebagai server jarak jauh daripada koneksi Redis jarak jauh berfungsi.

Peringatan keamanan

Semua hal di atas membuat data Redis Anda terbuka sepenuhnya untuk siapa saja dari internet.

Untuk pada dasarnya mengamankan penggunaan requirepassdan protected-mode yespengaturan Redis di konfigurasi Redis (lihat di atas) dan memblokir perintah Redis yang berbahaya (lihat tautan di atas), untuk pemahaman yang lebih dalam, lihat artikel ini dan bagian keamanan situs Redis ).

Link yang berguna

Beberapa tautan untuk membantu Cara menginstal dan mengamankan Redis di Ubuntu 18.04 dan cara mengatur firewall Ubuntu 18.04 .

Semoga membantu.


2
  • jika Anda mengunduh redis sendiri (bukan apt-get install redis-server) dan kemudian mengedit redis.conf dengan saran di atas, pastikan Anda memulai redis dengan konfigurasi seperti ini:./src/redis-server redis.conf

    • juga catatan samping saya termasuk tangkapan layar dari pengaturan kotak virtual untuk terhubung ke redis, jika Anda menggunakan windows dan menghubungkan ke virtualbox vm.

masukkan deskripsi gambar di sini


0

Mengatur tcp-keepalive ke 60 (itu diatur ke 0) dalam konfigurasi redis server membantu saya menyelesaikan masalah ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.