It's possible to create a proxy chain using Rebex Ssh
object's SSH tunneling capabilities. In addition to Rebex component at the client, this also needs three SSH servers (more can be easily added as well).
The client-side code to set up the chain might look like this:
// connect and authenticate to the first SSH sever in the chain
var ssh1 = new Ssh();
ssh1.Connect(server1, port1);
ssh1.Login(username1, password1);
// connect and authenticate to the second SSH server in the chain
// (tunnelled through the first SSH server)
var ssh2 = new Ssh();
ssh2.SetSocketFactory(ssh1.Session.ToSocketFactory());
ssh2.Connect(server2, port2);
ssh2.Login(username2, password2);
// connect and authenticate to the third SSH server in the chain
// (tunnelled through the first and second SSH servers)
var ssh3 = new Ssh();
ssh3.SetSocketFactory(ssh2.Session.ToSocketFactory());
ssh3.Connect(server3, port3);
ssh3.Login(username3, password3);
// start local SOCKS5 server whose connections are
// tunneled through the three SSH servers
var tunnel1 = ssh3.StartSocksServer("127.0.0.1", 1080);
Console.WriteLine("Accepting SOCKS5 connections at {0}.", tunnel1.LocalEndPoint);
// or start a tunnel from a local port to a specific remote endpoint
// (tunneled through the three SSH servers)
//var tunnel2 = ssh3.StartOutgoingTunnel("127.0.0.1", 8080, "test.rebex.net", 80);
//Console.WriteLine("Accepting HTTP connections at {0}.", tunnel2.LocalEndPoint);
Console.WriteLine("Press any key to exit.");
Console.ReadKey(true);
Also, make sure to verify the fingerprint or public key of all the SSH servers in the chain to make sure the client is indeed connecting through the expected servers.
Ssh
class is provided by Rebex.SshShell
assembly, which comes with Rebex Terminal Emulation, Rebex SSH Pack and Rebex Total Pack.
At the server side, any SSH server that supports outgoing tunneling (port forwarding) can be utilized. Most SSH servers support this, but some of them don't enable it by default.