我正在使用从我的Windows框转发的本地到远程端口访问远程数据库。它就像一个使用putty进行端口转发的魅力,但是当我尝试使用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服务器的端口,我的数据库服务器正在端口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
答案 0 :(得分: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
请注意,在这种情况下,'localhost'是相对于您通过ssh连接的主机(即远程主机)进行解释的。