Locale a remoto port forwarding usando Rubino / Net :: SSH per la connessione remota db
-
23-10-2019 - |
Domanda
Sono l'accesso a un database remoto utilizzando un port forwarding locale a remoto dalle mie finestre di dialogo. Funziona come un fascino utilizzando stucco per il port forwarding, ma fallisce quando provo a trasmettere utilizzando Rubino / Net :: SSH. Ecco il mio frammento di codice:
require 'rubygems'
require 'net/ssh'
Net::SSH.start(remote_host, user_name, :password => password) do |ssh|
ssh.logger.sev_threshold=Logger::Severity::DEBUG
ssh.forward.local(5555, 'www.google.com', 80) # works perfectly
ssh.forward.local(4444, remote_host, 1234) # db connection hangs up
ssh.loop { true }
end
L'attaccante porta a google.com funziona bene durante il test con un browser. La porta avanti per il mio server Linux, dove il mio db server è in ascolto sulla porta 1234, non sta funzionando. Quando provo a connettersi a localhasot: 4444 si blocca di collegamento in su. Registri:
DEBUG -- net.ssh.service.forward[24be0d4]: received connection on 127.0.0.1:4444
DEBUG -- tcpsocket[253ba08]: queueing packet nr 6 type 90 len 76
DEBUG -- tcpsocket[24bde64]: read 8 bytes
DEBUG -- tcpsocket[253ba08]: sent 100 bytes
DEBUG -- net.ssh.connection.channel[24bdcc0]: read 8 bytes from client, sending over local forwarded connection
E poi niente!
sto usando net-ssh 2.0.22 / ruby ??1.8.7
Soluzione
Cambia la seconda remote_host
a 'localhost'
. Il server di database è probabilmente legato solo a 127.0.0.1 (localhost), ma il vostro SSH in avanti è l'invio di pacchetti al vostro indirizzo IP esterno (ottenuto risolvendo remote_host
).
Ssh alla casella di linux e sudo netstat -n --tcp --listen -p
corsa. Per esempio, io vedo questo:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
...
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1552/postgres
che implica Postgres è in ascolto solo su 127.0.0.1 (valore Local Address
). Se faccio funzionare l'ordine psql -h 127.0.0.1
, posso collegarmi al mio database. Ma se faccio funzionare l'ordine psql -h <hostname>
o psql -h <my external IP>
, la connessione viene rifiutata.
Inoltre, se ho ssh.forward.local(4444, remote_host, 5432)
, io sono in grado di connettersi al mio database tramite la porta avanti. Ma se devo ssh.forward.local(4444, 'localhost', 5432)
, io sono in grado di connettersi.
Prova questo:
Net::SSH.start(remote_host, user_name, :password => password) do |ssh|
ssh.forward.local(4444, 'localhost', 1234)
ssh.loop { true }
end
Si noti che 'localhost' in questo caso viene considerato relativo all'host a cui è collegato tramite ssh, cioè l'host remoto.