Dem SSH-Client von Go die von SOCKS geöffnete Verbindung übergeben
Wähle das SSH-Ziel mit x/net/proxy und initialisiere dann x/crypto/ssh auf dem entstehenden net.Conn.
Der SOCKS-Dialer liefert den Transport; das SSH-Paket führt darüber den SSH-Handshake aus. Ein anschließendes ssh.Dial würde eine eigene Verbindung aufbauen, statt diesen Transport zu nutzen.
Eine Hilfsfunktion in einer Anwendung, die x/net/proxy und x/crypto/ssh bereits nutzt, kann den konfigurierten SSH-Client zurückgeben:
func dialSSHViaSOCKS(proxyAddr, sshAddr string,
config *ssh.ClientConfig) (*ssh.Client, error) {
dialer, err := proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
if err != nil {
return nil, err
}
conn, err := dialer.Dial("tcp", sshAddr)
if err != nil {
return nil, err
}
transport, channels, requests, err :=
ssh.NewClientConn(conn, sshAddr, config)
if err != nil {
conn.Close()
return nil, err
}
return ssh.NewClient(transport, channels, requests), nil
}Die Paketnamen sind hier golang.org/x/net/proxy und golang.org/x/crypto/ssh. proxyAddr bezeichnet den SOCKS-Listener; sshAddr bezeichnet den endgültigen Server als host:port.
Übergib in config den üblichen SSH-Benutzer der Anwendung, die Authentifizierungsmethoden und HostKeyCallback. Das Paket knownhosts kann dieses Callback aus einer vertrauenswürdigen known_hosts-Datei aufbauen. Übergib den Zielhostnamen an NewClientConn, damit der Hostschlüssel-Abgleich die beabsichtigte SSH-Identität verwendet.
Das nil-Argument wählt keine SOCKS-Zugangsdaten. Für erlaubte öffentliche SSH-Ziele kann ein Eintrag ohne Konto aus der SOCKS5-Proxy-Liste proxyAddr liefern, wenn er den tatsächlichen SSH-Host und -Port zulässt. Bei Bedarf übergibst du ein proxy.Auth mit dem Proxy-Konto; die SSH-Authentifizierung bleibt in config.
NewClient übernimmt die eingehenden Kanal- und Anfrageströme, die NewClientConn zurückgibt, und betreibt diese Client-Mechanik. Schließe den zurückgegebenen SSH-Client, wenn seine Arbeit endet. Die Verbindungsbehandlung in der Produktion braucht zusätzlich begrenztes Dialing und eine Handshake-Richtlinie; diese Hilfsfunktion zeigt nur die Übergabe des Transports.