/// <summary> /// Connect to remote host:port over SSH tunnel /// </summary> public void Connect(string host, int port, int timeout) { try { //remember remote target m_RemoteTarget = new IPEndPoint(ResolveHost(host), port); //connect to SSH server if (!connectAsync(m_RemoteTarget.Address, SSHServerPort).Wait(timeout)) throw new ErlException(ERL_CONN_CANT_CONNECT_TO_HOST_ERROR.Args("SSH", host, port)); //get password from user var pass = ErlTransportPasswordSource.GetPassword(this, NodeName, SSHUserName); //set params var param = new SSHConnectionParameter(); param.EventTracer = this; //to receive detailed events param.UserName = SSHUserName; param.Password = pass; param.Protocol = SSHProtocol.SSH2; param.AuthenticationType = (AuthenticationType) Enum.Parse(typeof (SSH.AuthenticationType), SSHAuthenticationType); if (param.AuthenticationType == AuthenticationType.PublicKey) param.IdentityFile = SSHPrivateKeyFilePath; //former algorithm is given priority in the algorithm negotiation param.PreferableHostKeyAlgorithms = new PublicKeyAlgorithm[] {PublicKeyAlgorithm.RSA, PublicKeyAlgorithm.DSA}; param.PreferableCipherAlgorithms = new CipherAlgorithm[] { CipherAlgorithm.Blowfish, CipherAlgorithm.TripleDES, CipherAlgorithm.AES192CTR, CipherAlgorithm.AES256CTR, CipherAlgorithm.AES128CTR }; param.WindowSize = 0x1000; //this option is ignored with SSH1 //Creating a new SSH connection over the underlying socket m_Connection = SSHConnection.Connect(param, this, m_Client); m_Connection.AutoDisconnect = true; m_IsChannelReady = 0; //Local->Remote port forwarding (we use localhost:0 as local port, because local port is not required for us, we will use this tunnel directly) m_Channel = m_Connection.ForwardPort(this, host, port, "localhost", 0); var deadLine = DateTime.Now.AddMilliseconds(timeout); while (m_IsChannelReady == 0 && deadLine > DateTime.Now) System.Threading.Thread.Sleep(50); //wait response //if timeouted - throw exception if (m_IsChannelReady <= 0) throw new ErlException(ERL_CREATE_SSH_TUNNEL_ERROR); //create network stream m_Stream = new SshTunnelStream(m_Channel); //Remote->Local // if you want to listen to a port on the SSH server, follow this line: //_conn.ListenForwardedPort("0.0.0.0", 10000); //NOTE: if you use SSH2, dynamic key exchange feature is supported. //((SSH2Connection)_conn).ReexchangeKeys(); } catch (Exception ex) { OnTrace(ErlTraceLevel.Ctrl, Direction.Inbound, ex.Message); throw; } }
/// <summary> /// Connect to remote host:port over SSH tunnel /// </summary> public void Connect(string host, int port) { try { //remember remote target m_RemoteTarget = new IPEndPoint(ResolveHost(host), port); //connect to SSH server m_Client.Connect(new IPEndPoint(m_RemoteTarget.Address, SSHServerPort)); //get password from user var pass = ErlTransportPasswordSource.GetPassword(this, NodeName, SSHUserName); //set params var param = new SSHConnectionParameter(); param.EventTracer = this; //to receive detailed events param.UserName = SSHUserName; param.Password = pass; param.Protocol = SSHProtocol.SSH2; param.AuthenticationType = (AuthenticationType)Enum.Parse(typeof(SSH.AuthenticationType), SSHAuthenticationType); if (param.AuthenticationType == AuthenticationType.PublicKey) { param.IdentityFile = SSHPrivateKeyFilePath; } //former algorithm is given priority in the algorithm negotiation param.PreferableHostKeyAlgorithms = new PublicKeyAlgorithm[] { PublicKeyAlgorithm.RSA, PublicKeyAlgorithm.DSA }; param.PreferableCipherAlgorithms = new CipherAlgorithm[] { CipherAlgorithm.Blowfish, CipherAlgorithm.TripleDES, CipherAlgorithm.AES192CTR, CipherAlgorithm.AES256CTR, CipherAlgorithm.AES128CTR }; param.WindowSize = 0x1000; //this option is ignored with SSH1 //Creating a new SSH connection over the underlying socket m_Connection = SSHConnection.Connect(param, this, m_Client); m_Connection.AutoDisconnect = true; m_IsChannelReady = false; //Local->Remote port forwarding (we use localhost:0 as local port, because local port is not required for us, we will use this tunnel directly) m_Channel = m_Connection.ForwardPort(this, host, port, "localhost", 0); var deadLine = DateTime.Now.AddMilliseconds(SSHTunnelCreationTimeout); while (!m_IsChannelReady && deadLine > DateTime.Now) { System.Threading.Thread.Sleep(50); //wait response } //if timeouted - throw exception if (!m_IsChannelReady && deadLine < DateTime.Now) { throw new ErlException(ERL_CREATE_SSH_TUNNEL_ERROR); } //create network stream m_Stream = new SshTunnelStream(m_Channel); //Remote->Local // if you want to listen to a port on the SSH server, follow this line: //_conn.ListenForwardedPort("0.0.0.0", 10000); //NOTE: if you use SSH2, dynamic key exchange feature is supported. //((SSH2Connection)_conn).ReexchangeKeys(); } catch (Exception ex) { OnTrace(ErlTraceLevel.Ctrl, Direction.Inbound, ex.Message); throw; } }