Админим сервера на C#, на примере своего VPN

Discussion in 'Девятый конкурс статей' started by shelder, May 15, 2018.

  1. shelder

    shelder Пользователь

    Joined:
    May 19, 2017
    Messages:
    52
    Likes Received:
    93
    Доброго времени суток.
    Хочу показать, как при помощи Zenno и C# можно значительно упростить настройку и администрирование серверов, особенно однотипных.
    Для этого нам понадобится библиотека SSH.NET. Я приложу ее к проекту, так же последнюю версию можно скачать тут. Там же лежит отличная, очень подробная документация. Я сегодня покажу основы, а все остальное, с примерами, можно найти именно там.

    Для начала добавим ее в наш проект:

    1. Добавляем действия => Свой код => Ссылки из GAC и Директивы using и общий код.
    2.jpg

    2. References => добавляем .dll из проекта, в результате должно получиться так:
    3.jpg

    3. OwnCodeUsings => Добавляем строку using Renci.SshNet;
    4.jpg


    А дальше создаем кубик Свой C# код и в нем и работаем.


    Для начала создадим экземпляр sshClient

    Code (text):
    1. SshClient сlient = new SshClient("IP", 22, "Login", "Pass");
    2. сlient.Connect();
    3. return client.ConnectionInfo.ServerVersion;
    4. client.Disconnect();
    IP, Login и Pass вы получите после покупки сервера или VPS. 22 стандартный ssh порт, в принципе его можно вообще не указывать.
    Подставив эти значения, мы коннектимся с ними к серверу и узнаем версию установленной операционки. После чего закрываем соединение.

    Просто выполнить нужную команду можно так:

    Code (text):
    1. var command = client.RunCommand("ls");
    А вот так получить результать выполнения, если он небольшой:

    Code (text):
    1. project.SendInfoToLog(client.RunCommand("ls").Result);
    Если же вывод будет многострочный, лучше будет воспользоваться экземпляром StreamReader. Выглядеть это будет примерно так:

    Code (text):
    1. client.Connect();
    2.  
    3. var command = client.CreateCommand("ls -l");
    4. var asynch = command.BeginExecute();
    5.  
    6. var reader = new StreamReader(command.OutputStream);
    7.  
    8. while (!asynch.IsCompleted)
    9. {
    10.     var result = reader.ReadToEnd();
    11.     if (string.IsNullOrEmpty(result))
    12.         continue;
    13.     project.SendInfoToLog(result, true);
    14. }
    15. command.EndExecute(asynch);
    16.  
    17. client.Disconnect();

    А теперь, пользуясь изложенным выше и документацией, перейдем в практическую плоскость - установим свой личный VPN. В свете последних событий, тема более чем актуальная.

    Ставить будем IPsec VPN, что бы под Win спокойно настроить соединение стандартными средствами.
    Воспользуемся для этого отличным автосетап скриптом, живущим на гитхабе.
    Для установки нам понадобится VPS на KVM/Xen с Ubuntu, Debian или CentOS на борту. Дешевые VPS на OpenVZ к сожалению не подойдут.

    Итак, в нашем проекте создадим таблицу, в которой будет хранится вся информация для доступа к VPS и настройками VPN.
    Стандартными средствами будем брать строку и раскидывать ее по переменным.
    А дальше, в Кубике C# формируем нужную нам команду для скачки и запуска скрипта, используя наши настройки:

    Code (text):
    1. var IP = project.Variables["IP"].Value;
    2. var SSHLogin = project.Variables["SSHLogin"].Value;
    3. var SSHPass = project.Variables["SSHPass"].Value;
    4. var VPNLogin = project.Variables["VPNLogin"].Value;
    5. var VPNPass = project.Variables["VPNPass"].Value;
    6. var VPNipsecPSK = project.Variables["VPNipsecPSK"].Value;
    7. var command = "wget https://git.io/vpnsetup -O vpnsetup.sh && sudo VPN_IPSEC_PSK='"+VPNipsecPSK+"' VPN_USER='"+VPNLogin+"' VPN_PASSWORD='"+VPNPass+"' sh vpnsetup.sh";
    После чего открываем соединение, создаем экземпляр ShellStream и выполняем в нем подготовленную нами строчку:

    Code (text):
    1. SshClient client = new SshClient(IP, 22, SSHLogin, SSHPass);
    2. client.Connect();
    3. IDictionary<Renci.SshNet.Common.TerminalModes, uint> termkvp = new Dictionary<Renci.SshNet.Common.TerminalModes, uint>();
    4. termkvp.Add(Renci.SshNet.Common.TerminalModes.ECHO, 53);
    5. ShellStream shellStream = client.CreateShellStream("xterm", 80,24, 800, 600, 1024, termkvp);
    6. shellStream.WriteLine(command);
    Я ставил на Ubuntu 16.04, не из под root пользователя. Так что должен прийти запрос на пароль, который мы и подождем несколько секунд, а потом введем:

    Code (text):
    1. System.Threading.Thread.Sleep(5000);
    2. shellStream.WriteLine(SSHPass);
    А далее остается просто подождать, пока скрипт все сам поставит. В конце установки прочитав указанную фразу переходим дальше и закрываем соединение. На случай непредвиденной ситуации установил паузу через TimeSpan, подробнее его настройки тут.

    Code (text):
    1. shellStream.Expect(new Regex(@"IPsec VPN server is now ready for use"), new TimeSpan(0, 30, 0));
    2. client.Disconnect();

    На этом установка на сервер готова, и мы переходим к настройке клиента.
    Для начала создаем новое соединение.
    Пуск — Панель управления — Центр управления сетями и общим доступом — Настройка нового подключения или сети — Подключение к рабочему месту — Использовать мое подключение к интернету ( VPN )

    Далее указываем IP адрес сервера
    w1.png

    Вписываем логин и пароль от l2tp
    w2.png

    Не подключаясь закрываем настройку подключения
    w3.png

    В свойствах нашего нового подключения проверяем еще раз корректность ввода адреса сервера
    w4.png

    Во вкладке «Безопасность» выставляем верный тип нашего соединения ( l2tp over ipsec ) и разрешаем авторизацию по протоколу CHAP. В дополнительных настройках l2tp выбираем авторизацию по ключу и вписываем наш PSK от IPsec
    w5.png w6.png

    На этом настройка клиента закончена, можно пользоваться.

    Попробую сейчас записать видео, где расскажу о том, как можно это сделать почти бесплатно и не в одном экземпляре.

    Ну и по тому же принципу можно настраивать что угодно. Благо библиотека очень мощная, возможностей полно, документация очень подробная.
    Надеюсь кому то это пригодится, и будет легче жить с нашим веселым Роскомнадзором )
     

    Attached Files:

    kompas777, Nike59, Sanekk and 15 others like this.
  2. SergSh

    SergSh Client

    Joined:
    May 10, 2017
    Messages:
    364
    Likes Received:
    231
    Будет продолжение с подключением и установкой винды или бд под вордпресс?
     
  3. avtostopshik

    avtostopshik Client

    Joined:
    Sep 9, 2016
    Messages:
    387
    Likes Received:
    43
    Многие команды выходят в ошибку - не знаю, работало ли у автора, когда он писал статью, но сейчас часть команд не работает в зенке
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)