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