go - 使用 GO 进行 SSH 反向隧道

标签 go ssh proxy reverse-proxy socks

我正在尝试编写一个服务器/客户端来帮助解决防火墙/Nat 问题。

我注意到 SSH 已经内置了对此的支持。 (http://rustyrazorblade.com/2010/03/ssh-reverse-tunnel-to-access-box-behind-firewall/)

我尝试了几个不同的 SSH 示例,但似乎都不起作用。我发现一个项目说它实现了远程端口转发 -> https://godoc.org/dev.justinjudd.org/justin/easyssh

服务器说它正在监听连接,但我无法从服务器计算机到客户端计算机进行 SSH。 (远程计算机上的 ssh localhost 8080 应转发到客户端计算机。

客户端 ->

package main

import (
  "log"

  "dev.justinjudd.org/justin/easyssh"
  "golang.org/x/crypto/ssh"
)

func main() {
  config := &ssh.ClientConfig{
    User: "test",
    Auth: []ssh.AuthMethod{
      ssh.Password("test"),
    },
  }


  conn, err := easyssh.Dial("tcp", "*SSH-SERVER*:22", config)
  if err != nil {
    log.Fatalf("unable to connect: %s", err)
  }
  defer conn.Close()

  err = conn.RemoteForward("0.0.0.0:8080", "127.0.0.1:22")
  if err != nil {
    log.Fatalf("unable to forward local port: %s", err)
  }

}

服务器 ->

package main

import (
  "fmt"
  "io/ioutil"
  "log"

  "dev.justinjudd.org/justin/easyssh"

  "golang.org/x/crypto/ssh"
)

func main() {

  privateBytes, err := ioutil.ReadFile("id_rsa")
  if err != nil {
    log.Fatal("Failed to load private key (./id_rsa)")
  }

  private, err := ssh.ParsePrivateKey(privateBytes)
  if err != nil {
    log.Fatal("Failed to parse private key")
  }

  config := &ssh.ServerConfig{
    PasswordCallback: func(c ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) {
      if c.User() == "test" && string(pass) == "test" {
        log.Printf("User logged in: %s", c.User())
        return nil, nil
      }
      return nil, fmt.Errorf("password rejected for %s", c.User())
    },
  }
  config.AddHostKey(private)


  easyssh.HandleChannel(easyssh.SessionRequest, easyssh.SessionHandler())
  easyssh.HandleChannel(easyssh.DirectForwardRequest, easyssh.DirectPortForwardHandler())
  easyssh.HandleRequestFunc(easyssh.RemoteForwardRequest, easyssh.TCPIPForwardRequest)

  easyssh.ListenAndServe(":22", config, nil)
}

最佳答案

我在 easyssh 中发现了与远程端口转发相关的错误:

https://dev.justinjudd.org/justin/easyssh/src/master/tcpip.go#L107

ssh.DiscardRequests(reqs)应该在单独的goroutine中运行,否则下一次数据传输将不会被执行。

关于go - 使用 GO 进行 SSH 反向隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38003883/

相关文章:

http - 在单个 VM 中提供两个用 Google Go 编写的网站

api - Go 不会立即响应 GET 请求,它会在 ticker 完成后响应

docker - 使用 docker 在 gitea 上 ssh

linux - 无法从 Linux EC2 实例到本地计算机的 SCP

github - SSH 代理转发不起作用

c# - 为什么 HttpClientHandler 没有正确获取和使用默认代理设置?

svn - 通过代理脚本访问TortoiseSVN

go - 将较高类型向下转换为较低类型

dictionary - 使用附加属性作为键从结构创建映射或对象

python - Scrapy 的代理池系统暂时停止使用慢速/超时代理