Redis-원격 서버에 연결


122

Ubuntu 10.10 서버 에서 http://redis.io/topics/quickstart 의 빠른 시작 가이드에있는 지침을 사용하여 Redis를 성공적으로 설치했습니다 . 나는 서비스를 dameon으로 실행하고 있습니다 (init.d로 실행할 수 있습니다)

서버는 내부 및 외부 IP가있는 Rackspace 클러스터의 일부입니다. 호스트는 포트 6379 (Redis의 표준)에서 실행 중입니다.

아래와 같이 포트 6379에서 들어오는 연결을 허용하기 위해 iptables에 행을 추가했습니다.

 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 파일에서 로컬 bind 명령이 주석 처리되어 있으므로 localhost IP 이상에서 수신해야합니다. 다른 서버가 아닌 로컬 시스템의 데이터베이스에 연결할 수 있습니다. 운없이 외부 및 내부 IP를 시도했습니다.

이 작업에 대한 제안 사항이 있습니까?


Redis 명령 줄 도구를 사용하여 연결할 수 있습니까? redis-cli -h hostname
jlundqvist

Server Fault에는 Connection Refused 에 대한 정식 질문이 있습니다.
Raedwald 2015 년

답변:


129

먼저 예상되는 IP에서 수신 중인지 확인합니다.

netstat -nlpt | grep 6379

시작 / 중지 방법에 따라 실제로 인스턴스를 다시 시작하지 않았을 수 있습니다. netstat는 사용자가 생각하는 위치에서 듣고 있는지 여부를 알려줍니다. 그렇지 않은 경우 다시 시작하고 다시 시작되는지 확인하십시오. 다시 시작되고 여전히 예상 한 곳에서 수신하지 않는 경우 구성 파일을 확인하여 확인하십시오.

설정 한 후에는 액세스 권한이 있어야하는 원격 노드에서 예상하는 위치를 수신합니다.

redis-cli -h REMOTE.HOST ping

로컬 호스트에서 시도 할 수도 있지만 호스트 이름이나 로컬 호스트 대신 수신 대기 할 것으로 예상되는 IP를 사용하십시오. 두 경우 모두 PONG이 표시되어야합니다.

그렇지 않은 경우 방화벽이 사용자를 차단하고있는 것입니다. 이것은 로컬 IPTable이거나 노드 사이의 방화벽 일 수 있습니다. IPtables 구성에 로깅 문을 추가하여 6379 이상의 연결을 기록하여 무슨 일이 발생하는지 확인할 수 있습니다. 또한 그가 로컬 및 비 로컬에서 동일한 IP로 ping을 다시 시도하는 것은 예시가 될 것입니다. 로컬에서 응답하지만 원격으로 응답하지 않는 경우 노드상의 IP 테이블 규칙의 복잡성에 따라 중간 방화벽을 사용합니다.


16
그래서 명확하게 말하면, 게시 된 문제에 대한 답변에 반대표를 던지고 있습니다. 문제가 해결되지 않은 관련 (하지만 분명히 동일하지는 않음) 문제가 있기 때문입니까? 나는 귀하의 솔루션을 게시하는 데 동의하지만 귀하의 문제가 다르기 때문에 정답에 반대 투표하는 것은 올바른 일이 아닌 것 같습니다. 즉, OP에 여러 IP가 있고 모든 IP를 수신하고 싶지 않을 수 있으며 OP는 질문에서 구성 파일의 바인드 섹션을 구체적으로 참조했기 때문에 솔루션은 질문에 대한 좋은 선택이 아닙니다. 따라서 귀하의 솔루션은 질문을 해결하지 못합니다.
The Real Bill

2
글쎄, 나는 질문을 다시 읽었고 OP 가이 '바인드'라인에 대해 올바른 conf를 설정했다는 것이 너무 분명하지 않은 것 같습니다. 또한 그의 사건에 방화벽이 있는지는 확실하지 않습니다. 어쨌든 무례하다고 생각되면 -1을 제거 할 수 있습니다. 난 그냥 당신의 대답은 완전히 오프 주제 것을 발견하고, 그것이 것 매우 일반적인 문제를 여기 (바인드 기본 매개 변수) 오는 대부분의 사용자에게 매우 도움이되지
Orabîg

1
OP는 redis에게 시스템의 모든 주소에 바인딩하도록 지시하는 로컬 바인딩 규칙을 주석 처리했다고 말했습니다. 나는 -1을 무례하다고 부르지 않고 부적절합니다. OP는 구체적으로 그가 IPtables 규칙을 가지고 있다고 명시 했으므로 질문에 방화벽 규칙이 있음이 분명합니다. 방화벽이 명시되어 있고 구성에서 로컬 바인드가 제거 되었기 때문에 귀하의 답변이 정확하지 않거나 질문과 관련이 없습니다.
The Real Bill

네, 맞아요, 미안 해요. 나는 원어민 영어가 아니고 "comment out"동사를 잘못 해석했습니다. OP가 주석을 "삭제"했다고 생각했습니다. (불행히도, 난 내를 제거 할 수 없습니다 -1, 당신이 당신의 게시물을 수정할 때까지)
Orabîg

걱정하지 마세요. 원하는 위치에서 실행 중인지 확인하는 것과 관련하여 몇 가지 설명을 추가했습니다. 미래의 독자를 위해 그것을 명확히하는 데 도움이되기를 바랍니다.
The Real Bill

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

이것은 분명한 정답입니다. 위의 것에는 많은 기술 시스템 관리자 "다크 아트"mumbo jumbo가 있지만 전혀 도움이되지 않습니다. :)
Henley Chiu 2013

7
이 문제는 OP와 동일하지 않습니다. OP는 특별히 필요한 구성 파일을 이미 변경했다고 명시했습니다. OP가 구성 파일을 변경했기 때문에 변경했습니다. 아닙니다. 두 가지 별개의 문제입니다. 주어진 대답은 제공된 문제를 해결했습니다. 모든 문제를 해결하기위한 것이 아닙니다. 한 사람이 물었다. 그것은 잘못된 것을 인정하는 것이 아니라 문제가 다르다는 것을 깨닫는 것입니다. 그것은 누군가가 그들의 차가 시동되지 않을 것이라고 말하는 것과 같습니다. 그들은 그 안에 가스가 있고, 당신은 그들에게 가스가 필요하다고 말하는 것과 같습니다.
The Real Bill

1
IPv4 및 IPv6 이중 스택을 지정하는 방법도 알고 계십니까? 나는 다음과 같은 시도 : bind 0, ::, bind 0, [::], bind 0\nbind6 ::및 (\ n은 줄 바꿈입니다) bind 0 [::]하지만, 작품이 가진되지 않는 유일한 것은 bind모두에서 설정에 라인. 기본적으로 0 (또는 0.0.0.0/0) 및 [::]에서 수신 대기하므로 문제가 없지만 한 번 필요하면 적절한 방법을 알고 싶습니다. 어디에도 문서화되지 않은 것 같습니다.
Luc

7
이 답변은 Redis 서버를 전 세계에 액세스 할 수 있도록합니다. 그것은 큰 보안 위험입니다. 이렇게하려면 Redis에서 AUTH 암호추가하고iptables 권한이없는 클라이언트를 차단 하도록 방화벽 (예 :) 을 구성 하는 등 다른 방법으로 Redis 서버를 잠그십시오 .
sffc

14

Orabîg가 제공 한 훌륭한 답변 외에도 :

bind섹션을 완전히 제거 하고로 설정 하여이 문제를 해결 protected-mode했습니다 no.

#bind 127.0.0.1
protected-mode no

공개적으로 노출 된 서버에서는이 방법을 사용하지 마십시오.


1
보안되지 않은 방법을 사용하는 사람 : Redis 서버를 보호하십시오 !! 또는 모든 파일을 잃게됩니다 :( Redis 서버를 보호하지 않기 때문에 내 서버가 손상되었습니다. 공격자는 내가 약간의 돈을 지불하기를 원합니다 (나에게 충분히 큰). 공격자는 다음과 같이합니다 : duo.com/ blog /…
MonkimoE

4

Orabig이 맞습니다.

Ubuntu (VirtualBox) 에서 10.0.2.15를 바인딩 한 다음 포트 전달 을 수행 할 수 있습니다. 호스트에서 게스트 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>

구성에서 보호 모드가 'no'로 설정된 경우 :

# 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-cliRedis 서버가 원격 서버에있는 것처럼 사용 합니다.

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

원격 Redis 연결이 작동하는 것보다 원격 서버로 연결된 인터넷 서버를 통해 Redis 서버를 ping-PONG 할 수 있습니다.

보안 경고

위의 모든 기능을 통해 Redis 데이터가 인터넷의 모든 사용자에게 완전히 공개됩니다.

기본적으로 Redis 구성 (위 참조)에서 Redis 사용 requirepassprotected-mode yes설정을 보호 하고 위험한 Redis 명령 (위 링크 참조)을 차단하려면 이 문서Redis 사이트 보안 섹션을 참조 하세요. 참조하십시오.

유용한 링크

Ubuntu 18.04에서 Redis를 설치하고 보호 하는 방법Ubuntu 18.04 방화벽을 설정하는 방법 도움이되는 링크 .

도움이 되었기를 바랍니다.


2
  • redis를 직접 다운로드 한 다음 (apt-get install redis-server가 아님) 위의 제안으로 redis.conf를 편집 한 경우 다음 과 같은 구성으로 redis 시작해야합니다 ../src/redis-server redis.conf

    • 또한 Windows에 있고 virtualbox vm에 연결하는 경우 redis에 연결하기 위해 가상 상자 설정의 스크린 샷을 포함하고 있습니다.

여기에 이미지 설명 입력


0

서버의 redis 구성에서 tcp-keepalive를 60 (0으로 설정 됨)으로 설정하면이 문제를 해결하는 데 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.