GolangでSocks5 Proxy経由でのssh接続をする場合はどうするのか調べてたので、備忘で残しておく。 Socks5であれば golang.org/x/net/proxy ライブラリを使うことで*net.Connを取得できるので、それを利用してssh接続してやればいい。

実行可能なコードはこちらにおいてある。

ssh_term_socks5_proxy.go
// proxy1の情報 proxy1Host := "proxy1.server.local" proxy1Port := "54321" // proxy1User := "user" // 認証が必要な場合の情報 // proxy1Pass := "password" // 認証が必要な場合の情報 // targetの情報 targetHost := "target.server.local" targetPort := "22" targetUser := "user" targetPass := "password" // sshClientConfigの作成(target) targetSshConfig := &ssh.ClientConfig{ User: targetUser, Auth: []ssh.AuthMethod{ssh.Password(targetPass)}, HostKeyCallback: ssh.InsecureIgnoreHostKey(), } // proxy接続に認証が必要な場合 // auth = &proxy.Auth{ // User: proxy1User, // Password: proxy1Pass, // } // proxy1のDialerを生成 // proxy1Dialer, err := proxy.SOCKS5("tcp", net.JoinHostPort(proxy1Host, proxy1Port), auth, proxy.Direct) // proxy接続に認証が必要な場合 proxy1Dialer, err := proxy.SOCKS5("tcp", net.JoinHostPort(proxy1Host, proxy1Port), nil, proxy.Direct) if err != nil { fmt.Println(err) } // proxy1の*net.Connを生成 proxy1Conn, err := proxy1Dialer.Dial("tcp", net.JoinHostPort(targetHost, targetPort)) if err != nil { fmt.Println(err) } // TargetへのsshClientを作成 pConnect, pChans, pReqs, err := ssh.NewClientConn(proxy1Conn, net.JoinHostPort(targetHost, targetPort), targetSshConfig) if err != nil { fmt.Println(err) } client := ssh.NewClient(pConnect, pChans, pReqs)