mysql через туннель SSH не работает из-за localhost [duplicate]

Быстрый вопрос - я запускаю два linux-компьютера, один - мой собственный рабочий стол, а другой - мой VPS. В целях безопасности на VPS я выбрал сокетные соединения с MySQL (/var/run/mysqld/mysql.sock). Я знаю, что могу установить туннель следующим образом: ssh -L 3307:127.0.0.1:3306 user@site.com, если я настрою удаленный sql-сервер на прослушивание какого-то порта, но я хочу знать, могу ли я сделать что-то вроде: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock, тем самым туннелируя два сокета, а не два порта?

Вполне приемлемым решением было бы также перенаправить локальный порт в файл удаленного сокета, но по возможности я стараюсь не иметь запущенных tcp-серверов на удаленном компьютере.

(и да, я знаю, что tcp было бы проще).

35
задан 11 February 2013 в 12:27
3 ответа

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

Ты можешь и то, и другое: UNIX=>TCP и UNIX=>UNIX forwarding.

Например:

ssh \
  -R/var/run/mysql.sock:/var/run/mysql.sock \
  -R127.0.0.1:3306:/var/run/mysql.sock \
  somehost

Это возможно, так как OpenSSH 6.7.

43
ответ дан 4 January 2021 в 10:00

Начиная с ssh 6.7, socat больше не нужен. Вы можете пересылать сокеты домена unix напрямую, например:

ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote

Подробнее: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160

5
ответ дан 4 January 2021 в 10:00

Еще одна модификация ответа @mpontes '/ @ javier, что

ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Cleaner

ssh user@remoteserver -L 9999:localhost:9999 '
  socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
  pid=$!
  trap "kill $pid" 0
  while echo -ne " \b"; do
    sleep 5
  done
'

PROS

  1. Работает на openssh ранее, чем 6.7 (например, CentOS 7)
  2. Убивает socat на ssh завершение работы вместо повторного использования ssh на удаленном сервере
  3. Разрешает закрытый вход в систему ssh (в отличие от решения ijk).

Функция

  1. Поскольку параметр -f не используется, вы можете либо использовать открытый ключ и работать в фоновом режиме через и , либо вы можете войти в систему в интерактивном режиме и использовать Ctrl + Z и использовать тот же $! для сохранения pid.

МИНУСЫ

  1. Нельзя легко использовать параметр -f ssh, так как в этом случае вы потеряете pid ssh. Этот метод основан на запуске на переднем плане и Ctrl + C для уничтожения.
  2. Гораздо сложнее

Объяснение

  • socat ... & - запустить socat в фоновом режиме на удаленном сервере
  • pid = $ ! - сохранить pid
  • trap kill \ $ pid 0 - запустить kill $ pid при завершении bash
  • while:; спать ... - сесть в бесконечный цикл
  • echo -ne \ \ b - Эхо-пробел, за которым следует возврат. Это не удается, как только отключается ssh. В режиме сна 5 это означает, что socat может работать до 5 секунд после ssh

Примечание: Фактически протестировано с использованием докера, порт 2375 , /var/run/docker.sock и переменная среды DOCKER_HOST = 'tcp: // localhost: 2375' , но все равно должно работать для mysql

Обновление

Используя SSH Controls , вы можете использовать свой флаг -f , просто добавьте следующие флаги

-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto

И вы получите

ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Теперь вы можете завершить все контролируемые сеансы с использованием

ssh -o ControlPath=~/.ssh/%C -O exit remoteserver

Параметры -o могут быть сохранены в вашем .ssh / config , или вы можете использовать вместо него -S (но вам все равно понадобится -o ControlMaster )

2
ответ дан 4 January 2021 в 10:00

Теги

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