Быстрый вопрос - я использую два 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 будет проще).
Ответы:
Переадресация локального сокета по требованию
socat
на обоих концахтогда
украдено из переадресации доменных сокетов unix с помощью ssh и socat
источник
Хотя в то время, когда задавался вопрос, это было действительно невозможно, но в настоящее время это возможно.
Вы можете сделать следующее: UNIX => TCP и UNIX => UNIX forwarding.
Например:
Это возможно начиная с OpenSSH 6.7.
источник
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
я этого не делал, но я бы попробовал с сокатом . может быть что-то вроде:
опять же, я никогда не делал ничего подобного.
источник
Больше не требуется socat, так как ssh 6.7. Вы можете пересылать доменные сокеты Unix напрямую, например:
Дополнительная информация: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
источник
Еще одна модификация ответа @mpontes '/ @ javier,
Очиститель
ПРОФИ
Характерная черта
-f
опция не используется, вы можете либо использовать открытый ключ и запускать его в фоновом режиме,&
либо войти в систему в интерактивном режиме и использовать Ctrl + Z и использовать то же самое$!
для хранения pid.МИНУСЫ
-f
опцию ssh, так как вы потеряете pid ssh таким образом. Этот метод основан на запуске на переднем плане и Ctrl + C, чтобы убить.объяснение
socat ...&
запустить socat в фоновом режиме на удаленном сервереpid=$!
- хранить пидtrap kill\ $pid 0
- запуститьkill $pid
по окончании bashwhile :; sleep...
- сидеть в бесконечной петлеecho -ne \ \b
- Эхо-пробел с последующим возвратом. Это терпит неудачу, как только ssh отключен. Сsleep 5
, это означает, чтоsocat
может работать до 5 секунд после SSHПримечание: На самом деле протестированы с использованием докер, порт
2375
,/var/run/docker.sock
и переменную окруженияDOCKER_HOST='tcp://localhost:2375'
, но должны работать для всех MySQL то же самоеОбновить
Используя SSH Controls , вы можете использовать
-f
флаг, используя мой способ, просто добавьте следующие флагиИ вы получите
Теперь вы можете завершить все контролируемые сеансы, используя
Эти
-o
параметры могут быть сохранены в вашем.ssh/config
файле, или вы можете использовать вместо -S (но все равно нужно-o ControlMaster
)источник
docker run ... connect.sh
чтобы настроить туннель, сопровождаемыйdocker run ... deploy.sh
. Я попробовалnohup
,&
и ,disown
но они , кажется, сломатьsocat
, закрываяstdout
и запускаяkill
. Любые идеи для твиков, чтобы поддержать этот случай (то есть все еще близки, когда SSH делает, но переживают отречение)?-f
и& disown
) в терминале. Видимо проблема создана скриптом «обертка». Я бы приветствовал вклад, но сейчас смотрю на более подходящие вопросы и ответы.docker run ... connect.sh
, иdocker exec {container name/id} deploy.sh
они играют вместе.exec
ужеrun
контейнер, а канал SSH не сохранился послеexec
завершения. Я пояснил, что это было связано со странностью способа выполнения сценариев. Если я переместил вызов в свой собственный сценарий и вызвалnohup <script.sh> & disown
его, он выживет после завершенияexec
.Развивая ответ Хавьера, это работает для меня:
ssh -f xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Вам нужно
fork
, чтобы иметь возможность подключаться несколько раз, не умирая, как только вы закроете первое соединение. Кроме того, socat позволяет вам указать адрес для привязки, используяbind
опцию, а не как адрес перед портом.После этого просто подключитесь
localhost:9999
как обычно. Затем снести туннель:ssh -f xxx@yyy.zzz "killall socat"
(или что-то подобное, вы можете сделать более сложные вещи, которые включают в себя сохранение PID socat)
источник
Да, вы можете использовать socat.
Сначала сделайте TCP-туннель с SSH. Затем используйте socat следующим образом:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Затем дайте разрешения на новый созданный сокет (может быть chmod 777)
источник
chmod 777
: нет-нет-нет-нет-нет! Никогда не бегайchmod 777
. Это практически никогда не требуется! Даже для "тестирования". Если файл доступен для чтения, значит, он доступен для чтения. Если он может быть записан темuser
или иным пользователемgroup
, то он доступен для записи. Абсолютно нет нужды давать всем права на запись, а забывать оchmod
чем-то вменяемом - это то, как транснациональные корпорации взламываются. Просто не делай этого. Когда-либо. Я написал введение в разрешения Unix . Пожалуйста, прочитайте это!