Назад | Перейти на главную страницу

Ошибка отказа в доступе к MySQL при подключении через SSH-туннель

В течение нескольких месяцев я без проблем подключаюсь к экземпляру 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 запрещены.

В 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 опция позволяет вам установить конкретный тип соединения, даже если другие опции обычно по умолчанию используют какой-либо другой протокол.

Я видел в прошлом с туннелями ssh, что есть разница между «Предоставить все для« localhost »» и «предоставить все для« 127.0.0.1 », поэтому попробуйте предоставить« 127.0.0.1 »вместо или в дополнение к предоставлению« localhost ».

Вместо того, чтобы использовать продолжение для создания туннеля, что вы создаете сами?

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

Затем подключитесь с помощью Sequel к 127.0.0.1:3306. Можете ли вы подключиться? Что-нибудь отображается в вашем терминале (или в журналах клиента ssh)?