De SOCKS-dialer levert het transport; het SSH-pakket doet de SSH-handshake eroverheen. Een aanroep van ssh.Dial daarna zou een aparte verbinding maken in plaats van dat transport te gebruiken.

Een hulpfunctie in een applicatie die al x/net/proxy en x/crypto/ssh gebruikt, kan de geconfigureerde SSH-client teruggeven:

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
}

De pakketnamen hier zijn golang.org/x/net/proxy en golang.org/x/crypto/ssh. proxyAddr wijst de SOCKS-listener aan; sshAddr wijst de uiteindelijke server aan als host:port.

Geef in config de gebruikelijke SSH-gebruiker van de applicatie, de authenticatiemethoden en HostKeyCallback mee. Het pakket knownhosts kan die callback opbouwen uit een vertrouwd known_hosts-bestand. Geef de hostnaam van de bestemming door aan NewClientConn zodat het vergelijken van de hostsleutel de bedoelde SSH-identiteit gebruikt.

Het argument nil selecteert geen SOCKS-inloggegevens. Voor toegestane openbare SSH-bestemmingen kan een vermelding zonder account uit de SOCKS5-proxylijst proxyAddr leveren als die de werkelijke SSH-host en -poort toestaat. Geef indien nodig een proxy.Auth met het proxyaccount mee; SSH-authenticatie blijft in config.

NewClient ontvangt de inkomende kanaal- en verzoekstromen die NewClientConn teruggeeft en beheert die clientmechaniek. Sluit de teruggegeven SSH-client wanneer het werk klaar is. Verbindingsafhandeling in productie vraagt ook om begrensd dialen en een handshakebeleid; deze hulpfunctie illustreert alleen het overdragen van het transport.

Gerelateerde artikelen