One place for hosting & domains

      работы

      Настройка приложения Node.js для работы в среде Ubuntu 20.04


      Введение

      Node.js — среда исполнения JavaScript с открытым исходным кодом, предназначенная для построения серверных и сетевых приложений. Данная платформа работает в операционных системах Linux, macOS, FreeBSD и Windows. Хотя вы можете запускать приложения Node.js через командную строку, этот обучающий модуль посвящен их запуску в качестве службы. Это означает, что они будут перезапускаться при перезагрузке системы или неисправности, и что их можно безопасно использовать в производственной среде.

      В этом обучающем модуле вы научитесь создавать готовую производственную среду Node.js на одном сервере Ubuntu 20.04. Этот сервер будет выполнять приложение Node.js под управлением PM2 и предоставлять пользователям безопасный доступ к приложению через обратный прокси-сервер Nginx. Сервер Nginx обеспечивает поддержку HTTPS с использованием бесплатного сертификата от Let’s Encrypt.

      Предварительные требования

      Этот обучающий модуль предполагает, что у вас имеется следующее:

      Если предварительные требования выполнены, у вас должен быть сервер, обслуживающий используемую по умолчанию страницу назначения вашего домена по адресу https://example.com/.

      Шаг 1 — Установка Node.js

      Для начала мы установим самый быстрый выпуск LTS Node.js, используя архивы пакетов NodeSource.

      Вначале мы установим NodeSource PPA, чтобы получить доступ к его содержимому. Убедитесь, что вы находитесь в домашнем каталоге, и используйте curl для получения скрипта установки для последней версии LTS Node.js из его архивов.

      • cd ~
      • curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh

      Вы можете просмотреть содержимое скрипта с помощью nano или предпочитаемого текстового редактора:

      Завершив проверку скрипта, запустите его от имени пользователя sudo:

      • sudo bash nodesource_setup.sh

      Архив PPA будет добавлен в вашу конфигурацию и кэш локальных пакетов автоматически обновится. После запуска скрипта установки Nodesource вы можете установить пакет Node.js:

      Чтобы проверить номер версии Node.js, установленной на начальном шаге, введите:

      Output

      v14.4.0

      Примечание. При установке из NodeSource PPA исполняемый файл Node.js имеет имя nodejs, а не node.

      Пакет nodejs содержит двоичный файл nodejs, а также диспетчер пакетов npm для модулей Node, так что отдельно устанавливать npm не нужно.

      npm использует файл конфигурации в домашнем каталоге, чтобы отслеживать обновления. Он создается при первом запуске npm. Выполните следующую команду, чтобы проверить установку npm и создать файл конфигурации:

      Output

      6.14.5

      Для работы некоторых пакетов npm (например, требующих компиляцию кода из источника) потребуется установить пакет build-essential:

      • sudo apt install build-essential

      Теперь у вас есть необходимые инструменты для работы с пакетами npm, которые требуют компиляции кода из источника.

      Установив исполняемый модуль Node.js, мы можем перейти к написанию приложения Node.js.

      Шаг 2 — Создание приложения Node.js

      Напишем приложение Hello World, возвращающее «Hello World» в ответ на любые запросы HTTP. Этот образец приложения поможет вам выполнить настройку Node.js. Вы можете заменить его собственным приложением, но при этом обязательно измените приложение для прослушивания подходящих IP-адресов и портов.

      Вначале создадим образец приложения под именем hello.js:

      Вставьте в файл следующий код:

      ~/hello.js

      const http = require('http');
      
      const hostname="localhost";
      const port = 3000;
      
      const server = http.createServer((req, res) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World!n');
      });
      
      server.listen(port, hostname, () => {
        console.log(`Server running at http://${hostname}:${port}/`);
      });
      

      Сохраните файл и выйдите из редактора.

      Это приложение Node.js прослушивает заданный адрес (localhost) и порт (3000) и возвращает текст «Hello World!» с кодом успешного выполнения a 200 HTTP. Поскольку мы прослушиваем localhost, удаленные клиенты не смогут подключиться к нашему приложению.

      Чтобы протестировать приложение, введите:

      Результат будет выглядеть следующим образом:

      Output

      Server running at http://localhost:3000/

      Примечание. Такой способ запуска приложения Node.js блокирует дополнительные команды, пока приложение не будет закрыто нажатием CTRL+C.

      Чтобы протестировать приложение, откройте на сервере другой сеанс терминала и подключитесь к localhost с помощью команды curl:

      • curl http://localhost:3000

      Если вы увидите следующий результат, приложение работает нормально и прослушивает правильные адрес и порт:

      Output

      Hello World!

      Если вы не увидите ожидаемого результата, убедитесь, что ваше приложение Node.js запущено и настроено для прослушивание правильных адреса и порта.

      Убедившись, что приложение работает, остановите его (если еще не сделали этого) нажатием CTRL+C.

      Шаг 3 — Установка PM2

      Теперь установим диспетчер процессов PM2, предназначенный для приложений Node.js. PM2 позволяет преобразовывать приложения в демонов, чтобы они работали как службы в фоновом режиме.

      Используйте npm для установки последней версии PM2 на своем сервере:

      • sudo npm install pm2@latest -g

      Опция -g указывает npm выполнить глобальную установку модуля, чтобы он был доступен в масштабе всей системы.

      Вначале используем команду pm2 для запуска вашего приложения hello.js в фоновом режиме:

      Также она добавит ваше приложение в список процессов PM2, которы йвыводится при каждом запуске приложения:

      Output

      ... [PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2 [PM2] PM2 Successfully daemonized [PM2] Starting /home/sammy/hello.js in fork_mode (1 instance) [PM2] Done. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

      Как указано выше, PM2 автоматически присваивает App name (основанное на имени файла, без расширения .js) и PM2 id. PM2 также обслуживает другие данные, такие как PID процесса, его текущее состояние и использование памяти.

      Приложения, запускаемые через PM2, автоматически перезапускаются в случае сбоя или прекращения работы приложения, но мы можем выполнить дополнительный шаг, чтобы запускать приложение при запуске системы с помощью субкоманды startup. Эта субкоманда генерирует и настраивает скрипт запуска PM2 и управляемых им процессов при загрузке сервера:

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

      Output

      [PM2] Init System found: systemd sammy [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

      Запустите команду из результатов, указав свое имя пользователя вместо sammy:

      • sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

      Дополнительно мы можем сохранить список процессов PM2 и соответствующие среды:

      Теперь вы создали блок systemd, который запускает pm2 для вашего пользователя при загрузке. Этот экземпляр pm2 запускает hello.js.

      Запустите службу с помощью команды systemctl:

      • sudo systemctl start pm2-sammy

      Если на этом этапе вы увидите ошибку, вам может потребоваться перезагрузка, которую можно выполнить с помощью sudo reboot.

      Проверьте состояние блока systemd:

      • systemctl status pm2-sammy

      Подробный обзор блока systemd можно найти в разделе Основы работы с Systemd: работа со службами, блоками и журналом.

      В дополнение к уже описанным субкомандам PM2 предоставляет много субкоманд, позволяющих управлять информацией о ваших приложениях и искать такую информацию.

      Остановите приложение с помощью этой команды (укажите имя приложения PM2 или id):

      Перезапустите приложение:

      • pm2 restart app_name_or_id

      Выведем список приложений, управление которыми осуществляет PM2:

      Получим информацию об определенном приложении по имени приложения:

      Монитор процесса PM2 запускается с помощью субкоманды monit. При этом отображается состояние приложение, использование ресурсов ЦП и использование памяти:

      При запуске команды pm2 без аргументов отображается страница справки с примерами использования.

      Теперь ваше приложение Node.js запущено и управляется PM2, и мы можем настроить обратный прокси-сервер.

      Шаг 4 — Настройка Nginx в качестве обратного прокси-сервера

      Ваше приложение запущено и прослушивает localhost, но вам нужно дать пользователям возможность доступа к нему. Для этой цели мы настроим веб-сервер Nginx в качестве обратного прокси-сервера.

      В предварительных обучающих модулях вы настроили конфигурацию Nginx в файле /etc/nginx/sites-available/example.com. Откройте этот файл для редактирования:

      • sudo nano /etc/nginx/sites-available/example.com

      В блоке server должен содержаться блок location /. Замените содержимое этого блока следующей конфигурацией. Если ваше приложение настроено для прослушивания другого порта, измените номер порта в выделенной части на подходящий:

      /etc/nginx/sites-available/example.com

      server {
      ...
          location / {
              proxy_pass http://localhost:3000;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection 'upgrade';
              proxy_set_header Host $host;
              proxy_cache_bypass $http_upgrade;
          }
      ...
      }
      

      Так сервер настраивается для ответа на запросы root. Если наш сервер доступен по адресу example.com, при попытке доступа к https://example.com/ через браузер будет отправлен запрос hello.js с прослушиванием порта 3000 хоста localhost.

      Вы можете добавить в этот же серверный блок дополнительные блоки location, чтобы предоставить другим приложениям доступ к этому же серверу. Например, если вы используете другое приложение Node.js на порту 3001, вы сможете добавить следующий блок location, чтобы разрешить доступ к нему через https://example.com/app2:

      /etc/nginx/sites-available/example.com — Optional

      server {
      ...
          location /app2 {
              proxy_pass http://localhost:3001;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection 'upgrade';
              proxy_set_header Host $host;
              proxy_cache_bypass $http_upgrade;
          }
      ...
      }
      

      Завершив добавление блоков location для ваших приложений, сохраните файл и закройте редактор.

      Убедитесь в отсутствии ошибок синтаксиса с помощью следующей команды:

      Перезапустите Nginx:

      • sudo systemctl restart nginx

      Если ваше приложение Node.js запущено и конфигурации вашего приложения и Nginx настроены правильно, вы должны иметь возможность доступа к вашему приложению через обратный прокси-сервер Nginx. Попробуйте открыть URL вашего сервера (публичный IP-адрес или доменное имя).

      Заключение

      Поздравляем! Теперь у вас есть приложение Node.js, работающее за обратным прокси-сервером Nginx на сервере Ubuntu 20.04. Настройка обратного прокси-сервера достаточно гибкая, чтобы предоставить вашим пользователям доступ к другим приложениям или статическому веб-контенту, который вы хотите опубликовать.



      Source link

      Начало работы со строками в Go


      Строка — это последовательность из одного или нескольких символов (буквы, числа, символы), которая может представлять собой константу или переменную. Строки составляются из символов Unicode и являются неизменяемыми последовательностями, т. е. порядок этой последовательности нельзя изменить.

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

      В этом обучающем руководстве по Go вы узнаете, как создавать и выводить на экран строки, как выполнять конкатенацию и дублирование строк, а также как хранить строки в переменных.

      Строковые литералы

      В Go строки добавляются либо внутри обратных кавычек ` (иногда их называют еще обратными метками) или внутри двойных кавычек ". В зависимости от того, какие кавычки вы использовать, строка будет иметь различные характеристики.

      При использовании обратных кавычек, например, `bar`, будет создаваться необработанный строковый литерал. В необработанном строковом литерале любой символ может появляться между кавычками, за исключением обратных кавычек. Ниже представлен пример необработанного строкового литерала:

      `Say "hello" to Go!`
      

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

      Необработанные строковые литералы также могут использоваться для создания строк, включающих несколько строчек:

      `Go is expressive, concise, clean, and efficient.
      Its concurrency mechanisms make it easy to write programs
      that get the most out of multi-core and networked machines,
      while its novel type system enables flexible and modular
      program construction. Go compiles quickly to machine code
      yet has the convenience of garbage collection and the power
      of run-time reflection. It's a fast, statically typed,
      compiled language that feels like a dynamically typed,
      interpreted language.`
      

      Интерпретируемые строковые литералы — это последовательность символов внутри двойных кавычек, например, "bar". Внутри кавычек отображается любой символ, за исключением символа переноса строки и неэкранированных двойных кавычек.

      "Say "hello" to Go!"
      

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

      Теперь, когда вы знаете, как выполняется форматирование строк в Go, давайте посмотрим, как вы можете выводить строки на экран в своих программах.

      Вывод строк на экран

      Вы можете вывести на экран строки с помощью пакета fmt из системной библиотеки и вызова функции Println():

      fmt.Println("Let's print out this string.")
      

      Output

      Let's print out this string.

      Вы должны выполнить импорт системных пакетов для их использования, а простейшая программа для вывода строк на экран будет выглядеть следующим образом:

      package main
      
      import "fmt"
      
      func main() {
          fmt.Println("Let's print out this string.")
      }
      

      Конкатенация строк

      Конкатенация — это объединение строк для получения новой строки. Для выполнения конкатенации строк воспользуйтесь оператором +. Необходимо учитывать, что при работе с числами оператор + будет выполнять сложение, а при работе со строками будет выполняться конкатенация.

      Давайте объединим строковые литералы "Sammy" и "Shark" с помощью выражения fmt.Println():

      fmt.Println("Sammy" + "Shark")
      

      Output

      SammyShark

      Если вам нужно поместить пробелы между двумя строками, вы можете просто включить в строку пробел. В этом примере пробел добавлен внутри кавычек после слова Sammy:

      fmt.Println("Sammy " + "Shark")
      

      Output

      Sammy Shark

      Оператор + не может использоваться для работы с двумя разными типами данных. Например, вы не сможете выполнить сложение строк и чисел. Если вы попытаетесь выполнить следующее:

      fmt.Println("Sammy" + 27)
      

      Вы получите следующие ошибки:

      Output

      cannot convert "Sammy" (type untyped string) to type int invalid operation: "Sammy" + 27 (mismatched types string and int)

      Если вы хотите создать строку "Sammy27", вы можете поместить число 27 в кавычки ("27"), в результате чего оно больше не будет числом, а превратится в строку. Преобразование чисел в строки для выполнения конкатенации может быть полезным при работе с почтовыми индексами или телефонными номерами. Например, вы не хотите выполнять сложение кода страны и кода города, а хотите поместить их рядом.

      При объединении двух или более строк вы создаете новую строку, которую можно использовать в вашей программе.

      Хранение строк в переменных

      Переменные — это символы, которые вы можете использовать для хранения данных в программе. Их можно сравнить с пустой коробкой, в которую вы помещаете данные или значение. Строки — это данные, а значит вы можете использовать их для заполнения переменной. Объявление строк в качестве переменных упрощает работу со строками в ваших программах Go.

      Чтобы сохранить строку внутри переменной, нужно просто назначить переменную для строки. В нашем случае мы объявим s как переменную:

      s := "Sammy likes declaring strings."
      

      Примечание. Если вы знакомы с другими языками программирования, вы можете использовать в качестве переменной sammy. В Go приветствуется использование коротких имен переменных. Выбор s в качестве имени переменной в нашем случае будет выглядеть более уместным для стиля написания программ на языке Go.

      Теперь, когда у вас есть переменная s для нашей конкретной строки, вы можете вывести значение переменной на экран следующим образом:

      fmt.Println(s)
      

      Вы получите следующий вывод:

      Output

      Sammy likes declaring strings.

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

      Заключение

      В этом обучающем руководстве мы изучили базовые принципы работы со строковым типом данных в языке программирования Go. Создание и вывод строк, конкатенация и копирование строк, а также сохранение строк в переменных позволит вам выполнять базовые действия со строками в ваших программах Go.



      Source link

      Начало работы с программно-конфигурируемой сетью и создание VPN с помощью ZeroTier One


      Введение

      Сегодня все больше и больше проектов разработки программного обеспечения реализуются командами, участники которых работают вместе из разных географических мест. Хотя у такого рабочего процесса есть много видимых преимуществ, существуют ситуации, когда таким командам может потребоваться соединить свои компьютеры через Интернет и рассматривать их так, будто они находятся в одной комнате. Например, вы можете заниматься тестированием распределенных систем, например Kubernetes, и созданием мультисервисных приложений. Иногда можно повысить продуктивность, если вы можете рассматривать компьютеры так, будто они находятся рядом с друг другом, поскольку вам не нужно будет рисковать тем, что ваши незавершенные службы попадут в Интернет. Эта парадигма может быть реализована через программно-конфигурируемую сеть (Software-Defined Networking, SDN) — сравнительно новую технологию, которая предоставляет динамическую сетевую систему, чье существование полностью опирается на программное обеспечение.

      ZeroTier One — это приложение с открытым исходным кодом, использующее некоторые из последних разработок в SDN, которое позволяет пользователям создавать защищенные, управляемые сети и рассматривать связанные устройства так, будто они находятся в одном физическом месте. ZeroTier предоставляет клиентам веб-консоль для управления сетью и программным обеспечением на конечных устройствах. Данный инструмент использует пиринговую технологию, а это значит, что, в отличие от традиционных VPN-решений, в процессе коммуникации не используется центральный сервер или маршрутизатор, а сообщения пересылаются напрямую из хоста к хосту. Результатом этого является высокая эффективность и минимальное время задержки. Среди других преимуществ следует отметить простоту процесса развертывания и конфигурации ZeroTier, удобство поддержки и возможность централизованной регистрации и управления авторизованными узлами через веб-консоль.

      Следуя указаниям данного руководства, вы сможете создать подключение клиента и сервера через простую сеть с двухточечным соединением. Так как программно-конфигурируемая сеть не использует традиционную схему клиент/сервер, нет необходимости в установке и настройке центрального сервера VPN. Это упрощает развертывание инструмента и добавление дополнительных узлов. После установки подключения у вас появится возможность использовать VPN-возможности ZeroTier с помощью ряда полезных функций Linux, чтобы разрешить трафику покидать вашу сеть ZeroTier через ваш сервер и дать клиенту указания по отправке своего трафика в этом направлении.

      Предварительные требования

      Прежде чем переходить к выполнению данного руководства, вам потребуются следующие ресурсы:

      • Сервер на базе Ubuntu 16.04. На этом сервере вам также потребуется пользователь без прав root с привилегиями sudo, которого можно настроить с помощью нашего руководства по начальной настройке сервера Ubuntu 16.04.

      • Учетная запись в ZeroTier One, которую вы можете создать, посетив My ZeroTier. Для настоящего руководства вы можете использовать бесплатную версию данного сервиса, которая не потребует расходов или обязательств.

      • Локальный компьютер для подключения к SDN в качестве клиента. В примерах в данном руководстве и сервер, и локальный компьютер работают под управлением Ubuntu Linux, но любую операционную систему, перечисленную в списке на странице загрузки ZeroTier, можно использовать для клиента.

      После выполнения этих предварительных требований вы можете начать настройку программно-конфигурируемой сети для вашего сервера и локального компьютера.

      Шаг 1 — Создание программно-конфигурируемой сети с помощью ZeroTier One

      Платформа ZeroTier предоставляет центральную точку для управления вашей программно-конфигурируемой сетью. С ее помощью вы можете добавлять и удалять авторизованные клиенты, выбирать схему адресации и создавать сетевой идентификатор, который вы можете отправлять клиентам при настройке.

      Выполните вход в учетную запись ZeroTier, нажмите Networks (Сети) в верхней части экрана, а затем нажмите Create (Создать). Появится название автоматически сгенерированной сети. Нажмите на нее, чтобы просмотреть экран конфигурации вашей сети. Запишите Network ID​​​​​ (Идентификатор сети), выделенный желтым цветом, поскольку он потребуется вам позднее.

      Если вы захотите изменить имя сети на что-то более информативное, измените имя в левой части экрана. Вы можете добавить описание, если хотите. Любые изменения, которые вы вносите, сохраняются и применяются автоматически.

      Затем выберите адресное пространство IPv4, в котором будет работать SDN. С правой стороны экрана в области под названием IPv4 Auto-Assign (Автоматическое присвоение IPv4), выберите диапазон адресов, в котором будут находиться узлы. Для целей данного руководства можно использовать любое адресное пространство, но важно поставить галочку в поле Auto-Assign from Range (Автоматическая привязка из адресного пространства).

      Убедитесь, что для параметра Access Control (Контроль доступа) слева установлено значение Certificate (Private Network) (Сертификат (Частная сеть)). Это гарантирует, что только одобренные компьютеры смогут подключиться к сети, а не каждый, кто будет знать ваш идентификатор сети!

      После завершения настройки ваши параметры должны выглядеть примерно следующим образом:

      Конфигурация настроек ZeroTier

      К данному моменту вы успешно создали фундамент программно-конфигурируемой сети ZeroTier. Далее вам нужно будет установить программное обеспечение ZeroTier на сервер и клиентские компьютеры, чтобы они могли подключиться к вашей SDN.

      Шаг 2 — Установка клиента ZeroTier One на сервер и локальный компьютер

      Поскольку ZeroTier One является относительно недавно разработанным программным обеспечением, он еще не включен в основные репозитории программного обеспечения Ubuntu. По этой причине ZeroTier предоставляет скрипт установки, который мы будем использовать для установки программного обеспечения. Эта команда является скриптом с подписью GPG, что означает, что код, который вы загружаете, будет проверяться при публикации ZeroTier. Скрипт имеет четыре основные части, а ниже представлено подробное описание каждой из них:

      • curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61'​​​ — данная часть импортирует публичный ключ ZeroTier из MIT.
      • gpg --import — данная часть команды добавляет публичный ключ ZeroTier в локальную цепочку ключей полномочий, необходимых для проверки пакетов, которые вы пытаетесь установить. Следующая часть команды будет выполняться только при успешном завершении импорта GPG.
      • if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" — в этой части происходит несколько вещей, но ее можно перевести следующим образом: “если скрипт установки с криптографической подписью, загружаемый с ZeroTier.com, передается через GPG и не отклоняется как неподписанный ZeroTier, необходимо вставить эту информацию на экран”.
      • sudo bash; fi — данная часть использует прошедший валидацию скрипт установщика и выполняет его перед окончанием процесса.

      Предупреждение: никогда не загружайте что-либо из Интернета и не добавляйте это в другую программу, если вы не уверены в надежности источника. По желанию вы можете проверить программное обеспечение ZeroTier, изучив исходный код на официальной странице проекта на GitHub.

      Воспользуйтесь консолью SSH для подключения к недавно созданному серверу и запустите следующую команду с помощью обычного пользователя (объяснение команды приведено ниже). Убедитесь, что вы не используете его как пользователя с правами root, поскольку скрипт автоматически запрашивает пароль для повышения уровня привилегий, а также обязательно оставьте консоль ZeroTier открытой в браузере, чтобы вы могли взаимодействовать с ней при необходимости.

      • curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi

      После завершения работы скрипта вы увидите две строки вывода, аналогичные представленным ниже. Запишите адрес ZeroTier (без квадратных скобок) и имя системы, которая генерирует адрес, потому что эти данные потребуются вам позднее:

      Output

      *** Waiting for identity generation... *** Success! You are ZeroTier address [ 916af8664d ].

      Повторите этот шаг на локальном компьютере, если вы используете Ubuntu, или выполните необходимые действия для вашей операционной системы, описанные на странице загрузки на сайте ZeroTier. Обязательно запишите адрес ZeroTier и компьютера, который сгенерировал адрес. Вам потребуется эта информация на следующем шаге руководства, когда вы действительно будете подключать сервер и клиент к сети.

      Шаг 3 — Подключение к сети ZeroTier

      Теперь, когда на сервере и на клиенте установлено и запущено программное обеспечение ZeroTier, вы можете подключить их к сети, которую вы создали в веб-консоли ZeroTier.

      Используйте следующую команду, чтобы указать вашему клиенту запрашивать доступ к сети ZeroTier через его платформу. Первоначальный запрос клиента будет отклонен и оставлен в подвешенном состоянии, но мы сможем исправить это за секунду. Обязательно замените NetworkID на идентификатор сети, представленный в окне конфигурации сети, который вы записали ранее.

      • sudo zerotier-cli join NetworkID

      Output

      200 join OK

      Вы получите сообщение 200 join OK, подтверждающее, что служба ZeroTier на вашем сервере приняла команду. В ином случае еще раз проверьте идентификатор сети ZeroTier, который вы ввели.

      Поскольку вы создали не публичную сеть, к которой может подключиться любой пользователь в мире, вам нужно будет авторизовать клиентов. Перейдите в веб-консоль ZeroTier и прокрутите до самого конца до раздела Members (Участники). Вы должны найти две записи, помеченные Online (Онлайн), с теми же адресами, которые вы записали ранее.

      В первом столбце, помеченном *Auth? *(Авторизация?), поставьте галочки, чтобы разрешить им подключиться к сети. Контроллер ZeroTier будет выделять IP-адрес для сервера и клиента из адресного пространства, которое вы выбрали ранее. Этот адрес они будут использовать при следующем вызове SDN.

      Выделение IP-адресов может занять определенное время. Во время ожидания вы можете указать Short Name (Короткое имя) и Description (Описание) для ваших узлов в разделе Members (Участники).

      В результате этих действий вы сможете подключить две системы к вашей программно-конфигурируемой сети.

      К настоящему моменту вы кратко познакомились с панелью управления ZeroTier, использовали интерфейс командной строки для загрузки и установки ZeroTier, а затем подключили сервер и клиент к этой сети. Далее вам необходимо проверить, что все было применено корректно, выполнив тест подключения.

      Шаг 4 — Проверка подключения

      На данном этапе важно подтвердить, что оба хоста могут общаться друг с другом. Есть вероятность, что хотя хосты утверждают, что подключение к сети установлено, на самом деле они не могут общаться. Выполнив проверку подключения сейчас, вам не нужно будет беспокоиться о базовых проблемах сетевого взаимодействия, которые могут возникнуть позднее.

      Найти IP-адрес каждого хоста ZeroTier проще всего в разделе Members (Участники) в веб-консоли ZeroTier. Вам может потребоваться обновить его после авторизации сервера и клиента, прежде чем их IP-адреса появятся в данном разделе. Кроме того, вы можете воспользоваться командной строкой Linux для поиска этих адресов. Используйте следующую команду на обоих компьютерах — первый IP-адрес в списке будет адресом, который необходимо использовать. В представленном ниже примере это адрес 203.0.113.0.

      • ip addr sh zt0 | grep 'inet'

      Output

      inet 203.0.113.0/24 brd 203.0.255.255 scope global zt0 inet6 fc63:b4a9:3507:6649:9d52::1/40 scope global inet6 fe80::28e4:7eff:fe38:8318/64 scope link

      Чтобы протестировать подключение между хостами, запустите команду ping из одного хоста, добавив к ней IP-адрес другого хоста. Например, это может выглядеть так на компьютере-клиенте:

      И так на сервере:

      Если от противоположного хоста будет получен ответ (как показано в выводе ниже), можно считать, что оба узла успешно передают данные через SDN.

      Output

      PING 203.0.113.0 (203.0.113.0) 56(84) bytes of data. 64 bytes from 203.0.113.0: icmp_seq=1 ttl=64 time=0.054 ms 64 bytes from 203.0.113.0: icmp_seq=2 ttl=64 time=0.046 ms 64 bytes from 203.0.113.0: icmp_seq=3 ttl=64 time=0.043 ms

      Вы можете добавить любое количество компьютеров в данную конфигурацию, повторив описанный выше процесс установки ZeroTier и подключения. Помните, что эти компьютеры не должны располагаться рядом друг с другом.

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

      Шаг 5 — Активация функции VPN в ZeroTier

      Как было отмечено во введении, вы можете использовать ZeroTier в качестве инструмента VPN. Если вы не планируете использовать ZeroTier в качестве решения для организации VPN, вы можете пропустить этот шаг и перейти сразу к шагу 6.

      Использование VPN скрывает источник вашей коммуникации с веб-сайтами в Интернете. Это позволяет вам обойти фильтры и ограничения, которые могут существовать в сети, которую вы используете. В отношении более широкого Интернета, вы сможете использовать публичный IP-адрес вашего сервера. Чтобы использовать ZeroTier в качестве инструмента VPN, вам придется внести ряд дополнительных изменений в конфигурацию вашего сервера и клиента.

      Активация преобразования сетевых адресов и IP-передачи

      Преобразование сетевых адресов, обычно именуемое NAT (Network Address Translation), — это метод, с помощью которого маршрутизатор принимает пакеты на одном интерфейсе с IP-адресом отправителя, а затем меняет этот адрес на адрес маршрутизатора. Запись этой замены сохраняется в памяти маршрутизатора, чтобы при возвращении трафика, идущего в противоположном направлении, маршрутизатор смог перевести IP-адрес обратно на первоначальный. NAT обычно используется, чтобы позволить нескольким компьютерам использовать один общедоступный IP-адрес, что очень удобно при использовании VPN. Примером использования NAT на практике является домашний роутер, который ваш интернет-провайдер предоставляет вам для подключения всех устройств в вашем доме к сети Интернет. Ваш ноутбук, телефон, планшет и любые другие устройства с поддержкой сети Интернет, скорее всего, используют один открытый IP-адрес в Интернете, поскольку ваш маршрутизатор использует NAT.

      Хотя NAT обычно выполняется маршрутизатором, сервер также может использовать эту технологию. На данном шаге вы сможете реализовать эту функцию на вашем сервере ZeroTier для активации VPN.

      IP-передача — это функция, выполняемая маршрутизатором или сервером, когда трафик перенаправляется с одного интерфейса на другой, если IP-адреса находятся в разных зонах. Если маршрутизатор подключен к двум сетям, передача IP-адреса позволяет ему пересылать трафик между этими сетями. Это может показаться простым, но успешно реализовать этот функционал может быть очень сложно. В нашем случае нам необходимо будет лишь изменить ряд файлов конфигурации.

      С помощью активации передачи IP-адреса VPN трафик вашего клиента в сети ZeroTier будет направляться на интерфейс ZeroTier на сервере. Без этих изменений конфигурации ядро Linux будет (по умолчанию) удалять любые пакеты, которые не предназначены для интерфейса, на который они прибывают. Это нормальное поведение для ядра Linux, поскольку, как правило, любые пакеты, которые будут прибывать на интерфейс, имеющие в качестве адреса назначения адрес другой сети, могут быть вызваны некорректной конфигурацией в других местах сети.

      Полезно рассматривать передачу IP-адреса как информирование ядра Linux о том, что оно может пересылать пакеты между интерфейсами. Настройка по умолчанию 0, что является эквивалентом значения “Выкл”. Вы должны задать значение 1, что является эквивалентом значения “Вкл”.

      Для просмотра текущей конфигурации запустите следующую команду:

      • sudo sysctl net.ipv4.ip_forward

      Output

      net.ipv4.ip_forward = 0

      Чтобы активировать передачу IP-адреса, измените файл /etc/sysctl.conf на вашем сервере и добавьте необходимую строку. Этот файл конфигурации позволяет администратору переопределять параметры ядра по умолчанию и будет всегда применяться после перезагрузки, поэтому вам не придется беспокоиться о том, чтобы настраивать его снова. Используйте nano или свой любимый текстовый редактор, чтобы добавить следующую строку внизу файла.

      • sudo nano /etc/sysctl.conf

      /etc/sysctl.conf

      . . .
      net.ipv4.ip_forward = 1
      

      Сохраните и закройте файл, а затем запустите следующую команду, чтобы запустить процесс активации новой конфигурации ядра.

      Сервер будет принимать любые новые директивы конфигурации внутри файла и немедленно применять без перезагрузки. Запустите ту же команду, что и ранее, и вы увидите, что функция передачи IP-адреса активирована.

      • sudo sysctl net.ipv4.ip_forward

      Output

      net.ipv4.ip_forward = 1

      Теперь, когда передача IP-адреса активирована, вы сможете ее использовать, задав несколько базовых правил маршрутизации для сервера. Поскольку в ядре Linux уже присутствует поддержка сетевой маршрутизации, вам нужно будет только добавить определенные правила, которые будут указывать встроенному брандмауэру и маршрутизатору, что новый трафик, который они будут видеть, можно принимать, а также сообщать, куда его нужно переслать.

      Чтобы добавить эти правила из командной строки, вам сначала нужно узнать имена, которые Ubuntu присвоила вашему интерфейсу ZeroTier и вашему интерфейсу локальной сети с выходом в Интернет. Как правило, это zt0 и eth0 соответственно, хотя это не всегда так.

      Чтобы найти имена этих интерфейсов, используйте команду ip link show​​​. Эта утилита командной строки является частью iproute2, набора утилит пользовательского пространства, которые будут устанавливаться в Ubuntu по умолчанию:

      В выводе этой команды имена интерфейсов находятся рядом с номерами, которые определяют уникальный интерфейс в списке. Эти имена интерфейсов выделены в следующем примере вывода. Если ваши имена отличаются от имен, представленных в данном примере, замените ваши имена на соответствующие для использования в данном руководстве.

      Output

      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 72:2d:7e:6f:5e:08 brd ff:ff:ff:ff:ff:ff 3: zt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether be:82:8f:f3:b4:cd brd ff:ff:ff:ff:ff:ff

      Получив эту информацию, воспользуйтесь iptables, чтобы активировать преобразование сетевых адресов и IP-маскарадинг.

      • sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

      Разрешите перенаправление трафика и отслеживание активных соединений:

      • sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

      Далее разрешите перенаправление трафика с zt0 на eth0. Обратное правило не требуется, поскольку в рамках данного руководства предполагается, что клиент всегда вызывается через сервер, а не наоборот:

      • sudo iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT

      Важно помнить, что правила iptables, которые вы задали для сервера, не сохраняются автоматически между перезагрузками. Вам нужно будет отдельно сохранить эти правила, чтобы они продолжали действовать после перезагрузки сервера. Запустите перечисленные ниже команды на сервере, следуя кратким инструкциям на экране, чтобы сохранить текущие правила для IPv4, правила для IPv6 не требуются.

      • sudo apt-get install iptables-persistent
      • sudo netfilter-persistent save

      После запуска sudo netfilter-persistent save рекомендуется перезагрузить ваш сервер, чтобы подтвердить, что правила iptables были сохранены корректно. Самым удобным способом проверки является запуск команды sudo iptables-save, которая будет выводить текущую конфигурацию, загруженную в память, на терминал. Если вы увидите правила, аналогичные правилам ниже, действующие в отношении маскарадинга, перенаправления и интерфейса zt0, это значит, что они были сохранены корректно.

      Output

      # Generated by iptables-save v1.6.0 on Tue Apr 17 21:43:08 2018 . . . -A POSTROUTING -o eth0 -j MASQUERADE COMMIT . . . -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i zt0 -o eth0 -j ACCEPT COMMIT . . .

      Теперь, когда эти правила были применены на вашем сервере, вы можете перебрасывать трафик между сетью ZeroTier и общедоступной сетью Интернет. Однако VPN не будет работать, если сама сеть ZeroTier не будет знать о том, что сервер готов к использованию в качестве шлюза.

      Активация вашего сервера для управления глобальным маршрутом

      Чтобы ваш сервер мог обрабатывать трафик от любого клиента, вы должны убедиться, что другие клиенты в сети ZeroTier знают о необходимости отправлять свой трафик на сервер. Это можно сделать с помощью настройки глобального маршрута в консоли ZeroTier. Люди, которые знакомы с компьютерными сетями, также могут использовать термин маршрут по умолчанию. Это маршрут, куда любой клиент отправляет трафик по умолчанию, т. е. любой трафик, который не имеет другого конкретного получателя.

      Перейдите в верхнюю часть страницы сети ZeroTier и добавьте новый маршрут со следующими параметрами. Вы можете найти IP-адрес вашего сервера в сети ZeroTier в разделе Members (Участники) на странице конфигурации сети ZeroTier. В поле network/bits (сеть/биты) введите значение 0.0.0.0/0, а в поле (LAN) (Локальная сеть) введите IP-адрес вашего сервера ZeroTier.

      Когда все данные будут сохранены, нажмите символ “+”, после чего вы увидите новое правило под существующим правилом. Правило будет иметь оранжевый глобус, который служит сигналом о том, что это глобальный маршрут:

      Правило глобального маршрута

      Теперь, когда ваша сеть ZeroTier готова к работе, осталось добавить только одну конфигурацию, чтобы VPN заработал. Это конфигурация клиентов.

      Настройка клиентов Linux

      Примечание: команды в данном разделе применяются только для клиентов Linux. Инструкции по настройке клиентов Windows или macOS содержатся в следующем разделе.

      Если ваш клиент работает в операционной системе Linux, вам нужно будет вручную внести изменения в файл /etc/sysctl.conf. Это изменение конфигурации необходимо, чтобы поменять представление ядра о приемлемом пути возвращения вашего клиентского трафика. Из-за того, как настроен VPN в ZeroTier, иногда может казаться, что трафик, который ваш сервер возвращает клиенту, имеет другой сетевой адрес, чем адрес, на который он был отправлен. По умолчанию ядро Linux рассматривает это как ошибку и отклоняет трафик, что делает необходимым переопределение такого поведения.

      Откройте /etc/sysctl.conf на клиентском компьютере:

      • sudo nano /etc/sysctl.conf

      А затем добавьте следующую строку:

      Output

      . . . net.ipv4.conf.all.rp_filter=2

      Сохраните и закройте файл, а затем запустите команду sudo sysctl -p, чтобы принять изменения.

      Далее укажите программному обеспечению клиента ZeroTier, что в вашей сети разрешен маршрут по умолчанию для трафика. Это изменяет маршрутизацию клиента и рассматривается как привилегированная функция, поэтому ее нужно активировать вручную. Команда будет выводить структуру конфигурации. Проверьте это, чтобы убедиться, что она отображает allowDefault=1 в верхней части:

      • sudo zerotier-cli set NetworkID allowDefault=1

      Если вы в какой-либо момент времени захотите прекратить использование ZeroTier в качестве VPN со всей вашей маршрутизацией трафика, задайте обратно значение 0 для allowDefault:

      • sudo zerotier-cli set NetworkID allowDefault=0

      При каждом перезапуске службы ZeroTier на клиентском компьютере значение allowDefault=1 будет сбрасываться до 0. Не забывайте повторно указать его, чтобы активировать функции VPN.

      По умолчанию для службы ZeroTier задается автоматический запуск при загрузке как для клиента Linux, так и для сервера. Если вы не хотите, чтобы служба запускалась автоматически, вы можете отключить стандартный процесс запуска с помощью следующей команды.

      • sudo systemctl disable zerotier-one

      Если вы хотите использовать другие операционные системы в сети ZeroTier, перейдите к следующему разделу. В противном случае перейдите в раздел управления потоками.

      Настройка работающих не под Linux клиентов

      Программное обеспечение ZeroTier доступно для многих систем, а не только для Linux. Поддерживаются даже смартфоны. Существуют клиенты для Windows, macOS, Android, iOS и даже таких специализированных операционных систем, как QNAP, Synology и WesternDigital NAS.

      Чтобы подключить к системе клиенты на базе macOS и Windows, запустите инструмент ZeroTier (который вы установили на шаге 1) и введите ваш сетевой идентификатор в доступное поле, а затем нажмите Join (Подключиться). Не забудьте зайти в консоль и поставить галочку Allow (Разрешить), чтобы авторизовать новый хост в вашей сети.

      Также необходимо обязательно проставить галочку в поле Route all traffic through ZeroTier (Направлять весь трафик через ZeroTier). Если вы не сделаете этого, ваш клиент будет подключен к вашей сети ZeroTier, но не будет пытаться пересылать свой интернет-трафик через эту сеть.

      Используйте инструмент для проверки IP, например, ICanHazIP, чтобы убедиться, что ваш трафик отправляется в сеть Интернет через IP-адрес вашего сервера. Чтобы проверить это, вставьте следующий URL-адрес в адресную строку браузера. Этот веб-сайт отображает IP-адрес, который его сервер (и остальной Интернет) видит, когда вы заходите на сайт:

      http://icanhazip.com
      

      После выполнения этих действий вы сможете начать использование VPN, когда захотите. Следующий дополнительный раздел описывает технологию, которая опирается на ZeroTier SDN и называется “правила потока”, но она не является необходимой для работы VPN.

      Шаг 6 — Управление потоками (дополнительно)

      Одним из преимуществ программно-конфигурируемой сети является централизованный контроллер. В ZeroTier централизованный контроллер — это пользовательский веб-интерфейс, который располагается поверх всей службы ZeroTier SDN. С помощью данного интерфейса вы можете задавать правила, известные как правила потока. Эти правила определяют, какой трафик допускается в сети, а какой нет. Например, вы можете задать полный запрет на использование определенных сетевых портов, передающих трафик по всей сети, ограничить, какие хосты могут общаться друг с другом, и даже перенаправлять трафик.

      Это очень мощный инструмент, который дает результат почти мгновенно, поскольку любые изменения в таблице потока передаются участникам сети и вступают в силу в считанные секунды. Чтобы изменить правила потока, вернитесь в пользовательский веб-интерфейс ZeroTier, нажмите вкладку Networking (Сеть) и прокрутите до поля Flow Rules (Правила потока) (оно может быть свернуто и вам потребуется развернуть его). В результате откроется текстовое поле, где вы можете ввести любые правила, какие захотите. Полное руководство доступно в консоли ZeroTier в поле, расположенном непосредственно под полем для ввода Flow Rules (Правила потока), которое называется Rules Engine Help (Справка для обработчика правил).

      Ниже представлен ряд примеров, которые помогут вам изучить данный функционал.

      Чтобы заблокировать любой трафик, идущий с DNS-сервера Google 8.8.8.8, добавьте следующее правило:

      drop
          ipdest 8.8.8.8/32
      ;
      

      Чтобы перенаправить любой трафик, идущий с открытого DNS-сервера Google, на один из узлов ZeroTier, добавьте следующее правило. Это отличный способ перехвата любых переопределенных DNS-поисков:

      redirect NetworkID
          ipdest 8.8.8.8/32
      ;
      

      Если у вашей сети есть особые требования безопасности, вы можете запретить любую активность через FTP-порты, Telnet и незашифрованный HTTP-протокол, добавив следующее правило:

      drop
          dport 80,23,21,20
      ;
      

      Когда вы закончите добавлять правила потока, нажмите кнопку Save Changes (Сохранить изменения), после чего ZeroTier запишет изменения.

      Заключение

      С помощью данного руководства вы сделали свои первые шаги в мире программно-конфигурируемых сетей, а работа с ZeroTier предоставила вам некоторую информацию о преимуществах этой технологии. Если вы выполняли указания в примере, посвященном VPN, хотя первоначальная настройка может отличаться от других инструментов, которые вы использовали в прошлом, то простота добавления дополнительных клиентов может стать убедительной причиной использования этой технологии в других местах.

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

      Теперь, когда существует сеть с двухточечным соединением, вы можете объединить ее с другим функционалом, например совместным доступом к файлам. Если у вас есть NAS или файловый сервер, вы можете подключить его к ZeroTier и получать к нему доступ без каких-либо проблем и сложностей. Если вы захотите поделиться им с друзьями, вам нужно будет только показать им, как подключиться к сети ZeroTier. Сотрудники, работающие в самых разных физических точках, могут даже подключаться к одному центральному хранилищу. Для начала создания общего файлового ресурса для любого из этих примеров ознакомьтесь с руководством Настройка файлообменника Samba для небольшой организации на Ubuntu 16.04.



      Source link