Como sei se meu túnel ssh foi criado com sucesso?

21

Confio no seguinte script tunnel.shescrito por outras pessoas para manter vivo um túnel ssh:

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

Para criar um túnel ssh persistente, eu apenas emito tunnel.sh. O túnel não será fechado até eu emitir tunnel.shnovamente.

Eu queria saber como posso verificar se o túnel ssh é realmente criado com sucesso?

Meu principal uso do túnel é imprimir documentos em algumas impressoras na mesma LAN que o servidor, e as impressoras só podem ser acessadas de dentro da LAN. Depois de criar um túnel, agora a impressão não apresenta nenhum problema, mas como não estou lá fisicamente, não consigo verificar se os documentos foram realmente impressos.

Pensei que, agora que estou na LAN, graças ao túnel, meu IP externo deve ser o mesmo do servidor. Mas, na verdade, eles não são os mesmos (eu os descobri por wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). Eu quero saber porque? Quando eu me conecto a algum site da Internet com o túnel ativo, o servidor não é o ponto intermediário entre mim e o site da Internet na conexão, devido ao túnel entre mim e o servidor?

Tim
fonte

Respostas:

25

Isso é muito mais complicado do que precisa ser :-)

Inicie o túnel:

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

Pare o túnel:

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

É tudo o que você precisa fazer. Se você quiser os detalhes, pule abaixo.

Para sua segunda pergunta, a IP. Não, seu IP não muda. Tudo o que você fez foi criar um proxy SOCKS através do host remoto. Seu sistema não usa esse proxy automaticamente, a menos que você o solicite.

Explicação do SSH
Argumentos para iniciar o túnel
-f:: Diga ao ssh para o segundo plano. Ele só terá um plano de fundo se iniciar com êxito (coopera com o -oargumento abaixo).
-o ExitOnForwardFailure=yes: Isso diz ao ssh para sair se não puder configurar o proxy SOCKS.
-N: Não execute um comando. Nós apenas queremos fazer um túnel, não fazer nada no host remoto.
-D 9999: O seu proxy SOCKS.
-M: Isso é necessário para o argumento -S funcionar aqui.
-S /tmp/ssh_tunnel_%h.sock: Isso diz para usar /tmp/ssh_tunnel_HOSTNAME.sock em seu soquete de controle. A -Mopção informa que o ssh precisa configurar esse soquete e não emitir comandos para outro ssh já escutando no soquete. Você pode usar esse soquete para configurar túneis adicionais depois que o ssh já estiver em execução. o%h usa o nome do host do host remoto como parte do nome do arquivo.

Argumentos para parar o túnel
-S /tmp/ssh_tunnel_%h.sock:: Isso deve ser óbvio. No entanto, como não emitimos um -M, isso significa que o ssh deve se conectar ao soquete que já está lá e dizer o que fazer em vez de fazer qualquer coisa.
-O exit: Isso faz parte do -S. Dizemos ao ssh que está ouvindo no soquete para sair.
O $SSH_HOSTainda é necessário aqui. Mesmo se você especificar um caminho de soquete absoluto, sem usar %ho nome do arquivo, o ssh ainda desejará que um host remoto seja especificado. É por isso que eu coloquei %ho argumento. É melhor usá-lo se o ssh solicitar o host e manter as coisas organizadas.

Patrick
fonte
5

Este tipo de túnel não altera suas informações de endereço IP. Tudo o que faz é dizer ao seu computador para abrir a porta 9999 e encaminhar conexões para essa porta para a máquina remota (tim @ server) por meio da sua conexão ssh. A maneira mais fácil de testar se a conexão está ativa é telnetar para a porta na qual o encaminhamento foi criado (no seu exemplo 9999):

$ telnet localhost 9999
Tentando servidor ...
Conectado ao servidor.
O caractere de escape é '^]'.

Se você receber o "Conectado ao servidor". mensagem, isso significa que seu túnel está aberto. Se, em vez disso, você obtiver: "Não foi possível conectar ao host remoto: conexão recusada", seu túnel não está ativo.

Quanto à sua segunda pergunta, para o seu navegador, ele não usará o túnel, a menos que você o solicite. Nas configurações de rede dos navegadores, você pode definir as configurações de proxy e especificar localhost: 9999 como um proxy socks5 e, em seguida, suas conexões da Web devem usar o túnel ssh e parecer vir do endereço IP do servidor.

Gabe.
fonte
+1 Obrigado! (1) Quando imprimo em uma impressora na LAN, como ele sabe ir para a porta 9999, ou seja, usar o túnel? Nada mais? (2) Existem tipos de túneis que alteram as informações do meu endereço IP?
Tim
@ Provavelmente, essa impressora específica foi configurada para imprimir em um endereço IP e porta específicos. Isso depende de como a sua impressora está configurada. Geralmente, você pode especificar os dois ao definir uma impressora. Sim, existem tipos de túneis que terão suas próprias informações de IP associadas a eles. Geralmente, você cria uma interface tun / tap separada en.wikipedia.org/wiki/TUN/TAP , que terá seu próprio endereço IP anexado, e todo o tráfego que sai desse endereço parecerá vir de uma rede diferente .
Gabe.
Obrigado! Nas preferências do Firefox, em avançadas -> conexão -> configurações, escolho a configuração manual do proxy e digite "localhost" para HTTP Proxy e "9999" para sua porta. Depois disso, não consigo me conectar a nenhum site no Firefox. Eu quero saber porque?
Tim
@ Tim é um pouco confuso ... a coisa certa a ser definida é: SOCKS Host, e não HTTP Proxy. Eu tive esse mesmo problema na primeira vez que tentei isso.
Gabe.
1

No meu caso (Google Chrome no Ubuntu 14.10), meu endereço externo muda, pelo menos no navegador. Apenas google "Qual é o meu endereço IP?" com e sem a conexão proxy.

Além disso, depois de configurar o proxy, tente destruir o túnel e veja se você ainda pode obter tráfego. Quando faço isso, o chrome retorna um erro "Não foi possível conectar-se ao servidor proxy".

Outra maneira: após o tunelamento para o host remoto, crie uma nova sessão ssh e execute tcpdump -A dst port 80. Em seguida, navegue para alguma página e você verá o tráfego relacionado no terminal.

onlyanegg
fonte