Переадресация локального на удаленный порт с использованием Ruby / Net :: SSH для удаленного подключения к БД - PullRequest
3 голосов
/ 02 июня 2010

Я получаю доступ к удаленной базе данных с помощью перенаправления локального на удаленный порт из окна Windows. Он работает как шарм, используя замазку для переадресации портов, но не работает, когда я пытаюсь переслать с помощью Ruby / Net :: SSH Вот мой фрагмент кода:

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

Порт, перенаправленный на google.com, работает нормально при тестировании в браузере. Переадресация порта на мой сервер linux, где мой db-сервер прослушивает порт 1234, не работает. Когда я пытаюсь подключиться к localhasot: 4444, соединение зависает. Журналы:

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

А потом ничего!

Я использую net-ssh 2.0.22 / ruby ​​1.8.7

1 Ответ

1 голос
/ 05 апреля 2012

Измените второе значение remote_host на 'localhost'. Возможно, ваш сервер базы данных привязан только к 127.0.0.1 (localhost), но ваш SSH-перенаправитель отправляет пакеты на ваш внешний IP-адрес (полученный путем разрешения remote_host).

Ssh в окно linux и запустите sudo netstat -n --tcp --listen -p. Например, я вижу это:

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

, что означает, что postgres прослушивает только 127.0.0.1 (значение Local Address). Если я запускаю команду psql -h 127.0.0.1, я могу подключиться к своей базе данных. Но если я выполню команду psql -h <hostname> или psql -h <my external IP>, соединение будет отклонено.

Кроме того, если у меня ssh.forward.local(4444, remote_host, 5432), я не могу подключиться к своей базе данных через порт forward. Но если у меня есть ssh.forward.local(4444, 'localhost', 5432), я могу подключиться.

Попробуйте это:

Net::SSH.start(remote_host, user_name, :password => password) do |ssh|
  ssh.forward.local(4444, 'localhost', 1234)
  ssh.loop { true }
end

Обратите внимание, что «localhost» в этом случае интерпретируется относительно хоста, к которому вы подключились через ssh, то есть удаленного хоста.

...