2010-06-02 2 views
3

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

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 

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

Я использую нетто-SSH 2.0.22/рубиновый 1.8.7

+0

Попробуйте прокомментировать google вперед и просто сделайте один вперед. Это помогает? – barrycarter

+0

К сожалению, это не сработает. – nakhli

ответ

1

Изменение второй 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), я не могу подключиться к своей базе данных через порт вперед. Но если у меня есть 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 

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

+0

Я попробую, спасибо. – nakhli

Смежные вопросы