У доступі до MySQL відхилено помилку під час підключення через тунель SSH


12

Месяцями я підключався до екземпляра MySQL, який працює на нашому локальному тестовому сервері через тунель SSH без жодних проблем. Однак раптом, без змін, про які я можу придумати, сервер почав відхиляти спробу входу з Sequel Pro з помилкою:

Не вдається підключитися до хоста 127.0.0.1, оскільки доступ було відмовлено.

Двічі перевірте своє ім’я користувача та пароль і переконайтеся, що доступ із вашого поточного місцезнаходження дозволений.

MySQL сказав: Доступ заборонено користувачеві 'root' @ 'localhost' (використовуючи пароль: ТАК)

Я можу увійти через термінал, коли підключений безпосередньо до сервера через SSH, тільки не через тунель SSH. Проблема не характерна лише для Sequel Pro або просто для мене, я отримую таку ж помилку під час підключення через MySQL Workbench, як і інші в офісі. Я скинув пароль mysqladminлише заради розуму, це точно не проблема.

Коли я почав більше розглядати це, я помітив, що помилка повідомляла сервер як "localhost", а не "127.0.0.1", яку я ввів у Sequel Pro. Друг припустив, що це, мабуть, лише погана обробка помилок, але здається дивним, враховуючи значну різницю між localhost та 127.0.0.1 в MySQL.

Намагаючись обійти проблему з тунелюванням, я надав доступ до root @%, щоб я міг підключитися безпосередньо. Це працює здебільшого, я можу переглядати дані таблиць, створювати нові бази даних тощо. Єдина проблема - коли я приходжу до створення користувачів, я отримую помилку:

Доступ заборонено користувачеві 'root' @ '%' (з використанням пароля: ТАК)

Як не дивно користувач створений насправді, я думаю, що це лише проблема з грантом. Знову ж таки, з терміналу я можу все робити, коли ввійшов як root.

Чи може хто-небудь допомогти пролити світло на те, чому підключення до тунелю та (ймовірно) команди грантів отримують помилку в доступі?

Для довідки MySQ - версія 5.6.16 з переважно типовими налаштуваннями, встановленими через Homebrew на машині MAC OS X Server.

Оновлення

Ось перелік хостів, до яких root на даний момент надано доступ:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

Як я розумію, перший рядок ("%") дійсно повинен зробити інші зайвими?

Оновлення 2

Виправлено випуск гранту; користувачеві root @% не надано всіх привілеїв із додатковою частиною with grant optionв кінці, тому він міг би зробити все, крім дозволу. Все ще хотілося б знати, чому тунелі SSH відмовляються.


Отже, перш ніж ви зробили обліковий запис "%", ви зробили "127.0.0.1" і "localhost", і це не працювало, чи правильно?
Сверре

localhost працює лише у тому випадку, якщо ви насправді правильний хост, тому теоретично лише 127.0.0.1 (мережа, еквівалентна localhost) повинна працювати над тунелем ssh. як мінімум, в unix як ОС.
Сверре

Відповіді:


18

У MySQL localhostключове слово зарезервоване для з'єднання за допомогою сокета MySQL, і ви повинні використовувати ip-адресу 127.0.0.1для підключення TCP до мережевого порту MySQL на 127.0.0.1. Це означає, що і сервер повинен надавати привілеї користувачам конкретно 127.0.0.1, і клієнт повинен використовувати -h 127.0.0.1для проходження тунелю замість підключення до локального сокета.

Щоб дозволити вам використовувати переадресацію порту SSH, вам потрібно щось на зразок:

GRANT SELECT ON *.* TO user@`127.0.0.1`

а потім біжи

FLUSH PRIVILEGES;

і можливо

FLUSH QUERY CACHE;

Якщо вона все ще не працює, перезапустіть серверний процес.

У повідомленнях про помилки 127.0.0.1 після зворотного пошуку DNS переводиться на localhostускладнення налагодження.

Як описано в посібнику :

У Unix програми MySQL трактують ім'я хоста localhost спеціально таким чином, який, ймовірно, відрізняється від очікуваного у порівнянні з іншими мережевими програмами. Для підключення до localhost програми MySQL намагаються підключитися до локального сервера за допомогою файлу сокет Unix. Це відбувається , навіть якщо - -portабо -Pзаданий параметр , щоб вказати номер порту. Щоб переконатися, що клієнт встановлює TCP / IP-з'єднання з локальним сервером, використовуйте --hostабо -hвкажіть значення імені хоста 127.0.0.1або IP-адресу або ім’я локального сервера. Ви також можете вказати протокол з'єднання прямо, навіть для localhost, скориставшись --protocol=TCPопцією. Наприклад:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

Ця --protocolопція дозволяє встановити певний тип з'єднання, навіть коли інші параметри зазвичай за замовчуванням застосовуються до іншого протоколу.


2
Ах! Це потім пояснює, чому я бачу localhost у повідомленні про помилку, коли я очікував побачити 127.0.0.1. Тим не менш, користувачеві root надано всі привілеї @ 127.0.0.1, але мені все одно залишається помилка в доступі під час підключення через тунель SSH. Точне твердження, яке я побіг:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Адам,

У мене виникає ця проблема, і зрозуміло, що це справді проблема хоста проти сокета. Коли я ssh -h 127.0.0.1 -u root -pвіддалено друкую на сервері, з'єднання також відхиляється.
нечіткийTew

Я вирішив -h 127.0.0.1невдалі з’єднання на сервері, перезавантаживши mysql, але ssh-сокет все ще не буде працювати
fuzzyTew

Ось і ми. 1. Сервер повинен надати @ 127.0.0.1. Це не знадобилось для мене, поки я не перезавантажив сервер. 2. Локальне підключення повинне бути 127.0.0.1, а не localhost, щоб тунель використовувався замість локального сокета.
нечіткийTew

1

Раніше з ssh tunels я бачив, що існує різниця між Grant all для "localhost" і надайте всім "127.0.0.1", тому спробуйте дозволити "127.0.0.1 замість цього або в доповнення до вашого" localhost ".


або навпаки, у вашому випадку це виглядає так
Sverre

Дякую, я оновив питання, щоб включити список коренів хостів надано. Мені було дивно, що, незважаючи на те, що "127.0.0.1" як сервер MySQL входив у Sequel Pro, помилка MySQL повідомляла про це як "localhost". Я не думаю, що це проблема.
Адам

у вас є паролі для всіх різних користувачів? також коли ви підключаєтесь до mysql через тунель, який власне синтаксис ви використовуєте?
Сверре

чи існують обмеження для користувача Root у вашій настройці mysql?
Сверре

Просто перезапустіть grantоператори, identified by ..щоб переконатися, що всі паролі кореня однакові, але ніякої радості.
Адам

0

Замість того, щоб використовувати Sequel для створення тунелю, що ви створюєте тунель самостійно?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ домен

Потім підключіться за допомогою Sequel до 127.0.0.1:3306 Чи можете ви підключитися? Чи щось з’являється у вашому терміналі (або в журналах клієнта ssh)?

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