我正在尝试使用Go创建(然后关闭)通过SSH转发的简单TCP端口。我是Golang和静态类型语言的新手。 (来自Ruby。)

在终端中,我只需运行ssh -L 9000:localhost:9999 user@server.com即可完成我需要的工作。我想用Go编程地执行同样的操作。

我已经尝试使用该示例作为起点,并且尝试使用最新的测试来理解该怎么做,但是现在看来,这实际上是一件非常简单的事情,所以我有一堆混乱的混乱代码。铅>

任何帮助将不胜感激! :-)


我终于弄清楚了如何做到这一点,我在IRC频道中从schmichael得到了提示。感谢所有人!

编辑:一点解释:
我遇到的问题的很大一部分是,我没有意识到需要设置本地net.Listener(而不仅仅是本地net.Conn)来接收本地请求并在转发字节之前创建net.Conn
另外,既有端口转发也有反向端口转发,我以前没有详细考虑过常规端口转发也向后发送字节的事实,因此将远程读取器复制到本地写入器并不是我实现的事情非常需要。
这是尝试将这段代码的本质联系起来的方法:

  • 在本地端口9000上侦听。
  • 尝试从本地端口9000读取:(listener.Accept()),
  • 接受连接并返回本地io.Readerio.Writer,然后,
  • 连接到远程服务器,
  • 返回到io.Readerio.Writer,连接到远程端口9999。
  • 连续将本地io.Reader字节复制到远程io.Writer
  • 连续将远程io.Reader字节复制到本地io.Writer

这是代码:


我已经使用您的(该死的)示例代码构建了一个小型的开源工具:SSHTunnel
https://github.com/SommerEngineering/SSHTunnel

因此,该代码可在GitHub上免费提供给任何人:请随时用于学习目的或其他目的使用它:)我已经提到了您的昵称,并且也链接到此问题。

最诚挚的问候,
托尔斯滕


我已经完成了一个名为Mallory的简单SSH端口转发工具。
它提供HTTP代理而不是SOCKS代理,这实际上与ssh -D

核心代码类似于达米克的答案。

  • 创建ClientConfig
  • ssh.Dial到具有配置的远程SSH服务器并返回Client
  • 现在,您可以使用Client.Dial转发任何您喜欢的内容。

    Dial initiates a connection to the addr from the remote host. The resulting connection has a zero LocalAddr() and RemoteAddr().

  • If you want to serve a SOCKS proxy server, use Client.Dial to connect to the remote server.

  • 我编写了一个名为gosshtool的工具,使用该工具,您可以使用Go轻松通过SSH创建一个简单的TCP端口。https://github.com/scottkiss/gosshtool

    我使用此工具实现了端口转发服务器示例项目:
    https://github.com/scottkiss/gooverssh