使用Net :: SSH :: Gateway设置隧道(挂在.new)

就像在使用net / ssh / gateway建立到mysql的ssh隧道一样 ,我正在尝试使用Net :: SSH :: Gateway建立到远程服务器的隧道以进行端口转发。 但是我在这个过程中遇到了困难! 🙂

TL; DR

如何调整OpenSSL和Net :: SSH :: Gateway.new()以便隧道连接到远程服务器?

什么有用……

可以通过在后台启动ssh进程设置隧道,如下所示:

remote_addr =  remote_user =  ssh -f -N -L 3307:#{remote_addr}:3306 #{remote_user} 

并在我的rails代码中:

 # config/database.yml ... remote_db: adapter: mysql2 database:  username:  password:  host: 127.0.0.1 port: 3307 

这一切都有效。

什么不……

但是当我尝试以下操作时(当然没有在后台启动ssh),它会因“拒绝连接”而失败:

 >> require 'net/ssh/gateway' >> remote_addr =  >> remote_user =  >> gateway = Net::SSH::Gateway.new(remote_addr, remote_user, :port => 3306, :verbose => :debug) D, [2014-12-04T07:56:50.720603 #32532] DEBUG -- net.ssh.transport.session[3fe0d1587180]: establishing connection to some_remote_server.com:3306 ... then after a delay ... Errno::ECONNREFUSED: Connection refused - connect(2) for "some_remote_server.com" port 3306 

我也尝试了没有端口规范(所以它使用端口22),这导致超时:

 >> gateway = Net::SSH::Gateway.new(remote_addr, remote_user, :verbose => :debug) D, [2014-12-04T07:59:17.722649 #32532] DEBUG -- net.ssh.transport.session[3fe0d156efb8]: establishing connection to some_remote_server.com:22 Errno::ETIMEDOUT: Operation timed out - connect(2) for "some_remote_server.com" port 22 

钥匙的位置

我怀疑OpenSSL可能没有找到我的证书。 当我在详细模式下运行ssh时,我可以在〜/ .ssh / id_rsa中看到它提供并接受我的公钥。 但即使我明确地将我的密钥文件作为参数传递:

 gateway = Net::SSH::Gateway.new(remote_addr, remote_user, :keys => ['/Users/home/.ssh/id_rsa'], :port => 3306, :verbose => :debug) 

……它似乎没有什么区别。

我的问题:

  • 我将哪些参数传递给Net::SSH:Gateway.new()以便它模拟对ssh -N -L ...的调用ssh -N -L ...
  • 如果我收到ECONNREFUSED或ETIMEDOUT响应,因为OpenSSL无法找到我的证书,我该如何判断它在哪里?

好吧,这是一个简单修复的愚蠢问题。 尽管我很尴尬,但我发布了解决方案以防其他人认为它有用。

简而言之,如果你一直在运行这样的ssh:

 remote_addr =  remote_user =  ssh -f -N -L 3307:#{remote_addr}:3306 #{remote_user} 

你可能想要:

  require 'net/ssh/gateway' gateway = Net::SSH::Gateway.new("somehost.com", "some_remote_user") port = gateway.open(remote_addr, 3306, 3307) 

我在OP中获得ECONNREFUSED和ETIMEDOUT的原因仅仅是因为我试图连接到错误的服务器。