Подключение MySQL через туннель SSH

Я установил SSH-туннель между двумя серверами A и B. B имеет сервер MySQL, и это работает:

mysql -h localhost -P 3306 -u user -p

Пока это не так:

mysql -h 127.0.0.1 -P 3306 -u user -p

Хотя my.cnf имеет следующие строки:

bind-address        = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address        = 99.99.99.99

Теперь о туннеле. Он соединяет следующее: (A) localhost(9989) -> (B) localhost(3306) Но когда (на A, с переадресованными портами), я делаю

mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p

Я получаю ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

И когда я делаю

mysql -v -h localhost -P 9989 -u user userdb -p

Я получаю ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)

В чем может быть причина? Что я делаю неправильно?

Ответ 1

Здесь есть три вопроса.

1 - Забудьте о туннеле SSH на данный момент

Вы не можете привязать MySQL к нескольким конкретным IP-адресам. Первое предложение bind-address переопределяется (поэтому игнорируется) вторым. Ваш сервер только слушает 99.99.99.99.

Причина, по которой вы можете подключиться к -h localhost, но не с -h 127.0.0.1, заключается в том, что в первом виде вы фактически не подключаетесь через TCP/IP, а через локальный сокет.

Посмотрите в my.cnf для предложения socket.

Удалите одно избыточное предложение bind-address. Вы можете использовать bind-address=0.0.0.0, который инструктирует демон MySQL для прослушивания всех сетевых интерфейсов.

2 - Позвольте настроить туннель SSH

Причина вашей ошибки ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 для меня не очевидна. Я подозреваю, что SSH-туннель фактически устанавливается только тогда, когда он получает запрос на соединение (в вашем случае при запуске клиента mysql). Поскольку ваш сервер не прослушивает 127.0.0.1 (см. Предыдущий абзац), туннель SSH не может быть установлен, соединение терпит неудачу, и ваш клиент интерпретирует его как сетевой сбой.

3 - Почему mysql -v -h localhost -P 9989 -u user userdb -p не работает

Пожалуйста, опубликуйте вывод

[edit: только что добавленный ...OR host LIKE 'localhost' ниже, поскольку это может иметь значение для целей устранения неполадок]

mysql > SELECT user, host FROM mysql.user WHERE user LIKE 'user' OR host LIKE 'localhost';

(замените 'user', после предложения LIKE, с фактическим именем пользователя, если необходимо)

Контроль доступа MySQL проверяет имя пользователя/пароль (user) и источник подключения (host) для идентификации пользователя. Вероятно, вы не создали пользователя 'user'@'localhost'.

N.B.: mysql.com недоступен из моего местоположения в настоящее время, я не могу ссылаться на соответствующие страницы руководства.

Ответ 2

Я просто столкнулся с этой проблемой.

В моем случае сервер MySQL настроен с помощью bind-address: 192.168.4.4. Сначала я установил SSH-туннель с обычно упоминаемой строкой -L 3306:localhost:3306 [email protected] и с моего компьютера подключился к mysql -h 127.0.0.1.

Это не работает, потому что MySQL больше не слушает 0.0.0.0 или даже "localhost" (aka 127.0.0.1), только 192.168.4.4.

Правильная строка туннеля должна быть -L 3306:192.168.4.4:3306 [email protected]. Это позволит удаленному туннелю подключиться к MySQL, используя IP MySQL, на самом деле слушает.

Ответ 3

ШАГОВОЙ ШУМОВОЙ ТОННЕЛИРОВАНИЕ

--- СЕРВЕРНАЯ СТОРОНА ----

на целевой машине (которая может быть дополнена IP-адресом или размещенным доменом) есть файл конфигурации /etc/mysql/my.cnf, имеющий строку

bind-address    = 127.0.0.1

подтверждено консолью

netstat -tapn |  grep mysql
// tcp    0    0 127.0.0.1:3306     0.0.0.0:*    LISTEN      18469/mysqld

что означает, что сервер mysql будет отвечать только на запрос из localhost

--- КЛИЕНТСКАЯ СТОРОНА ----

у вас есть учетная запись (eventualy a ssh-key) для регистрации с использованием cygwin, putty или linux_shell

ssh [email protected]_name

создать SSH TUNNEL

ssh -f -N -L 1000:127.0.0.1:3306    [email protected]_name

что означает, что ssh создает постоянное соединение с портом 1000 на машине, которую я набираю (клиент), на удаленное имя хоста: 3306.... 127.0.0.1 означает здесь удаленное имя (host_name) и не должно быть заменено на localhost word потому что это сделает соединение в unix (named) сокет не по IP... Вы получите "ERROR 2002 (HY000): не удается подключиться к локальному серверу MySQL через сокет" /var/run/mysql.sock "( 2) 'при попытке co connect mysql

-f = идти в фоновом режиме -N = отсутствие выписки

как -f -N вид nohoop - вы можете закрыть консоль и туннели сохраняются

--- СЕРВЕРНАЯ СТОРОНА ---

netstat -tapn |  grep ssh
// tcp  0  0  server_ip:22   clint_ip:port  ESTABLISHED 24915/sshd: user_name

что означает постоянное соединение через протокол shh

--- КЛИЕНТСКАЯ СТОРОНА ---

mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass

теперь ваш клиент (клиентская сторона) mysql подключается к удаленному серверу mysql... здесь 127.0.0.1 является клиентской машиной

то же самое для workbench, heidiSQL


как убить туннели ssh

ps fax | grep ssh
kill process_id

Ответ 4

Простой шаг работал у меня... Я поделюсь этим, поэтому, возможно, некоторым из вас может быть избавлена ​​от головной боли.

МОЯ НАСТРОЙКА

В моем конкретном случае у меня есть сервер Percona, работающий на Ubuntu, подключенный к MySQL Workbench (в Windows VM) через SSH; сервер работал нормально в течение нескольких дней, прежде чем плевать на ошибку 10060 при обработке запроса.

ЧТО РАБОТАЕТ ДЛЯ МЕНЯ

Я нашел в форуме от Acquia.com, что в некоторых случаях Workbench не принимает "127.0.0.1" в качестве хоста, поэтому вы должны изменить его на "localhost". Я сделал это, и это сработало (как ни странно, Workbench снова попросил пароли, даже если они уже были сохранены, но тем не менее работали).

Ответ 5

У меня была такая же проблема ("Lost connection...") в Windows (при использовании туннеля ssh через Putty). У меня есть 2 вопроса:

  • Использовался неправильный порт, дважды проверьте правильность его установки.
  • Я забыл включить в Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts

Ответ 6

В моем случае конфигурация в SSH-демоне блокировала туннель. AllowTcpForwarding должен быть включен.

AllowTcpForwarding yes