Redis - подключение к удаленному серверу

122

Я только что успешно установил Redis, следуя инструкциям в руководстве по быстрому запуску на http://redis.io/topics/quickstart на моем сервере Ubuntu 10.10. Я запускаю службу как dameon (чтобы ее можно было запустить с помощью init.d)

Сервер является частью кластера Rackspace с внутренними и внешними 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 я закомментировал команду local bind, поэтому она должна прослушивать не только IP-адрес localhost. Я могу подключиться к базе данных на локальном компьютере, но не на другом сервере. Я безуспешно пробовал внешний и внутренний IP-адреса.

Есть предложения, как заставить это работать?

gregavola
источник
Вы можете подключиться с помощью инструмента командной строки Redis? redis-cli -h hostname
jlundqvist
В Server Fault есть канонический вопрос об отказе в подключении .
Raedwald

Ответы:

129

Сначала я проверю, чтобы убедиться, что он прослушивает ожидаемые IP-адреса:

netstat -nlpt | grep 6379

В зависимости от того, как вы запускаете / останавливаете, возможно, вы действительно не перезапустили экземпляр, когда думали, что это так. Netstat сообщит вам, слушает ли он, где вы думаете. Если нет, перезапустите его и убедитесь, что он перезапустился. Если он перезапускается и по-прежнему не прослушивает ожидаемый сигнал, на всякий случай проверьте файл конфигурации.

После установки он прослушивает там, где вы ожидаете, от удаленного узла, который должен иметь доступ, попробуйте:

redis-cli -h REMOTE.HOST ping

Вы также можете попробовать это с локального хоста, но используйте ожидаемый IP-адрес, а не имя хоста или localhost. В обоих случаях вы должны увидеть PONG в ответе.

В противном случае ваш брандмауэр (-ы) блокирует вас. Это могут быть либо локальные IPTables, либо, возможно, межсетевой экран между узлами. Вы можете добавить оператор ведения журнала в конфигурацию IPtables, чтобы регистрировать соединения более 6379, чтобы увидеть, что происходит. Кроме того, попытка повторного пинга с локального и нелокального на один и тот же IP-адрес должна быть иллюстративной. Если он отвечает локально, но не удаленно, я бы склонился к промежуточному брандмауэру в зависимости от сложности правил ваших таблиц IP-адресов на узле.

Настоящий счет
источник
16
Итак, чтобы было ясно, вы голосуете за ответ на опубликованную проблему, потому что у вас есть связанная (но явно не идентичная) проблема, которую он не решает? Хотя я согласен с публикацией вашего решения, отрицать правильный ответ, потому что ваша проблема была другой, не кажется правильным. Тем не менее, ваше решение не является хорошим выбором для вопроса, потому что OP имеет несколько IP-адресов и, возможно, не захочет прослушивать все из них, а OP специально ссылался на раздел привязки в файле конфигурации в вопросе. Таким образом, ваше решение не отвечает на заданный вопрос.
Настоящий Билл
2
Что ж, я снова прочитал вопрос, и мне не показалось настолько очевидным, что OP действительно установил правильный conf для этой строки «привязки». Кроме того, я не уверен, что в его деле замешан какой-либо брандмауэр. В любом случае, я могу убрать мой -1, если вы сочтете это грубым. Я только что обнаружил, что ваш ответ был совершенно не по теме, и что он не очень поможет большинству пользователей, приходящих сюда с очень распространенной проблемой ... (параметр привязки по умолчанию)
Орабиг
1
OP сказал, что он закомментировал правило локального связывания, которое предписывает redis связываться со всеми адресами в системе. Я бы не назвал -1 грубым, просто неуместным. ОП специально заявил, что у него есть правила IPtables, поэтому в заданном вопросе ясно, что существуют правила брандмауэра. Учитывая заявленное наличие брандмауэра и удаление локальной привязки в конфигурации, ваш ответ неверен или не соответствует заданному вопросу.
Настоящий Билл
Ага, ты прав, извини. Я не родной английский и неправильно истолковал глагол «закомментировать» ... Я думал, что 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 защищен любыми средствами, которые соответствуют вашим потребностям.

Orabîg
источник
1
То же самое и здесь, вы должны разрешить удаленные подключения с сервера Redis, прежде чем думать о настройках брандмауэра или сетевых проблемах. Спасибо, Орабиг
securecurve
Это очевидный правильный ответ. В том, что выше, есть много технических сисадминов "темного искусства", тарабарщины ... но это совершенно бесполезно :)
Хенли Чиу
7
Эта проблема не совпадает с OP. OP конкретно заявил, что они уже внесли необходимые изменения в файл конфигурации. Поскольку OP внес изменения в файл конфигурации, и вы это сделали. Нет, это две разные проблемы. Полученный ответ касался поставленной проблемы. Это было не для решения всех проблем. Только один спросил. Дело не в том, чтобы признать, что что-то не так, а в том, чтобы понять, что ваша проблема в другом. Это как если бы кто-то сказал, что его машина не заводится, но у него есть бензин, а вы говорите им, что ему нужен бензин.
Настоящий Билл
1
Знаете ли вы, как указать двойной стек IPv4 и IPv6? Я попытался следующие: bind 0, ::, bind 0, [::], bind 0\nbind6 ::(где \ п является символ новой строки) и , bind 0 [::]но единственное , что работает не имея bindлинию в конфигурации на всех. По умолчанию он прослушивает 0 (или 0.0.0.0/0) и [::], так что проблем нет, но я хотел бы знать правильный метод, если он мне когда-нибудь понадобится. Кажется, это нигде не задокументировано.
Люк
7
Этот ответ делает ваш сервер Redis доступным для всего мира. Это большой риск для безопасности. Если вы это сделаете, убедитесь, что вы заблокировали свой сервер Redis другими способами, такими как добавление пароля AUTH в Redis и настройка брандмауэра (например iptables) для блокировки неавторизованных клиентов.
sffc
14

В дополнение к прекрасному ответу Орабига:

Я решил эту проблему, полностью удалив bindраздел и установив protected-modeна no.

#bind 127.0.0.1
protected-mode no

Никогда не используйте этот метод на открытых серверах.

Дзэн
источник
1
Всем, кто использует незащищенный метод: Защитите свой сервер Redis !! или вы потеряете все свои файлы :( Мой сервер был скомпрометирован, потому что я не защищаю Redis Server. Злоумышленник хочет, чтобы я заплатил некоторую сумму денег (достаточно большую для меня). Злоумышленник что-то вроде этого: duo.com/ блог /…
MonkimoE 08
5

Несколько дней я боролся с удаленным подключением к Redis. Наконец-то я это сделал. Вот полный контрольный список, который я составил, чтобы следовать, чтобы подключиться. Некоторые из решений приведены в ответах выше. Тем не менее, я хотел, чтобы мой ответ был нано-вики по этой теме :) Я также добавил несколько полезных ссылок.

Если redis работает локально:

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

Если пароль не установлен

См. /etc/redis/redis.confКонфигурацию (это местоположение по умолчанию для 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 (см. Выше) и заблокировать опасные команды Redis (см. Ссылку выше), для более глубокого понимания см. Эту статью и раздел безопасности сайта Redis ).

Полезные ссылки

Некоторые ссылки в помощь Как установить и защитить Redis в Ubuntu 18.04 и как настроить брандмауэр Ubuntu 18.04 .

Надеюсь, поможет.

Валентина Ши
источник
4

Орабиг прав.

Вы можете привязать 10.0.2.15 в Ubuntu (VirtualBox), а затем выполнить перенаправление портов с хоста на гостевой Ubuntu.

в /etc/redis/redis.conf

bind 10.0.2.15

затем перезапустите Redis:

sudo systemctl restart redis

Это должно работать!

Майкл Цинь
источник
2
  • если вы сами загрузили redis (не apt-get install redis-server), а затем отредактировали redis.conf с указанными выше предложениями, убедитесь, что вы запускаете redis с такой конфигурацией:./src/redis-server redis.conf

    • Также примечание: я включаю снимок экрана с настройками виртуального окна для подключения к Redis, если вы находитесь в Windows и подключаетесь к виртуальному ящику vm.

введите описание изображения здесь

Robot70
источник
0

Установка tcp-keepalive на 60 (было установлено на 0) в конфигурации redis сервера помогла мне решить эту проблему.

Саурабх
источник