GolangでSocks5 Proxy経由でのssh接続を行わせる

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

Sponsored Links

■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)
...

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*