Создание SSH-туннеля. Часть вторая

27.12.2019

Теги: CLILinuxMySQLSSHUbuntuWindowsВиртуализацияКлючКомандаКонфигурацияНастройкаСервер

Наша следующая задача — с помощью 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 • Команда • Конфигурация • Настройка • Сервер • Клиент • Порт • Туннель • Ключ

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.