Redis - Kết nối với Máy chủ Từ xa


122

Tôi vừa cài đặt thành công Redis bằng cách sử dụng các hướng dẫn trong Hướng dẫn Bắt đầu Nhanh trên http://redis.io/topics/quickstart trên máy chủ Ubuntu 10.10 của tôi. Tôi đang chạy dịch vụ dưới dạng dameon (vì vậy nó có thể được chạy bởi init.d)

Máy chủ là một phần của Rackspace Cluster với IP bên trong và bên ngoài. Máy chủ đang chạy trên cổng 6379 (tiêu chuẩn cho Redis)

Tôi đã thêm một hàng trong iptables để cho phép các kết nối đến từ cổng 6379 như hình dưới đây:

 ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:6379 

Trong mã PHP của tôi trên một máy chủ khác, tôi đang cố kết nối với máy chủ Redis mới tại đây:

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

$hostname = "IP ADDRESS HERE";

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

Một khi tôi làm điều này - tôi luôn nhận được một kết nối bị từ chối. Trong tệp redis.conf của tôi, tôi có nhận xét lệnh liên kết cục bộ, vì vậy nó sẽ lắng nghe nhiều hơn IP localhost. Tôi có thể kết nối với cơ sở dữ liệu trên máy cục bộ chứ không phải trên máy chủ khác. Tôi đã thử các IP bên ngoài và bên trong nhưng không thành công.

Bất kỳ đề xuất về việc này để làm việc?


Bạn có thể kết nối bằng công cụ dòng lệnh Redis không? redis-cli -h hostname
jlundqvist 27/12/11

Lỗi máy chủ có một câu hỏi chính tắc về kết nối bị từ chối .
Raedwald

Câu trả lời:


129

Trước tiên, tôi sẽ kiểm tra để xác minh rằng nó đang lắng nghe trên các IP mà bạn mong đợi:

netstat -nlpt | grep 6379

Tùy thuộc vào cách bạn bắt đầu / dừng, bạn có thể đã không thực sự khởi động lại phiên bản khi bạn nghĩ rằng bạn đã có. Netstat sẽ cho bạn biết nếu nó đang nghe ở nơi bạn nghĩ. Nếu không, hãy khởi động lại nó và chắc chắn rằng nó sẽ khởi động lại. Nếu nó khởi động lại và vẫn không nghe như bạn mong đợi, hãy kiểm tra tệp cấu hình của bạn để chắc chắn.

Sau khi thiết lập, nó sẽ lắng nghe nơi bạn mong đợi, từ một nút từ xa có quyền truy cập, hãy thử:

redis-cli -h REMOTE.HOST ping

Bạn cũng có thể thử điều đó từ máy chủ cục bộ nhưng sử dụng IP mà bạn mong đợi nó sẽ lắng nghe thay vì tên máy chủ hoặc máy chủ cục bộ. Bạn sẽ thấy nó PONG trong cả hai trường hợp.

Nếu không, (các) tường lửa của bạn đang / đang chặn bạn. Đây sẽ là IPTables cục bộ hoặc có thể là tường lửa ở giữa các nút. Bạn có thể thêm câu lệnh ghi nhật ký vào cấu hình IPtables của mình để ghi nhật ký các kết nối trên 6379 để xem điều gì đang xảy ra. Ngoài ra, việc thử ping từ cục bộ và không cục bộ đến cùng một IP sẽ mang tính minh họa. Nếu nó phản hồi cục bộ chứ không phản hồi từ xa, tôi sẽ nghiêng về một tường lửa can thiệp tùy thuộc vào mức độ phức tạp của các quy tắc Bảng IP trên nút của bạn.


16
VẬY, để rõ ràng, bạn đang từ chối một câu trả lời cho vấn đề đã đăng vì bạn có một vấn đề liên quan (nhưng rõ ràng không giống nhau) mà nó không giải quyết? Mặc dù tôi đồng ý với việc đăng giải pháp của bạn, nhưng từ chối một câu trả lời đúng bởi vì vấn đề của bạn khác với dường như không phải là điều thích hợp để làm. Điều đó nói rằng, giải pháp của bạn không phải là một lựa chọn tốt cho câu hỏi vì OP có nhiều IP và có thể không muốn lắng nghe tất cả chúng và OP đã tham chiếu cụ thể đến phần ràng buộc trong tệp cấu hình trong câu hỏi. Do đó, giải pháp của bạn không giải quyết được câu hỏi được hỏi.
The Real Bill

2
Chà, tôi đã đọc lại câu hỏi, và có vẻ như tôi không rõ ràng rằng OP đã đặt chính xác thông tin cho dòng 'bind' này. Ngoài ra, tôi không chắc rằng có tường lửa nào liên quan đến trường hợp của anh ấy không. Dù sao, tôi có thể xóa -1 của mình nếu bạn cho rằng điều đó là thô lỗ. Tôi chỉ thấy rằng câu trả lời của bạn hoàn toàn lạc đề và nó sẽ không hữu ích lắm cho phần lớn người dùng đến đây với một vấn đề rất phổ biến ... (tham số mặc định ràng buộc)
Orabîg

1
OP đã nói rằng ông đã nhận xét ra quy tắc ràng buộc cục bộ, quy tắc này yêu cầu redis liên kết với tất cả các địa chỉ trên hệ thống. Tôi sẽ không gọi -1 là thô lỗ, chỉ là không thích hợp. OP đã tuyên bố cụ thể rằng ông đã có các quy tắc IPtables, do đó rõ ràng là có các quy tắc tường lửa trong câu hỏi được hỏi. Với sự hiện diện đã nêu của tường lửa và việc xóa liên kết cục bộ trong cấu hình, câu trả lời của bạn không đúng hoặc không liên quan cho câu hỏi được hỏi.
The Real Bill

Đúng, bạn nói đúng, xin lỗi. Tôi không phải là người bản xứ tiếng Anh, và đã diễn giải sai động từ "comment out" ... Tôi nghĩ rằng OP đã "xóa" nhận xét. (tiếc là, tôi không thể loại bỏ tôi -1, cho đến khi bạn chỉnh sửa bài viết của bạn)
Orabîg

Không phải lo lắng, nó sẽ xảy ra. Tôi đã thêm một số giải thích rõ ràng về việc xác thực nó đang chạy ở nơi bạn muốn. Hy vọng rằng sẽ giúp làm rõ nó cho độc giả trong tương lai.
The Real Bill

328

Tôi đã bị mắc kẹt với cùng một vấn đề và câu trả lời trước đó không giúp được tôi (mặc dù được viết tốt).

Giải pháp là ở đây: kiểm tra của bạn /etc/redis/redis.confvà đảm bảo thay đổi giá trị mặc định

bind 127.0.0.1

đến

bind 0.0.0.0

Sau đó khởi động lại dịch vụ của bạn ( service redis-server restart)

Sau đó, bây giờ bạn có thể kiểm tra xem redis có đang lắng nghe trên giao diện không cục bộ với

redis-cli -h 192.168.x.x ping

(thay thế 192.168.xx bằng địa chỉ IP của bạn)

Lưu ý quan trọng: như một số người dùng đã nêu, không an toàn khi đặt điều này trên máy chủ được tiếp xúc với Internet. Bạn nên chắc chắn rằng bạn được bảo vệ bằng bất kỳ phương tiện nào phù hợp với nhu cầu của bạn.


1
Tương tự ở đây, bạn nên cho phép các kết nối từ xa từ máy chủ Redis trước khi nghĩ đến cài đặt tường lửa hoặc các vấn đề mạng. Cảm ơn Orabig
securecurve

Đây là câu trả lời chính xác rõ ràng. Một ở trên có rất nhiều sysadmin kỹ thuật "đen-nghệ thuật" mumbo jumbo ... nhưng nó không phải là hữu ích ở tất cả :)
Henley Chiu

7
Vấn đề này không giống với OP. OP tuyên bố cụ thể rằng họ đã thực hiện các thay đổi cần thiết đối với tệp cấu hình. Vì OP đã thực hiện các thay đổi đối với tệp cấu hình và bạn đã thực hiện. Không phải, chúng là hai vấn đề riêng biệt. Câu trả lời đưa ra giải quyết vấn đề được cung cấp. Nó không phải để giải quyết tất cả các vấn đề. Chỉ là người được hỏi. Nó không phải là thừa nhận bất cứ điều gì là sai, mà là nhận ra vấn đề của bạn là khác nhau. Nó giống như ai đó nói rằng xe của họ sẽ không nổ máy nhưng họ có xăng trong đó, và bạn nói với họ rằng họ cần xăng.
The Real Bill

1
Bạn cũng có biết cách chỉ định ngăn xếp kép IPv4 và IPv6 không? Tôi thử như sau: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(nơi \ n là một dòng mới) và bind 0 [::]nhưng điều duy nhất mà công trình không có một binddòng trong cấu hình gì cả. Nó mặc định lắng nghe trên 0 (hoặc 0.0.0.0/0) và [::] nên không có vấn đề gì, nhưng tôi muốn biết phương pháp thích hợp nếu tôi cần nó. Nó dường như không được ghi lại ở bất cứ đâu.
Luc

7
Những gì câu trả lời này làm là nó làm cho máy chủ Redis của bạn có thể truy cập được trên toàn thế giới. Đó là một rủi ro bảo mật lớn. Nếu bạn làm điều này, hãy đảm bảo rằng bạn khóa máy chủ Redis của mình theo các cách khác, chẳng hạn như thêm mật khẩu AUTH trong Redis và định cấu hình tường lửa của bạn (ví dụ iptables:) để chặn các máy khách trái phép.
sffc

14

Ngoài câu trả lời xuất sắc do Orabîg đưa ra:

Tôi đã giải quyết vấn đề này bằng cách xóa bindhoàn toàn phần này và đặt protected-modethành no.

#bind 127.0.0.1
protected-mode no

Không bao giờ sử dụng phương pháp này trên các máy chủ công khai.


1
Đối với bất kỳ ai sử dụng phương pháp không bảo mật: Hãy bảo vệ máy chủ Redis của bạn !! hoặc bạn sẽ mất tất cả các tệp của mình :( Máy chủ của tôi đã bị xâm phạm vì tôi không bảo mật Máy chủ Redis. Kẻ tấn công muốn tôi trả một số tiền (đủ lớn đối với tôi). Kẻ tấn công giống như thế này: duo.com/ blog /…
MonkimoE Ngày

4

Orabig là chính xác.

Bạn có thể liên kết 10.0.2.15 trong Ubuntu (VirtualBox) sau đó thực hiện chuyển tiếp cổng từ máy chủ sang Ubuntu khách.

trong /etc/redis/redis.conf

bind 10.0.2.15

sau đó, khởi động lại redis:

sudo systemctl restart redis

Nó sẽ hoạt động!


4

Tôi đã vật lộn với kết nối từ xa với Redis trong một số ngày. Cuối cùng thì tôi cũng làm được. Đây là danh sách kiểm tra đầy đủ mà tôi tổng hợp để theo dõi để kết nối. Một số giải pháp được đưa ra trong các câu trả lời ở trên. Tuy nhiên, tôi muốn câu trả lời của mình là một wiki nano về chủ đề này :) Tôi cũng đã thêm một số liên kết hữu ích.

Nếu redis hoạt động cục bộ:

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

Nếu mật khẩu không được đặt

Xem /etc/redis/redis.confcấu hình (đây là locaion mặc định cho Ubuntu 18.04, bạn có thể có nó ở vị trí khác):

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

Nếu chế độ được bảo vệ được đặt thành 'không' trong cấu hình:

# The following line should be uncommented
protected-mode no

nếu ràng buộc IP được mở để truy cập từ internet trong cấu hình:

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

Nếu tường lửa Linux cho phép các kết nối

(ở đây cho Ubuntu 18.04) Kiểm tra xem nó có cho phép lưu lượng truy cập internet đến để chuyển đến cổng hay không 6379(cổng mặc định của 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

Khởi động lại dịch vụ Redis

Đừng quên khởi động lại dịch vụ Redis để các thay đổi có hiệu lực và xem nó đang chạy:

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

Kiểm tra xem nó có hoạt động như một máy chủ từ xa không

từ dòng lệnh của bạn sử dụng redis-clinhư thể máy chủ Redis ở trên máy chủ từ xa:

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

Nếu bạn có thể ping-PONG máy chủ Redis của mình thông qua máy chủ internet được kết nối như một máy chủ từ xa thì kết nối Redis từ xa hoạt động.

Cảnh báo an ninh

Tất cả những điều trên làm cho dữ liệu Redis của bạn hoàn toàn mở cho bất kỳ ai từ internet.

Để bảo mật cơ bản việc sử dụng requirepassprotected-mode yescài đặt Redis trong cấu hình Redis (xem ở trên) và chặn các lệnh nguy hiểm của Redis (xem liên kết ở trên), để hiểu sâu hơn, hãy xem bài viết nàyphần bảo mật trang Redis ).

Liên kết hữu ích

Một số liên kết trợ giúp Cách cài đặt và bảo mật Redis trên Ubuntu 18.04cách thiết lập tường lửa Ubuntu 18.04 .

Hy vọng nó giúp.


2
  • nếu bạn tự tải xuống redis (không phải apt-get install redis-server) và sau đó chỉnh sửa redis.conf với các đề xuất ở trên, hãy đảm bảo rằng bạn bắt đầu redis với cấu hình như sau:./src/redis-server redis.conf

    • Ngoài ra, lưu ý rằng tôi đang bao gồm ảnh chụp màn hình cài đặt hộp ảo để kết nối với redis, nếu bạn đang sử dụng windows và kết nối với hộp ảo vm.

nhập mô tả hình ảnh ở đây


0

Đặt tcp-keepalive thành 60 (nó đã được đặt thành 0) trong cấu hình redis của máy chủ đã giúp tôi giải quyết vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.