Eu desenhei alguns esboços
A máquina em que o comando ssh tunnel é digitado chama-se »seu host« .
Introdução
-
local:
-L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
significa: conecte-se com ssh aconnectToHost
e encaminhe todas as tentativas de conexão para o localsourcePort
para a portaonPort
na máquina chamadaforwardToHost
, que pode ser alcançado a partir da máquinaconnectToHost
. -
remoto:
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
significa: conecte-se com ssh aconnectToHost
e encaminhe todas as tentativas de conexão para o remotosourcePort
para a portaonPort
na máquina chamadaforwardToHost
, que pode ser alcançado a partir de sua máquina local.
Opções adicionais
-
-f
diz ao ssh para se autenticar depois de autenticar, então você não precisa ficar sentado rodando alguma coisa no servidor remoto para o túnel permanecer vivo. -
-N
diz que você deseja uma conexão SSH, mas na verdade não quer executar comandos remotos. Se tudo o que você está criando é um túnel, a inclusão dessa opção economiza recursos. -
-T
desativa a alocação pseudo-tty, que é apropriada porque você não está tentando criar um shell interativo.
Seu exemplo
A primeira imagem representa seu caso. Se você fizer
ssh -L 1081:localhost:3306 remotehost
todas as tentativas de conexão à porta verde 1081
são encaminhadas pelo túnel ssh para a porta cor-de-rosa 3306
no host local do remotehost, ou seja, o próprio host remoto.
Agora seus scripts php podem acessar seu banco de dados via localhost:1081
. Mas o comando netstat
no seu remotehost
não consegue encontrar nada em 1081 (pelo menos não como resultado do túnel).
Porque a porta rosa não é uma porta de escuta criada pelo ssh, mas o destino do encaminhamento. E não está encaminhando para a porta 1081
, mas para 3306
.
O seu servidor db está realmente escutando na porta 3306
ou possivelmente na porta 1081
? Se o último for verdadeiro, seu comando deve ser alterado para ficar assim:
ssh -L 1081:localhost:1081 remotehost
Se o seu banco de dados atende na porta 1081
, você deve encontrá-lo com o netstat (independentemente do ssh).
Espero que isso ajude a esclarecer a confusão.