none
SSH Client соединение в SOCK5 Server, не получается обьеденить, помогите RRS feed

  • Общие обсуждения

  • Здравствуйте, подскажите. Я пишу приложение, которое берет подключение по SSH а на выходе планирую получить форвардинг на нужный мне порт уловно 127.0.0.1:1080 но в ходе поиска вариантов и модификаций, единственное чего я достинг, это два разных скрипта, первый умеет устанавливать SSH соединение и вроде как форвард порта работает.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.IO;
    using System.Net;
    using System.Text.RegularExpressions;
    using System.Threading;
    using Renci.SshNet;
    using Renci.SshNet.Common;
    
    
    namespace ProxyEasyWithThreads
    {
        public class SSH
        {
            string servername;
            int port;
            string username;
            string password;
    
            SshClient Server = null;
    
    
            public SSH(string servername, int port, string username, string password)
            {
                this.servername = servername;
                this.port = port;
                this.username = username;
                this.password = password;
    
                this.ssh_sess();
            }
    
    
            private void ssh_sess()
            {
                KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(this.username);
                PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(this.username, this.password);
                kauth.AuthenticationPrompt += new EventHandler<AuthenticationPromptEventArgs>(HandleKeyEvent);
                this.Server = new SshClient(new ConnectionInfo(this.servername, this.port, this.username, pauth, kauth));
                Console.WriteLine("Connected");
                try
                {
                    Console.WriteLine("Start connection");
                    Server.Connect();
                    Console.WriteLine("Connected");
                    if (Server.IsConnected)
                    {
                        try
                        {
                            ForwardedPortDynamic prt;
                            prt = new ForwardedPortDynamic("127.0.0.1", 1080);
                            Server.AddForwardedPort(prt);
                            prt.Start();
                            Console.WriteLine("Port forwarding start");
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message.ToString());
                        }
                    }
    
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message.ToString());
                }
            }
    
    
            void HandleKeyEvent(Object sender, AuthenticationPromptEventArgs e)
            {
                foreach (AuthenticationPrompt prompt in e.Prompts)
                {
                    if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
                    {
                        prompt.Response = this.password;
                    }
                }
            }
    
            static void Main()
            {
                SSH client = new SSH("50.247.55.153", 22, "admin", "123123");
                Console.ReadLine();            
            }
        }
    }

    Но в браузере не работает, а также через проксифер тоже не хочет работать видимо \тот форвардинг как и само соединение доступно лишь внутри программы.

    Также я имею второй код, который умеет форвардить интернет на нужный порт, но он не умеет тунелировать SSH, только перенаправляет соединение на другой порт и все.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.IO;
    using System.Net;
    using System.Text.RegularExpressions;
    using System.Threading;
    using Renci.SshNet;
    using Renci.SshNet.Common;
    
    
    namespace ProxyEasyWithThreads
    {
    abstract class BasicSocketWorker
        {
            protected Socket WorkSocket;
            private bool _socketIsWorking = true;
     
            protected BasicSocketWorker(Socket workSocket)
            {
                WorkSocket = workSocket;
            }
     
            protected BasicSocketWorker()
            {
            }
     
     
     
            public event EventHandler<DataAlreadyEventArgs> DataAlready;
            private void OnDataAlready(byte[] buffer, int length)
            {
                DataAlreadyEventArgs dataAlreadyEventAgrs = new DataAlreadyEventArgs { SocketBuffer = buffer, Length = length };
                if (DataAlready != null)
                    DataAlready(this, dataAlreadyEventAgrs);
            }
     
            public event EventHandler TransmissionError;
            private void OnTransmissionError()
            {
                if (TransmissionError != null)
                    TransmissionError(this, EventArgs.Empty);
            }
     
            public void StartWorking()
            {
                byte[] buffer = new byte[8197];
                try
                {
                    WorkSocket.BeginReceive(buffer, 5, 8192, SocketFlags.None, Received, buffer);
                }
                catch (ObjectDisposedException)
                {
                    ShutdownSocket();
                    OnTransmissionError();
                }
            }
     
            public void SubscribeToEvents(BasicSocketWorker basicSocketWorker)
            {
                DataAlready += basicSocketWorker.OnDataAlreadyAction;
                TransmissionError += basicSocketWorker.OnTransmissionErrorAction;
            }
     
     
     
            private void Received(IAsyncResult ar)
            {
                if (!_socketIsWorking)
                    return;
                byte[] incomingBuffer = (byte[]) ar.AsyncState;
                int received = WorkSocket.EndReceive(ar);
                if (received == 0)
                {
                    ShutdownSocket();
                    OnTransmissionError();
                    return;
                }
                try
                {
                    OnDataAlready(incomingBuffer, received);
                    byte[] buffer = new byte[8197];
                    WorkSocket.BeginReceive(buffer, 5, 8192, SocketFlags.None, Received, buffer);
                }
                catch (SocketException)
                {
                    ShutdownSocket();
                    OnTransmissionError();
                }
                catch (ObjectDisposedException)
                {
                    ShutdownSocket();
                    OnTransmissionError();
                }
            }
     
            private void Sent(IAsyncResult ar)
            {
                if (!_socketIsWorking)
                    return;
                WorkSocket.EndSend(ar);
            }
     
            private void OnDataAlreadyAction(object sender, DataAlreadyEventArgs eventArgs)
            {
                WorkSocket.BeginSend(eventArgs.SocketBuffer, 5, eventArgs.Length, SocketFlags.None, Sent, eventArgs.SocketBuffer);
            }
     
            private void OnTransmissionErrorAction(object sender, EventArgs eventArgs)
            {
                ShutdownSocket();
            }
     
            private void ShutdownSocket()
            {
                if (!_socketIsWorking)
                    return;
                _socketIsWorking = false;
                WorkSocket.Shutdown(SocketShutdown.Both);
                WorkSocket.Close();
            }
        }
        class Receiver : BasicSocketWorker
        {
            public Receiver(Socket workSocket)
                : base(workSocket)
            {
            }
        }
    
        class Sender : BasicSocketWorker
        {
            public bool Connect(string host, int port)
            {
                IPEndPoint endPoint;
                try
                {
                    endPoint = GetEndPoint(host, port);
                }
                catch (Exception)
                {
                    return false;
                }
    
                WorkSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    WorkSocket.Connect(endPoint);
                }
                catch (SocketException)
                {
                    return false;
                }
                return true;
            }
    
    
    
            private IPEndPoint GetEndPoint(string host, int port)
            {
                IPAddress address;
                if (IPAddress.TryParse(host, out address))
                    return new IPEndPoint(address, port);
                IPAddress[] addresses = Dns.GetHostEntry(host).AddressList;
                if (addresses.Length < 1)
                    throw new Exception();
                return new IPEndPoint(addresses[0], port);
            }
        }
    
        class DataAlreadyEventArgs : EventArgs
        {
            public byte[] SocketBuffer { get; set; }
            public int Length { get; set; }
        }
    
        class Program
        {
            static void Main()
            {
                Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                listener.Bind(new IPEndPoint(IPAddress.Any, 1080));
                listener.Listen(1000);
                listener.BeginAccept(ListenerAccept, listener);
                Console.ReadKey();
            }
    
            private static void ListenerAccept(IAsyncResult ar)
            {
                //получение данных
                Socket listener = (Socket)ar.AsyncState;
                listener.BeginAccept(ListenerAccept, listener);
                Socket local = listener.EndAccept(ar);
                byte[] buffer = new byte[260];
    
                //авторизация прокси
                local.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                if (buffer[0] != 5)
                {
                    local.Shutdown(SocketShutdown.Both);
                    local.Close();
                    return;
                }
                buffer[1] = 0;
                local.Send(buffer, 0, 2, SocketFlags.None);
    
                //проверка данных соединения
                int received;
                try
                {
                    received = local.Receive(buffer, 0, buffer.Length, SocketFlags.None);
                }
                catch (SocketException)
                {
                    local.Shutdown(SocketShutdown.Both);
                    local.Close();
                    return;
                }
                if (buffer[1] != 1)
                {
                    local.Shutdown(SocketShutdown.Both);
                    local.Close();
                    return;
                }
                if (buffer[3] != 1 && buffer[3] != 3)
                {
                    local.Shutdown(SocketShutdown.Both);
                    local.Close();
                    return;
                }
    
                //инстанцирование воркеров
                Receiver receiver = new Receiver(local);
                Sender sender = new Sender();
                receiver.SubscribeToEvents(sender);
                sender.SubscribeToEvents(receiver);
    
                //коннект к удаленному хосту
                string host = Encoding.ASCII.GetString(buffer, 5, buffer[4]);
                int port = buffer[buffer[4] + 5] * 256 + buffer[buffer[4] + 6];
                if (!sender.Connect(host, port))
                {
                    buffer[1] = 4;
                    local.Send(buffer, 0, received, SocketFlags.None);
                    local.Shutdown(SocketShutdown.Both);
                    local.Close();
                    return;
                }
    
                //сообщение об успехе и запуск на прием
                buffer[1] = 0;
                local.Send(buffer, 0, received, SocketFlags.None);
                receiver.StartWorking();
                sender.StartWorking();
            }
        }
    }
    
    Помогите, как можно реализовать задачу, чтобы SSH конвертировать в SOCK5 соединение на нужный мне порт, уже разные варианты пробовал, но результат это пока что не дало

    25 декабря 2015 г. 19:18