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

时间:2014-12-04 16:17:10

标签: ruby-on-rails ssh openssl ssh-tunnel

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

TL; DR

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

什么有效...

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

remote_addr = <some_remote_server.com>
remote_user = <some_remote_server@somehost.com>
ssh -f -N -L 3307:#{remote_addr}:3306 #{remote_user}

并在我的rails代码中:

# config/database.yml
...
remote_db:
    adapter: mysql2
    database: <remote_db_name>
    username: <remote_db_user>
    password: <remote_db_pass>
    host: 127.0.0.1
    port: 3307

这一切都有效。

什么不......

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

>> require 'net/ssh/gateway'
>> remote_addr = <some_remote_server.com>
>> remote_user = <some_remote_server@somehost.com>
>> 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 ...的调用?
  • 如果我收到ECONNREFUSED或ETIMEDOUT回复,因为OpenSSL无法找到我的证书,我该如何判断它在哪里?

1 个答案:

答案 0 :(得分:1)

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

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

remote_addr = <some_remote_server.com>
remote_user = <some_remote_user@somehost.com>
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)

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