Мой новый продакшн-сервер виден только через двойной туннель ssh. Я могу добратьсяtargetHostчерез консоль Ubuntu 14.04 просто выполняя команду ssh targetHost
и затем выполняя mysql cli на удаленной машине, но я хотел бы получить доступ к базе данных MySQL через gui Workbench. Как настроить соединение в Workbench, чтобы добиться этого?
Мой.ssh/config:
Host targetHost, firewallHost
User username
IdentityFile /home/michalszulc/.ssh/id_rsa
Host targetHost
proxycommand ssh -W %h:%p firewallHost
Host firewallHost
hostname firewallHost.example.com
port 2201
passwordauthentication no
controlmaster auto
controlpath ~/
Host targetHost
Hostname 123.123.123.123
решение1
Процесс простой. Создайте новое подключение и выберите метод подключения Стандартный TCP/IP через SSH. Значения для сервера SSH, который предоставляет туннель:
- Имя хоста SSH: адрес сервера, который создает туннель SSH (сервер SSH и MySQL могут иметь один и тот же хост или один и тот же сетевой адрес, это будет зависеть от конфигурации).
- Имя пользователя SSH: имя пользователя на сервере SSH.
- Пароль SSH: Пароль пользователя на сервере SSH (если настроен режим аутентификации по паролю).
- Файл ключа SSH: файл, содержащий закрытый ключ для аутентификации на сервере, если вы включили
PasswordAuthentication
политику на сервере SSH, имеет значениеno
).
Значения для подключения к СУБД MySQL.
- MySQL Hostname: Адрес хоста, на котором MySQL запускает службу, относительно сервера SSH. Если служба SSH и MySQL запущена на одном хосте, то восточное значение — localhost или 127.0.0.1, поскольку после установки соединения через туннель служба MySQL прослушивает запросы от localhost (в зависимости от значения, установленного в директиве
bind_adress
MySQL). - Порт сервера MySQL: порт подключения MySQL, как правило, 3306.
- Имя пользователя MySQL: имя пользователя, под которым он будет подключаться к MySQL, т. е. он должен быть действительным пользователем MySQL и иметь авторизацию для подключения через туннель.
- Схема по умолчанию: эквивалентна SQL USE.
решение2
Не ясно, если мы правильно настроим. Поэтому я предполагаю, firewallhost
что хост доступен из вашего Workbench. Поэтому необходимо создать открытый порт на этом сервере, который может получить доступ к «реальному» серверу mysql за этим брандмауэром.
Это вполне нормально, если вы настроите постоянный ssh-туннель на firewallhost
. Это делается так наfirewallhost
ssh -L localhost:33060:localhost:3306 someshelluser@databasehost
Это создает туннель openssh для localhost (не общедоступный ни на одной сетевой карте) на порту 33060 (или любом другом свободном порту), firewallhost
который в свою очередь соединен через этот туннель с портом 3306 (опять же на localhost, но на машине databasehost
), поскольку он подключен как someshelluser на databasehost
.
И теперь вы можете подключиться с помощью Workbench:
- Имя хоста SSH:
firewallhost
- Имя пользователя SSH: какой-то допустимый пользователь
firewallhost
- Пароль SSH: ваш пароль для действительного пользователя
Файл ключа SSH: альтернатива файлу ключа
Имя хоста MySQL:
localhost
(так как мы открыли туннель наfirewallhost
локальном хосте)- Порт сервера MySQL: 33060
- Имя пользователя MySQL: ваш пользователь MySQL
Чтобы туннель ssh был firewallhost
постоянным, вы можете запустить его там следующим образом с помощью ключевого файла (для доступа к databasehost
) и отсоединенного процесса через экран. Это можно поместить в ваш rc.local или что-то еще, что вы используете в firewallhost
.
screen -d -m /usr/bin/ssh -v -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "BatchMode=yes" -i /your/.ssh/ssh_host_dsa_key -q -L locahost:33060:localhost:3306 someshelluser@databasehost
Вы должны просто «представить», что такой туннель ssh может «передавать» любой поток портов с одной машины на другую, открывая «новый» порт на машине, на которой вы создаете этот туннель ssh (здесь firewallhost
). Это можно сделать даже на публичной сетевой карте firewallhost
, но вы хотите сделать это на локальном хосте, так как вы не хотите выставлять свой порт mysql на всеобщее обозрение ;)
ОБНОВЛЯТЬ:
Хорошо, поскольку у вас нет прямого доступа к firewallhost
созданию постоянного туннеля, попробуйте другой способ. Вы сказали, что можете подключиться с помощью proxycommand. Поскольку вы написали это в строке, а не как опцию '-o', я предполагаю, что это есть в вашем ssh_config.
Если ваш ssh_config выглядит так:
Host server
Hostname mysqlserver.example.org
ProxyCommand ssh -W %h:%p firewallhost.example.org
Тогда вы можете попробовать следующее:Имя хоста SSH' в workbench. При возможности вам разрешается передавать параметры ssh с ним. Я не проверял, но это не является необычным для приложений, чтобы передавать содержимое полей Hostname прямо в вызов ssh.
Имя хоста SSH:
-o ProxyCommand="ssh -W %h:%p firewallhost.example.org" mysqlserver.example.org
Это должно привести вас к вашему mysqlserver через ваш firewallhost. Отсюда ваши настройки mysql могут быть использованы так, как если бы вы напрямую подключались к mysqlserver, как ожидает workbench.
ОБНОВЛЕНИЕ2:
Как вы написали, вы находитесь на той же машине (Ubuntu 14), которая может подключиться к вашей базе данных mysql за firewallhost
, вам просто нужно использовать те же значения в workbench, которые вы используете в консоли. Workbench будет использовать ваш .ssh/config, если вы вызовете workbench с тем же пользователем, для которого предназначен .ssh/config.
Окончательно:
Имя хоста SSH будет просто «targetHost», где proxycommand из вашего .ssh/config будет туннелировать вас к «targetHost» через «firewallHost». Имя пользователя SSH будет «username» (снова из .ssh/config).
Имя хоста MySQL должно быть localhost и порт 3306 - это должно быть точно так же, как вы делаете при доступе к 'targetHost' по ssh, как вы написали в своем вопросе. Потому что workbench будет использовать эти значения после(!) подключения по ssh.