Создание SSH-туннеля. Часть 2 из 4
27.12.2019
Теги: CLI • Linux • MySQL • SSH • Ubuntu • Windows • Виртуализация • Ключ • Команда • Конфигурация • Настройка • Сервер
Наша следующая задача — с помощью mysql-клиента на физическом компьютере TKMCOMP
подключиться к mysql-серверу на виртуальной машине web-server
. Для этого пробросим TCP-соединение от TKMCOMP
к web-server
через промежуточный сервер ssh-server
.
На виртуальной машине ssh-server
необходимо открыть порт для ssh-соединений. У меня это — 2222:
$ sudo ufw allow 2222/tcp Правило добавлено Правило добавлено (v6)
$ sudo ufw status verbose Состояние: активен Журналирование: on (low) По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные) В Действие Из ---------------------------------------------------- 2222/tcp ALLOW IN Anywhere 2222/tcp (v6) ALLOW IN Anywhere (v6)
Проброс соединения TKMCOMP => ssh-server => web-server
Первый туннель — от физического компьютера до виртуальной машины ssh-server
. Открываем окно PowerShell и выполняем команду:
> ssh -p 2222 -L 3307:127.0.0.1:3306 evgeniy@192.168.110.8
Второй туннель создаем с виртуальной машины web-server
, с удаленной точкой входа на виртуальной машине ssh-server
. Открываем окно терминала на web-server
и выполняем команду:
$ ssh -p 2222 -R 3306:127.0.0.1:3306 evgeniy@192.168.110.8
Открываем еще одно окно PowerShell и выполняем команду:
> mysql -uroot -pqwerty -P 3307
Эту задачу можно решить иначе, но для этого потребуется установить ssh-сервер на виртуальную машину web-server
(подробности см. здесь):
$ sudo apt install openssh-server $ sudo nano /etc/ssh/sshd_config $ sudo systemctl restart ssh
Теперь открываем окно PowerShell и выполняем команду:
> ssh -p 2222 -L 3307:127.0.0.1:3306 evgeniy@192.168.110.8
Тем самым мы создаем туннель и подключаемся к виртуальной машине ssh-server
. И создаем еще один туннель (а заодно подключаемся к виртуальной машине web-server
):
$ ssh -p 2222 -L 3306:127.0.0.1:3306 evgeniy@192.168.110.12
Открываем еще одно окно PowerShell и выполняем команду:
> mysql -uroot -pqwerty -P 3307
Такое решение не всегда возможно. Как правило, два туннеля нужны, чтобы пробросить соединение между двумя машинами с серыми ip-адресами, расположенными далеко друг от друга. Поскольку напрямую это сделать нельзя, нужен ssh-сервер с белым ip-адресом, который будет посредником.
Проброс соединения TKMCOMP <= ssh-server <= web-server
А теперь решим обратную задачу — пробросим соединение от виртуальной машины web-server
к физической машине через промежуточный сервер ssh-server
. Чтобы с виртуальной машины web-server
можно было подключится к серверу БД на физической машине.
Итак, открываем окно PowerShell на физической машине и выполняем команду:
> ssh -p 2222 -R 3306:127.0.0.1:3306 evgeniy@192.168.110.8
Теперь открываем окно терминала на виртуальной машине web-server
:
$ ssh -p 2222 -L 3307:127.0.0.1:3306 evgeniy@192.168.110.8
Открываем еще одно окно терминала на виртуальной машине web-server
:
$ mysql -uroot -pqwerty -P 3307
И получаем совершенно неожиданный результат. Вместо того, чтобы подключиться к серверу БД на физической машине TKMCOMP
, мы подключились к серверу БД на виртуальной машине web-server
. Причем еще ухитрились подключиться на порту 3307, хотя порт по умолчанию для MySQL — 3306.
Дело в том, что хост по умолчанию для mysql-клиента — это localhost
. А в этом случае подключение происходит с использованием unix-сокета. И порт может быть любым — он вообще не используется. Но нам нужно сетевое подключение, т.е. с использованием tcp-сокета. Тут есть два пути решения — либо указать протокол TCP, либо указать хост 127.0.0.1 (вместо значения по умолчанию localhost
):
$ mysql -uroot -pqwerty -P 3307 --protocol=TCP
$ mysql -uroot -pqwerty -P 3307 -h 127.0.0.1
Аутентификация по ключу
Чтобы не вводить пароль каждый раз при создании туннеля — настроим аутентификацию по ключу. Сначала для физического компьютера, потом для виртуальной машины web-server
. Эти ключи будут нужны для построения двух туннелей через промежуточный сервер:
Но перед этим надо изменить настройку ssh-сервера:
PubkeyAuthentication yes
$ sudo systemctl restart ssh
Ключи для физического компьютера
Открываем окно PowerShell на физической машине и создаем пару ключей с именем tcp-forward-ssh-server
:
> ssh-keygen
Копируем публичный ключ на ssh-server
:
> cat .\.ssh\tcp-forward-ssh-server.pub | ssh -p 2222 evgeniy@192.168.110.8 ` > 'cat >> ./.ssh/authorized_keys'
Создаем или редактируем файл ~/.ssh/config
# Проброс соединения 192.168.110.2 ==L==> 192.168.110.8 Host local-forward-ssh-server HostName 192.168.110.8 Port 2222 User evgeniy IdentityFile ~/.ssh/tcp-forward-ssh-server LocalForward 3307 127.0.0.1:3306 # Проброс соединения 192.168.110.2 <==R== 192.168.110.8 Host remote-forward-ssh-server HostName 192.168.110.8 Port 2222 User evgeniy IdentityFile ~/.ssh/tcp-forward-ssh-server RemoteForward 3306 127.0.0.1:3306
Теперь можно упростить команды построения туннелей:
> ssh -p 2222 -L 3307:127.0.0.1:3306 evgeniy@192.168.110.8 # вместо этой команды > ssh local-forward-ssh-server # теперь можно использовать такую
> ssh -p 2222 -R 3306:127.0.0.1:3306 evgeniy@192.168.110.8 # вместо этой команды > ssh remote-forward-ssh-server # теперь можно использовать такую
Ключи для виртуальной машины
Открываем окно терминала на виртуальной машине и создаем пару ключей с именем tcp-forward-ssh-server
:
> ssh-keygen
Копируем публичный ключ на ssh-server
:
$ ssh-copy-id -p 2222 -i ~/.ssh/tcp-forward-ssh-server.pub \ > evgeniy@192.168.110.8
Создаем или редактируем файл ~/.ssh/config
# Проброс соединения 192.168.110.8 ==R==> 192.168.110.12 Host remote-forward-ssh-server HostName 192.168.110.8 Port 2222 User evgeniy IdentityFile ~/.ssh/tcp-forward-ssh-server RemoteForward 3306 127.0.0.1:3306 # Проброс соединения 192.168.110.8 <==L== 192.168.110.12 Host local-forward-ssh-server HostName 192.168.110.8 Port 2222 User evgeniy IdentityFile ~/.ssh/tcp-forward-ssh-server LocalForward 3307 127.0.0.1:3306
Теперь можно упростить команды построения туннелей:
> ssh -p 2222 -R 3306:127.0.0.1:3306 evgeniy@192.168.110.8 > ssh remote-forward-ssh-server
> ssh -p 2222 -L 3307:127.0.0.1:3306 evgeniy@192.168.110.12 > ssh local-forward-ssh-server
Поиск: Linux • MySQL • SSH • Команда • Конфигурация • Настройка • Сервер • Клиент • Порт • Туннель • Ключ