Pergunta rápida - Eu corro duas caixas Linux, uma na minha própria área de trabalho e a outra no meu VPS. Por motivos de segurança no final do VPS, optei por conexões de soquete ao MySQL ( /var/run/mysqld/mysql.sock
). Eu sei que posso fazer um túnel assim: ssh -L 3307:127.0.0.1:3306 [email protected]
se eu configurar o servidor sql remoto para escutar em alguma porta, mas o que eu quero saber é que posso fazer algo assim: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
encapsulando assim dois soquetes, em oposição a duas portas?
Uma solução perfeitamente aceitável também seria encaminhar uma porta local para o arquivo de soquete remoto, mas sempre que possível, estou tentando não ter servidores tcp em execução na caixa remota.
(e sim, eu sei que o tcp seria mais fácil).
Respostas:
Encaminhar um soquete local sob demanda
socat
nas duas extremidadesentão
roubado do encaminhamento de soquetes de domínio unix com ssh e socat
fonte
Durante o tempo em que a pergunta foi feita, era realmente impossível, mas é possível hoje em dia.
Você pode: UNIX => TCP e UNIX => encaminhamento UNIX.
Por exemplo:
É possível desde o OpenSSH 6.7.
fonte
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
eu não fiz isso, mas eu tentaria com socat . talvez algo como:
novamente, eu nunca fiz nada assim.
fonte
Não é necessário mais socat desde o ssh 6.7. Você pode encaminhar soquetes de domínio unix diretamente como:
Mais informações: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
fonte
Outra modificação da resposta @mpontes '/ @ javier que
Limpador
PROS
Característica
-f
opção não é usada, você pode usar uma chave pública e executar em segundo plano via&
ou pode fazer logon interativamente e usar Ctrl + Z e usar o mesmo$!
para armazenar o pid.CONS
-f
opção ssh, pois você perderá o pid do ssh dessa maneira. Esse método depende da execução em primeiro plano e Ctrl + C para matar.Explicação
socat ...&
- execute socat em segundo plano no servidor remotopid=$!
- armazene o pidtrap kill\ $pid 0
- executarkill $pid
na terminação do bashwhile :; sleep...
- sente-se em um loop infinitoecho -ne \ \b
- Espaço de eco seguido de backspace. Isso falha assim que o ssh é desconectado. Com asleep 5
, isso significa quesocat
pode executar até 5 segundos após o sshNota: Na verdade testados usando janela de encaixe, a porta
2375
,/var/run/docker.sock
e variável de ambienteDOCKER_HOST='tcp://localhost:2375'
, mas deve funcionar para todos mysql o mesmoAtualizar
Usando os controles SSH , você pode usar a
-f
bandeira do meu jeito, basta adicionar as seguintes bandeirasE você terá
Agora você pode encerrar todas as sessões controladas usando
As
-o
opções podem ser salvas no seu.ssh/config
arquivo ou você pode usar -S (mas ainda precisará-o ControlMaster
)fonte
docker run ... connect.sh
para configurar o túnel seguido pordocker run ... deploy.sh
. Eu tenteinohup
,&
edisown
mas eles parecem quebrarsocat
fechandostdout
e provocando akill
. Alguma idéia de ajustes para apoiar este caso (ou seja, ainda perto quando o SSH sobrevive a uma renúncia)?-f
e& disown
) em um terminal. Aparentemente, o problema foi criado pelo script "wrapper". Gostaria de receber sugestões, mas estou analisando perguntas e respostas mais apropriadas agora.docker run ... connect.sh
, edocker exec {container name/id} deploy.sh
, para que eles joguem juntos.exec
umrun
contêiner já existente e o pipe SSH não persistia após oexec
término. Esclarei que isso se devia a uma peculiaridade na maneira como os scripts são executados. Se eu mudei a chamada para seu próprio script e chameinohup <script.sh> & disown
, ela sobreviverá à conclusão doexec
.Elaborando a resposta de Javier, isso funciona para mim:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Você precisa
fork
se conectar várias vezes sem precisar morrer depois de fechar a primeira conexão. Além disso, a maneira como o socat permite que você especifique um endereço ao qual se vincular é através dabind
opção, não como um endereço antes da porta.Depois disso, basta conectar-se
localhost:9999
normalmente como faria. Então, para desmontar o túnel:ssh -f [email protected] "killall socat"
(ou algo semelhante, você pode fazer coisas mais elaboradas que envolvem manter o PID da sociedade)
fonte
Sim, você pode usar o socat.
Primeiro, faça o túnel TCP com SSH. Então use socat assim:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Em seguida, dê permissões ao novo soquete criado (pode ser o chmod 777)
fonte
chmod 777
: não não não não não! Nunca, nunca corrachmod 777
. Praticamente nunca é necessário! Nem mesmo para "fins de teste". Se o arquivo é legível, é legível. Se for gravável pelouser
ougroup
que precisar ser gravado, será gravável. Não há absolutamente nenhuma necessidade de dar a todos permissão de gravação e esquecer dechmod
lo de volta a algo sadio é exatamente como as multinacionais são invadidas. Apenas não faça isso. Sempre. Eu escrevi uma introdução às permissões do Unix . Por favor, leia!