Переадресация SSH-порта на хост, которому необходимо связаться с третьим хостом для доступа к MySQL

Мы настраиваем и поддерживаем стандартные веб-приложения, которые наши клиенты размещают на управляемых серверах от разных веб-хостеров. Обычно приложение состоит из веб-приложения на PHP и базы данных (в основном MySQL).

Для наших клиентов мы хотим предложить услугу резервного копирования, которая выходит за рамки того, что предлагают веб-хостеры (обычно четыре недели хранения). Мы хотим сделать резервную копию веб-приложения (без проблем) и базы данных (проблема).

У одного из веб-хостеров есть настройка, которая запрещает пользователю доступ к базе данных MySQL с помощью mysql.sock, Вместо этого у них есть отдельное имя (например, user123.mydatabaseserver.com) для самого управляемого сервера. Подключение к базе данных возможно только с помощью -h параметр для mysql, как это:

mysql -u mydbuser -p -h user123.mydatabaseserver.com

Теперь обычно мы создаем резервные копии баз данных с нашего сервера резервного копирования, используя туннель SSH, который подключается к работающему управляемому серверу и через порт перенаправляет порт MySQL на сервер резервного копирования, затем подключаемся к базе данных на сервере резервного копирования через туннель и запускаем mysqldump с переадресованным портом. Однако из-за принудительного параметра имени хоста это невозможно в этом случае.

Нам известно, что мы можем подключиться к управляемому серверу, скопировать туда базу данных, а затем скопировать полученный файл резервной копии, используя scp или какой-то другой мерой, но я хотел посмотреть, не пропустил ли я что-то, что позволило бы нам не использовать время хранения и / или вычисления живого управляемого сервера для этой резервной копии.

Есть ли решение, использующее только переадресацию портов?

Редактировать 1: пытаясь прояснить проблему

Сервер A (система резервного копирования) Сервер B (сервер приложений) Сервер C (сервер базы данных)

Сервер A должен создать резервную копию базы данных на сервере C. Однако разрешения на доступ к MySQL позволяют только серверу B подключаться к серверу C и обращаться к базе данных.

В этом конкретном случае сервер B и сервер C имеют один и тот же IP-адрес, но, похоже, хостер отключил доступ к MySQL через сокеты и разрешает только соединения TCP/IP.

В то же время у меня возникла идея связать порт SSH вперед:

Свяжите порт 22222 на сервере B с портом 3306 на сервере C, затем привяжите 44014 на сервере A к 22222 на сервере B. Однако попытка SSH подключиться к серверу C с сервера B приводит к сообщению об ошибке: host address xxx.xx.xxx.xx not allowed.

1 ответ

Вам не нужен SSH-туннель для перехода от B к C, так как веб-приложение на B подключается к C с помощью обычных сокетов, верно?

На сервере A вы должны вызвать SSH следующим образом:

ssh -L44014:serverc:3306 user@serverb

Это устанавливает SSH-туннель между A и B. Когда ваш процесс резервного копирования, работающий на сервере A, подключается к localhost:44014, туннель заставит процесс sshd на сервере B подключиться к порту 3306 на сервере C. С точки сервера C Представьте, что соединение будет исходить от сервера b через некоторый случайный клиентский порт.

Если вы хотите использовать это в скрипте, вы также можете передать -N возможность избежать порождения оболочки, просто сделайте порт вперед. Таким образом, вы можете запустить команду в фоновом режиме и убить ее, когда вам больше не нужен туннель:

ssh -NL44014:serverc:3306 user@serverb &
TUNNEL_PID=$!
# do the backup on localhost:44014
kill $TUNNEL_PID

Если администраторы сервера B отключили переадресацию локальных портов, вы можете использовать socat подражать этому поведению, но это немного сложнее. Здесь мы порождаем один socat локально, чтобы заставить данные проходить через ssh stdio, и удаленный socat, чтобы перенаправить их в соответствующий сокет. Чтобы это работало, у вас должен быть уже работающий ssh ​​без пароля:

socat TCP-LISTEN:44014 EXEC:"ssh user@serverb socat STDIO TCP:serverc:3306"
Другие вопросы по тегам