Переадресация локального на удаленный порт с использованием Ruby/Net::SSH для удаленного подключения к базе данных
Я получаю доступ к удаленной базе данных, используя локальную переадресацию портов из окна 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 ответ
Изменить второй remote_host
в 'localhost'
, Ваш сервер базы данных, вероятно, связан только с 127.0.0.1 (localhost), но ваш SSH-перенаправитель отправляет пакеты на ваш внешний IP-адрес (полученный путем разрешения remote_host
).
Сш к линуксу и запускай 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, т.е. удаленного хоста.