Problema reverso do túnel SSH

1

Estou trabalhando na criação de um PC Ubuntu não-assistido com o Ubuntu Server 12.04 Mínimo, e como este PC será colocado em um local remoto sem teclado ou tela (sem supervisão), eu preciso ter uma conexão SSH permanente a partir deste máquina para um middle-server (entre ele e eu) - razão de ser, este PC estará por trás de um firewall NAT.

Eu segui as instruções ponto-a-ponto em link mas quando me conecto, acabo de receber um erro Citar: ssh: conecta-se ao host 5.175.145.251 porta 19999: Conexão recusada Então voltei pesquisando uma solução e encontrei link

Surpreendentemente, a solução da Alexonlinux funcionou imediatamente.

Vendo isso, eu tentei o método anterior, desta vez usando o Port 6333, mas sem sorte. Então eu tentei o método de Alexonlinux usando Port 19999 e novamente funciona bem.

O motivo pelo qual não posso me ater à solução do Alexonlinux é que ele requer que alguns comandos sejam inseridos no PC por trás do NAT, e isso não é possível no meu caso.

Eu realmente me pergunto o que poderia estar parando a conexão ao usar o método de Fabelier. Talvez o script não esteja carregando? Eu tentei executar manualmente o script, mas ainda sem sorte.

também defini

GatewayPorts yes

no PC por trás do NAT.

Para registro, aqui está o script que eu usei do método de Fabalier:

a='ps -ef | grep 19999 | grep -v grep'
if [ ! "$a" ]; then
    ssh -fN -R 19999:localhost:22 <middle-usename>@<middle-hostname>
fi

(obviamente eu mudei o @ para o necessário) Eu tive que mudar a primeira linha porque os colchetes não eram aceitáveis.

Gostaria muito de receber ajuda sobre isso, pls.

    
por user93078 11.01.2013 / 11:31

1 resposta

0

Encontrei esse script de expectativa que alguém havia escrito. Funciona para mim - tenho dispositivos remotos / não assistidos por trás do firewall e do roteamento de propriedade de outras empresas. Em vez de ter que trabalhar com eles para expor minha porta ssh para o mundo através do encaminhamento de porta para que eu possa acessar os dispositivos, eu queria poder usar o SSH reverso. Então construí meu próprio sistema para contornar isso.

O lado do servidor executa um PHP & amp; Site baseado em MySQL. Eu posso clicar em um dispositivo e ir para a página dele. Clico no botão "Reverse SSH", que coloca o comando "Reverse SSH" no banco de dados com o ID do dispositivo.

No lado do cliente, eu tenho um script python que é executado a cada minuto via crontab. Toda vez que ele é executado, ele relata as informações de integridade do sistema, carga da cpu, memória, espaço em disco, etc via HTTP para o servidor. Durante essa transação HTTP, se um comando estiver aguardando o dispositivo que fez check-in, eu mando o comando de volta. O lado do cliente, em seguida, corresponde a esse comando e executa uma chamada para bash "esperar /path/to/client/reversessh.expect".

O script expect é preenchido com o meu servidor ssh info (sim, eu sei que é "inseguro", mas funciona por enquanto.) e estabelece a conexão SSH reversa por até 1 hora (você pode configurá-lo para mais tempo se você precisa). Eu posso então entrar no dispositivo remoto da minha localidade.

O servidor que estou executando é o Ubuntu Server 14.04, e os dispositivos remotos variam de servidores black e virtual beaglebone a PCs de mesa, RPi e RPi2.

Nos sistemas baseados no debian, eu instalo o expect através do apt-get:

apt-get install espera

Aqui está o script expect, modifique-o conforme necessário. Pode demorar um pouco para fazê-lo funcionar, mas funciona. Espero que a formatação não seja complicada, é difícil copiar e colar um grande bloco de código como este e fazer com que ele funcione corretamente:

Exemplo reversssh.expect

#!/usr/bin/expect -f
#Author: g0 2010 , kod.ipduh.com 
#License:Same as Expect - Public Domain
#revtun sets up a reverse ssh tunnel  
#ssh example: ssh -R 1025:localhost:22 -p 443 [email protected] -fN
#Hardcode the arguments or pass them at this order on the command line
#eg:$revtun 1025 22 443 user 192.0.2.123 password http://kod.ipduh.com

set remoteport "1234" # this is the port on your server that will serve the tunnel
set localport "22" # ssh port of remote/target device
set port "2222" # This is the port in which the remote device will ssh into your server. If you use standard port for ssh on server then it is, it's 22.
set user "" #ssh user on your server 
set host "" # server host ie blah.com or 123.123.123.123
set password "" # user password for servers ssh user
set report_to "" # I never used this...see below line that starts with curl. In your web server php script do <?php print_r($_GET); ?>

if {$argc > 0} { set remoteport [lindex $argv 0] } 
if {$argc > 1} { set localport [lindex $argv 1] } 
if {$argc > 2} { set port [lindex $argv 2] } 
if {$argc > 3} { set user [lindex $argv 3] } 
if {$argc > 4} { set host [lindex $argv 4] } 
if {$argc > 5} { set password [lindex $argv 5] } 
if {$argc > 6} { set report_to [lindex $argv 6] } 

set message "m"

set timeout 3600 # number of seconds to keep the tunnel open, this is set to 1 hour.

set pid [spawn ssh -N -R $remoteport:localhost:$localport $user@$host -p $port]
while {1} {

        expect -nocase -re ".*yes/no?.*" {
                send "yes\r"
        } -nocase -re "password*" {
                send -- "$password\r\n"
                #send -- "\n"
        } -re "(%|\\$|#) " {
                set message "$message-prompt"
                break
        } eof {
                set message "$message-eof"
                break
        } -re "incorrect|invalid" {
                set message "$message-incorrect"
                break
        } -nocase -re ".*Warning.*" {
                set message "$message-warning"
                break
        } timeout {
                set message "$message-timeout"
                break
        }

}


set user "$env(USER)"
exec curl $report_to?$user-$message --silent >/dev/null

#1 hour max connection time used to keep the script running

E se você quiser mantê-lo em execução se / quando ele cair, eu usaria o cron para executar um script bash para verificar se o programa sshd está rodando, se não estiver rodando, inicie, caso contrário, não faça nada. Se você tiver outras conexões SSH em andamento, verificar o sshd pode não funcionar para você. Como esse script SSH reverso é a única atividade SSH nos dispositivos remotos, funciona para mim. No meu sistema, posso matar a conexão SSH reversa em um dispositivo disparando outro comando para o dispositivo remoto quando ele faz check-in, "Desconectar SSH reverso", e isso faz com que o lado do cliente execute este comando com bash:

kill 'pidof sshd'

Edite seu crontab com:     crontab -e

As primeiras 6 linhas do arquivo crontab abaixo são boas para serem especificadas, você pode querer editá-las do seu jeito.

Exemplo de crontab

MAILTO="" # local mail address to get cron messages, leave blank to disable
SHELL=/bin/bash 
USER=root # run these cron jobs as root user
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/root # root users home dir
LOGNAME=root

# Example check reverse SSH connection - runs every minute
* * * * * bash /path/to/check_reverse_ssh.bash

Exemplo de check_reverse_ssh.bash

#!/bin/bash
process_id='ps aux | grep "sshd" | grep -v "grep"'
if [ -z "$process_id" ]; then
    echo "process not running for certain."
    expect /path/to/reversessh.expect &
else 
    echo "sshd is running, If so, your tunnel should be good to go";
fi

Boa sorte!

    
por John 25.07.2015 / 08:51