Redis - เชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล


122

ฉันเพิ่งติดตั้ง Redis สำเร็จโดยใช้คำแนะนำในคู่มือเริ่มต้นใช้งานฉบับย่อบนhttp://redis.io/topics/quickstartบนเซิร์ฟเวอร์ Ubuntu 10.10 ของฉัน ฉันใช้บริการในชื่อ dameon (ดังนั้นจึงสามารถเรียกใช้โดย init.d)

เซิร์ฟเวอร์เป็นส่วนหนึ่งของ Rackspace Cluster ที่มี IP ภายในและภายนอก โฮสต์กำลังทำงานบนพอร์ต 6379 (มาตรฐานสำหรับ Redis)

ฉันได้เพิ่มแถวใน iptables เพื่ออนุญาตการเชื่อมต่อขาเข้าจากพอร์ต 6379 ดังที่แสดงด้านล่าง:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

ในโค้ด PHP ของฉันบนเซิร์ฟเวอร์อื่นฉันกำลังพยายามเชื่อมต่อกับเซิร์ฟเวอร์ Redis ใหม่ที่นี่:

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

$hostname = "IP ADDRESS HERE";

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

เมื่อฉันทำสิ่งนี้ - ฉันมักจะถูกปฏิเสธการเชื่อมต่อเสมอ ในไฟล์ redis.conf ของฉันฉันมีคำสั่งผูกโลคัลคอมเมนต์ดังนั้นควรรับฟังมากกว่า IP ของ localhost ฉันสามารถเชื่อมต่อกับฐานข้อมูลบนเครื่องท้องถิ่นได้ แต่ไม่ใช่บนเซิร์ฟเวอร์อื่น ฉันได้ลองใช้ IP ภายนอกและภายในโดยไม่มีโชค

ข้อเสนอแนะเกี่ยวกับการทำให้สิ่งนี้ใช้งานได้หรือไม่?


คุณสามารถเชื่อมต่อโดยใช้เครื่องมือบรรทัดคำสั่ง Redis ได้หรือไม่? redis-cli -h hostname
jlundqvist

เซิร์ฟเวอร์ Fault มีคำถามที่บัญญัติเกี่ยวกับการปฏิเสธการเชื่อมต่อ
Raedwald

คำตอบ:


129

ก่อนอื่นฉันจะตรวจสอบเพื่อยืนยันว่ากำลังรับฟัง IP ที่คุณคาดว่าจะเป็น:

netstat -nlpt | grep 6379

ขึ้นอยู่กับว่าคุณเริ่ม / หยุดอย่างไรคุณอาจไม่ได้รีสตาร์ทอินสแตนซ์จริงๆเมื่อคุณคิดว่าคุณมี netstat จะบอกคุณว่าฟังอยู่ในที่ที่คุณคิดว่ามันอยู่หรือไม่ ถ้าไม่ให้รีสตาร์ทและตรวจสอบให้แน่ใจว่ารีสตาร์ท หากรีสตาร์ทและยังไม่ฟังในที่ที่คุณคาดหวังให้ตรวจสอบไฟล์กำหนดค่าของคุณเพื่อให้แน่ใจ

หลังจากสร้างแล้วจะฟังในที่ที่คุณคาดหวังจากโหนดระยะไกลที่ควรเข้าถึงได้ลอง:

redis-cli -h REMOTE.HOST ping

นอกจากนี้คุณยังสามารถลองใช้จากโฮสต์ภายในเครื่องได้ แต่ใช้ IP ที่คุณคาดว่าจะรับฟังแทนชื่อโฮสต์หรือ localhost คุณควรเห็น PONG ในการตอบสนองในทั้งสองกรณี

หากไม่เป็นเช่นนั้นไฟร์วอลล์ของคุณกำลัง / กำลังบล็อกคุณ นี่อาจเป็น IPTables ในเครื่องหรืออาจเป็นไฟร์วอลล์ที่อยู่ระหว่างโหนด คุณสามารถเพิ่มคำสั่งการบันทึกในการกำหนดค่า IPtables ของคุณเพื่อบันทึกการเชื่อมต่อผ่าน 6379 เพื่อดูว่าเกิดอะไรขึ้น นอกจากนี้การลองใช้ ping จาก local และ non-local ไปยัง IP เดียวกันควรเป็นภาพประกอบ หากตอบสนองภายในเครื่อง แต่ไม่ใช่จากระยะไกลฉันจะพึ่งพาไฟร์วอลล์ที่แทรกแซงขึ้นอยู่กับความซับซ้อนของกฎตาราง IP บนโหนดของคุณ


16
ดังนั้นเพื่อความชัดเจนคุณกำลังลงคะแนนคำตอบสำหรับปัญหาที่โพสต์เนื่องจากคุณมีปัญหาที่เกี่ยวข้อง (แต่ไม่เหมือนกันอย่างชัดเจน) ที่มันไม่ได้อยู่? ในขณะที่ฉันเห็นด้วยกับการโพสต์วิธีแก้ปัญหาของคุณการลงคะแนนคำตอบที่ถูกต้องเนื่องจากปัญหาของคุณแตกต่างกันดูเหมือนจะไม่ใช่สิ่งที่ควรทำ ที่กล่าวว่าโซลูชันของคุณไม่ใช่ทางเลือกที่ดีสำหรับคำถามเนื่องจาก OP มีหลาย IP และอาจไม่ต้องการฟังทั้งหมดและ OP อ้างถึงส่วนการโยงโดยเฉพาะในไฟล์กำหนดค่าในคำถาม ดังนั้นวิธีแก้ปัญหาของคุณจึงไม่สามารถตอบคำถามที่ถามได้
บิลตัวจริง

2
ฉันอ่านคำถามอีกครั้งและดูเหมือนจะไม่ชัดเจนสำหรับฉันที่ OP ตั้งค่าคอนฟิกที่ถูกต้องสำหรับบรรทัด 'การผูก' นี้ นอกจากนี้ฉันไม่แน่ใจว่าไฟร์วอลล์ใด ๆ ที่เกี่ยวข้องกับกรณีของเขา อย่างไรก็ตามฉันสามารถลบ -1 ของฉันได้ถ้าคุณคิดว่ามันหยาบคาย ฉันเพิ่งพบว่าคำตอบของคุณไม่ตรงประเด็นโดยสิ้นเชิงและมันจะไม่เป็นประโยชน์สำหรับผู้ใช้ส่วนใหญ่ที่มาที่นี่พร้อมกับปัญหาที่พบบ่อยมาก ... (พารามิเตอร์การเชื่อมโยงเริ่มต้น)
Orabîg

1
OP บอกว่าเขาแสดงความคิดเห็นเกี่ยวกับกฎการผูกภายในซึ่งบอกให้ redis ผูกกับที่อยู่ทั้งหมดในระบบ ฉันจะไม่เรียก -1 หยาบคายไม่เหมาะสม OP ระบุโดยเฉพาะว่าเขามีกฎของ IPtables ดังนั้นจึงเป็นที่ชัดเจนว่ามีกฎไฟร์วอลล์อยู่ในคำถามที่ถาม เนื่องจากการมีไฟร์วอลล์ที่ระบุไว้และการลบการเชื่อมโยงภายในเครื่องในการกำหนดค่าคำตอบของคุณจึงไม่ถูกต้องหรือเกี่ยวข้องกับคำถามที่ถาม
บิลตัวจริง

ใช่คุณพูดถูกขอโทษ ฉันไม่ใช่คนอังกฤษ แต่กำเนิดและตีความคำกริยา "comment out" ผิด ... ฉันคิดว่า OP "ลบ" ความคิดเห็นนั้นแล้ว (น่าเสียดายที่ฉันไม่สามารถลบ -1 ของฉันได้จนกว่าคุณจะแก้ไขโพสต์ของคุณ)
Orabîg

ไม่ต้องกังวลมันจะเกิดขึ้น ฉันได้เพิ่มคำชี้แจงบางอย่างเกี่ยวกับการตรวจสอบความถูกต้องว่ากำลังทำงานในที่ที่คุณต้องการ หวังว่าจะช่วยให้ความกระจ่างสำหรับผู้อ่านในอนาคต
บิลตัวจริง

328

ฉันติดอยู่กับปัญหาเดิมและคำตอบก่อนหน้านี้ไม่ได้ช่วยฉัน (แม้ว่าจะเขียนได้ดี)

วิธีแก้ปัญหาอยู่ที่นี่: ตรวจสอบของคุณ/etc/redis/redis.confและตรวจสอบให้แน่ใจว่าได้เปลี่ยนค่าเริ่มต้น

bind 127.0.0.1

ถึง

bind 0.0.0.0

จากนั้นเริ่มบริการของคุณใหม่ ( service redis-server restart)

จากนั้นคุณสามารถตรวจสอบได้ว่า redis กำลังฟังอยู่บนอินเทอร์เฟซที่ไม่ใช่โลคัลด้วย

redis-cli -h 192.168.x.x ping

(แทนที่ 192.168.xx ด้วยที่อยู่ IP ของคุณ)

หมายเหตุสำคัญ:ในฐานะผู้ใช้หลายคนกล่าวว่ามันเป็นสิ่งที่ไม่ปลอดภัยในการตั้งค่านี้บนเซิร์ฟเวอร์ที่มีการสัมผัสกับอินเทอร์เน็ต คุณควรแน่ใจว่า redis ของคุณได้รับการปกป้องด้วยวิธีการใด ๆ ที่เหมาะกับความต้องการของคุณ


1
เช่นเดียวกันที่นี่คุณควรอนุญาตการเชื่อมต่อระยะไกลจากเซิร์ฟเวอร์ Redis ในตอนแรกก่อนที่จะคิดถึงการตั้งค่าไฟร์วอลล์หรือปัญหาเครือข่าย ขอบคุณ Orabig
securecurve

นี่คือคำตอบที่ถูกต้องชัดเจน ข้างบนนี้มีผู้ดูแลระบบทางเทคนิคจำนวนมาก "ศาสตร์มืด" จัมโบ้ ... แต่มันไม่เป็นประโยชน์เลย :)
Henley Chiu

7
ปัญหานี้ไม่เหมือนกับ OP OP ระบุโดยเฉพาะว่าได้ทำการเปลี่ยนแปลงไฟล์ config ที่จำเป็นแล้ว เนื่องจาก OP ทำการเปลี่ยนแปลงกับไฟล์ config และคุณทำ ไม่เป็นสองประเด็นที่แยกจากกัน คำตอบที่ได้กล่าวถึงปัญหาที่ให้ไว้ ไม่ใช่เพื่อแก้ไขปัญหาทั้งหมด แค่คนที่ถาม ไม่ได้เกี่ยวกับการยอมรับว่าสิ่งใดผิด แต่เป็นการตระหนักว่าปัญหาของคุณแตกต่างกัน เหมือนมีคนบอกว่ารถสตาร์ทไม่ติด แต่มีแก๊สอยู่และคุณบอกว่าต้องใช้แก๊ส
บิลตัวจริง

1
คุณจะทราบวิธีระบุ IPv4 และ IPv6 dual-stack หรือไม่? ฉันพยายามต่อไปนี้: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(ที่ \ n คือการขึ้นบรรทัดใหม่) และbind 0 [::]แต่สิ่งเดียวที่ผลงานไม่ได้มีbindสายในการตั้งค่าที่ทุกคน ค่าเริ่มต้นคือการฟังที่ 0 (หรือ 0.0.0.0/0) และ [::] ดังนั้นจึงไม่มีปัญหา แต่ฉันต้องการทราบวิธีการที่เหมาะสมที่ฉันควรใช้สักครั้ง ดูเหมือนจะไม่มีการบันทึกไว้ที่ใด
Luc

7
คำตอบนี้ทำให้เซิร์ฟเวอร์ Redis ของคุณสามารถเข้าถึงได้ทั่วโลก นั่นเป็นความเสี่ยงด้านความปลอดภัยที่ยิ่งใหญ่ หากคุณทำเช่นนี้ตรวจสอบให้แน่ใจว่าคุณล็อกเซิร์ฟเวอร์ Redis ของคุณด้วยวิธีอื่นเช่นเพิ่มรหัสผ่าน AUTH ใน Redisและกำหนดค่าไฟร์วอลล์ของคุณ (เช่นiptables) เพื่อบล็อกไคลเอ็นต์ที่ไม่ได้รับอนุญาต
sffc

14

นอกจากคำตอบที่ยอดเยี่ยมจากOrabîgแล้ว:

ฉันได้รับการแก้ไขปัญหานี้โดยการเอาbindส่วนทั้งหมดและการตั้งค่าไปprotected-modeno

#bind 127.0.0.1
protected-mode no

อย่าใช้วิธีนี้กับเซิร์ฟเวอร์ที่เปิดเผยต่อสาธารณะ


1
สำหรับใครก็ตามที่ใช้วิธีที่ไม่ปลอดภัย: โปรดปกป้องเซิร์ฟเวอร์ Redis ของคุณ !! มิฉะนั้นคุณจะสูญเสียไฟล์ทั้งหมดของคุณ :( เซิร์ฟเวอร์ของฉันถูกบุกรุกเนื่องจากฉันไม่ได้รับการรักษาความปลอดภัยเซิร์ฟเวอร์ Redis ผู้โจมตีต้องการให้ฉันจ่ายเงินจำนวนหนึ่ง (มากพอสำหรับฉัน) ผู้โจมตีจะเป็นเช่นนี้: duo.com/ บล็อก / …
MonkimoE

4

Orabig ถูกต้อง

คุณสามารถผูก 10.0.2.15 ในUbuntu (VirtualBox)จากนั้นทำการส่งต่อพอร์ตจากโฮสต์ไปยังแขก Ubuntu

ใน /etc/redis/redis.conf

bind 10.0.2.15

จากนั้นรีสตาร์ท redis:

sudo systemctl restart redis

มันจะได้ผล!


4

ฉันกำลังดิ้นรนกับการเชื่อมต่อระยะไกลกับ Redis อยู่หลายวัน ในที่สุดฉันก็ทำสำเร็จ นี่คือรายการตรวจสอบทั้งหมดที่ฉันรวบรวมเพื่อติดตามเพื่อเชื่อมต่อ คำตอบบางส่วนมีให้ในคำตอบด้านบน แต่ฉันต้องการให้คำตอบของฉันเป็นนาโนวิกิในหัวข้อนี้ :) ฉันได้เพิ่มลิงก์ที่มีประโยชน์ด้วย

หาก redis ทำงานในเครื่อง:

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

หากไม่ได้ตั้งรหัสผ่าน

ดู/etc/redis/redis.confconfig (นี่คือตำแหน่งเริ่มต้นสำหรับ Ubuntu 18.04 คุณอาจมีอยู่ในตำแหน่งอื่น):

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

หากโหมดป้องกันถูกตั้งค่าเป็น 'ไม่' ในการกำหนดค่า:

# The following line should be uncommented
protected-mode no

หากการผูก IP เปิดสำหรับการเข้าถึงจากอินเทอร์เน็ตในการกำหนดค่า:

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

หากไฟร์วอลล์ Linux อนุญาตการเชื่อมต่อ

(ที่นี่สำหรับ Ubuntu 18.04) ตรวจสอบว่าอนุญาตให้ทราฟฟิกอินเทอร์เน็ตขาเข้าไปที่พอร์ต6379(พอร์ตเริ่มต้น 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

เริ่มบริการ Redis ใหม่

อย่าลืมเริ่มบริการ Redis ใหม่เพื่อให้การเปลี่ยนแปลงมีผลและเห็นว่ากำลังทำงานอยู่:

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

ตรวจสอบว่าทำงานเป็นเซิร์ฟเวอร์ระยะไกลหรือไม่

จากบรรทัดคำสั่งของคุณใช้redis-cliราวกับว่าเซิร์ฟเวอร์ Redis อยู่บนเซิร์ฟเวอร์ระยะไกล:

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

หากคุณสามารถ ping-PONG เซิร์ฟเวอร์ Redis ของคุณผ่านเซิร์ฟเวอร์อินเทอร์เน็ตที่เชื่อมต่อเป็นเซิร์ฟเวอร์ระยะไกลเกินกว่าที่การเชื่อมต่อ Redis ระยะไกลจะทำงานได้

คำเตือนด้านความปลอดภัย

ทั้งหมดที่กล่าวมาทำให้ข้อมูล Redis ของคุณเปิดกว้างสำหรับทุกคนจากอินเทอร์เน็ต

ในการรักษาความปลอดภัยการใช้งานrequirepassและprotected-mode yesการตั้งค่า Redis โดยทั่วไปใน Redis config (ดูด้านบน) และบล็อกคำสั่ง Redis ที่เป็นอันตราย (ดูลิงก์ด้านบน) สำหรับความเข้าใจที่ลึกซึ้งยิ่งขึ้นโปรดดูบทความนี้และส่วนความปลอดภัยของไซต์ Redis )

ลิงค์ที่เป็นประโยชน์

การเชื่อมโยงที่จะช่วยให้วิธีการติดตั้งและการรักษาความปลอดภัย Redis บน Ubuntu 18.04และวิธีการติดตั้ง Ubuntu 18.04 ไฟร์วอลล์

หวังว่าจะช่วยได้


2
  • หากคุณดาวน์โหลด redis ด้วยตัวเอง (ไม่ใช่ apt-get install redis-server) จากนั้นแก้ไข redis.conf ด้วยคำแนะนำข้างต้นตรวจสอบให้แน่ใจว่าคุณเริ่ม redis ด้วย config ดังนี้:./src/redis-server redis.conf

    • หมายเหตุด้านข้างฉันกำลังรวมภาพหน้าจอของการตั้งค่ากล่องเสมือนเพื่อเชื่อมต่อกับ redis หากคุณใช้ windows และเชื่อมต่อกับ virtualbox vm

ใส่คำอธิบายภาพที่นี่


0

การตั้งค่า tcp-keepalive เป็น 60 (ตั้งค่าเป็น 0) ในการกำหนดค่า redis ของเซิร์ฟเวอร์ช่วยฉันแก้ไขปัญหานี้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.