Вопрос по ssh-tunnel, ssh, mysql – MySQL соединение через SSH туннель

24

Я установил 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)

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

Ваш Ответ

6   ответов
1

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

Wrong port was used, double check if you are setting it correctly I forgot enabling in Putty: Connection > SSH > Tunnels > Local ports accept connections from other hosts
1

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

AllowTcpForwarding yes
0

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

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

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

Что работало для меня

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

10

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

В моем случае сервер MySQL настроен сbind-address: 192.168.4.4. I originally setup an SSH tunnel with a commonly mentioned -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]. This will tell the remote tunnel end to connect to MySQL using the IP MySQL actually listens on.

4

ШАГ ЗА ШАГОМ ТУННЕЛИНГ

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

на целевом компьютере (который может быть адресован по 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

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

у вас есть аккаунт (возможно, ssh-ключ) для входа в систему с использованием 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 на компьютере, который я печатаю (клиент), к удаленному host_name: 3306 .... 127.0.0.1 означает здесь удаленный (host_name) и не должен заменяться словом localhost, потому что это будет установить соединение в unix (именованном) сокете не по IP ... Вы получите'ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysql.sock' (2)' при попытке соединить 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 - клиентский компьютер

то же самое для рабочего места, heidiSQL

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

ps fax | grep ssh
kill process_id
29

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

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 слушатьall сетевые интерфейсы.

2 - Давайте настроим ваш SSH-туннель

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

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

Пожалуйста, оставьте вывод

[edit : just added ...OR host LIKE 'localhost' below, as this might be relevant for troubleshooting purposes]

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

Возможно, вы пропустили мое последнее изменение: & quot; Возможно, вы захотите использоватьbind-address=0.0.0.0, который инструктирует демон MySQL прослушивать все сетевые интерфейсы. & quot ;. Добро пожаловать.
Спас меня с исправлением адреса привязки!
Большое спасибо за ваш подробный ответ! Исправление первой проблемы заставило его работать. madfriend
В чем разница между localhost, 127.0.0.1 и локальным сокетом?
Локальные сокеты (доменные сокеты a.k.a Unixen.wikipedia.org/wiki/Unix_domain_socket) являются одной из многих возможностей для IPC (межпроцессное взаимодействие - каналы связи между двумя процессами, работающими на одной машине). Это сопоставимо с общей памятью. Сmysql -hlocalhost, клиент использует сокет.mysql -h127.0.0.1 явно инструктирует клиента использовать TCP / IP. Локальные сокеты более эффективны, потому что они обходят сетевой уровень.

Похожие вопросы