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 я прокоментував команду локальної прив'язки, тому вона повинна слухати більше IP-адреси localhost. Я можу підключитися до бази даних на локальній машині, тільки не на іншому сервері. Я випробував зовнішні та внутрішні IP-адреси без удачі.

Будь-які пропозиції щодо роботи цього?


Чи можете ви підключитися за допомогою інструменту командного рядка Redis? redis-cli -h hostname
jlundqvist

Помилка сервера має канонічне питання про відмову від підключення .
Raedwald

Відповіді:


129

Спершу я переконуюсь, щоб переконатися, що він слухає IP-адреси, які ви очікуєте:

netstat -nlpt | grep 6379

Залежно від того, як ви запускаєте / зупиняєте, ви, можливо, не перезапустили екземпляр, коли вважали, що маєте. Netstat скаже вам, чи слухає він там, де ви думаєте. Якщо ні, перезапустіть його та переконайтесь, що він перезапуститься. Якщо він перезапуститься і все ще не слухає, де ви очікуєте, перевірте свій конфігураційний файл, щоб бути впевненим.

Після встановлення він прослуховує, де ви очікуєте, з віддаленого вузла, до якого слід мати доступ, спробуйте:

redis-cli -h REMOTE.HOST ping

Ви також можете спробувати це з локального хоста, але використовуючи IP, ви очікуєте, що він буде слухати замість імені хоста або localhost. Ви повинні побачити це PONG у відповідь в обох випадках.

Якщо ні, то ваш брандмауер блокує / блокує. Це буде або локальні IPTables, або, можливо, брандмауер між вузлами. Ви можете додати оператор журналу до своєї конфігурації IPtables, щоб увійти підключення понад 6379, щоб побачити, що відбувається. Крім того, намагання він перетворити пінг з локального та не локального на той самий IP повинен бути показовим. Якщо він реагує локально, але не віддалено, я схиляюся до брандмауера, що втручається, залежно від складності правил ваших вузлових IP-таблиць.


16
Так, щоб було зрозуміло, ви скасовуєте відповідь на поставлену проблему, оскільки у вас є пов'язана (але явно не тотожна) проблема, на яку вона не вирішується? Хоча я погоджуюся з опублікуванням вашого рішення, не викликаючи правильної відповіді, оскільки ваша проблема була іншою, здається, не належним чином. Зважаючи на це, ваше рішення не є вдалим вибором для запитання, тому що в ОП є кілька IP-адрес, і вони можуть не хотіти слухати їх усіх, а ОП спеціально посилається на розділ прив'язки у конфігураційному файлі. Таким чином, ваше рішення не стосується поставленого питання.
Справжній Білл

2
Ну, я прочитав питання ще раз, і мені це не видалося настільки очевидним, що ОП встановив правильну конфіденційність для цього рядка "прив'язки". Також я не впевнений, що в його справі бере участь будь-який брандмауер. У будь-якому разі я можу зняти свій -1, якщо ви вважаєте, що це грубо. Щойно я виявив, що ваша відповідь була абсолютно поза темою, і що це не буде дуже корисно для більшості користувачів, які приїжджають сюди із дуже поширеною проблемою ... (параметр прив’язки за замовчуванням)
Orabîg

1
ОП сказав, що він прокоментував місцеве правило прив'язки, яке повідомляє redis прив'язувати до всіх адрес системи. Я б не назвав -1 грубим, просто недоречним. ОП спеціально заявила, що у нього є правила IPtables, тому зрозуміло, що в заданому питанні є правила брандмауера. Зважаючи на заявлену наявність брандмауера та видалення локального прив’язки у конфігурації, ваша відповідь не є правильною та не має значення для заданого питання.
Справжній Білл

Так, ти маєш рацію, вибач. Я не рідна англійська, і неправильно інтерпретував дієслово "прокоментувати" ... Я подумав, що ОП "видалив" коментар. (на жаль, я не можу видалити свої -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-адресу)

Важлива примітка: як заявили декілька користувачів, це не безпечно встановлювати це на сервері, який піддається впливу Інтернету. Ви повинні бути впевнені, що ви захищені будь-якими засобами, що відповідають вашим потребам.


1
Тут же слід дозволити в першу чергу віддалені з’єднання із сервером Redis, перш ніж замислюватися про налаштування брандмауера або проблеми з мережею. Дякую Орабігу
securecurve

Це очевидно правильна відповідь. У вищезазначеного є багато технічних сисадмін "мамбо-джембо", але це зовсім не корисно :)
Henley Chiu

7
Ця проблема не така, як в ОП. ОП спеціально заявило, що вони вже внесли необхідні зміни у конфігураційний файл. Оскільки ОП внесла зміни в конфігураційний файл і ви зробили це. Ні, це два окремі питання. Надана відповідь стосувалася наданої проблеми. Це було не для вирішення всіх проблем. Просто запитав той. Це не про те, щоб визнати щось не так, а про те, щоб зрозуміти, що ваша проблема є іншою. Це як би хтось сказав, що їх автомобіль не запуститься, але в них є газ, а ти їм кажеш, що їм потрібен газ.
Справжній законопроект

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 Server !! або ви втратите всі свої файли :( Мій сервер був порушений через те, що я не захищаю Redis Server. Зловмисник хоче, щоб я заплатив певну суму грошей (для мене досить великий). Зловмисник щось подібне: duo.com/ блог /…
MonkimoE

4

Орабіг правильний.

Ви можете прив’язати 10.0.2.15 до Ubuntu (VirtualBox), а потім зробити переадресацію порту з хоста на гостьовий Ubuntu.

в /etc/redis/redis.conf

bind 10.0.2.15

потім перезапустіть redis:

sudo systemctl restart redis

Це спрацює!


4

Я боровся з віддаленим зв’язком до Редіса кілька днів. Нарешті я це встиг. Ось повний контрольний список, який я склав, щоб перейти, щоб підключитися. Деякі рішення наведені у відповідях вище. Але я хотів, щоб моя відповідь була нано-вікі на цю тему :) Я також додала кілька корисних посилань.

Якщо 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
$

Якщо ви можете пінг-PONG ваш сервер Redis через Інтернет-сервер, підключений як віддалений сервер, ніж працює віддалене з'єднання Redis.

Попередження про безпеку

Все вищезазначене робить ваші дані Redis повністю відкритими для всіх з Інтернету.

Щоб в основному забезпечити використання requirepassта protected-mode yesналаштування Redis у конфігурації Redis (див. Вище) та заблокувати небезпечні команди Redis (див. Посилання вище), для глибшого розуміння див. Цю статтю та розділ безпеки сайту Redis ).

Корисні посилання

Деякі посилання на допомогу Як встановити та захистити Redis на Ubuntu 18.04 та як встановити брандмауер Ubuntu 18.04 .

Сподіваюся, це допомагає.


2
  • якщо ви завантажили redis самостійно (не apt-get install redis-сервер), а потім відредагували redis.conf з наведеними вище пропозиціями, переконайтеся, що ви почнете redis із конфігурацією, як:./src/redis-server redis.conf

    • також бічна примітка Я включаю скріншот налаштування віртуального вікна для підключення до redis, якщо ви знаходитесь у Windows та підключаєтесь до virtualbox vm.

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


0

Встановлення tcp-keepalive в 60 (було встановлено 0) в конфігурації redis сервера допомогло мені вирішити цю проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.