One place for hosting & domains

      сервера

      Включение рендеринга на стороне сервера для приложения React


      Введение

      Рендеринг на стороне сервера (SSR) — это популярная методика рендеринга одностраничного клиентского приложения (SPA) на сервере и последующей отправки на клиент полностью отрисованной страницы. Это позволяет использовать динамические компоненты в качестве статической разметки HTML.

      Такой подход может быть полезным для поисковой оптимизации (SEO), когда при индексации код JavaScript не обрабатывается надлежащим образом. Это также может быть полезно в ситуациях, когда загрузка большого блока JavaScript затруднена из-за медленной скорости сети.

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

      После прохождения учебного модуля вы получите работающий проект с клиентским приложением React и серверным приложением Express.

      Примечание. Также Next.js позволяет использовать современный подход к созданию статических приложений React и приложений, рендеринг которых выполняется на сервере.

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

      Для данного обучающего руководства вам потребуется следующее:

      Этот учебный модуль был проверен с версиями Node v14.4.0 и npm v6.14.5.

      Шаг 1 — Создание приложения React и изменение компонента приложения

      Вначале мы используем npx для запуска нового приложения React с помощью последней версии Create React App.

      Назовем наше приложение my-ssr-app:

      • npx create-react-app@3.4.1 my-ssr-app

      Перейдем в новый каталог с помощью команды cd:

      cd my-ssr-app
      

      В заключение мы запустим наше новое приложение на стороне клиента для проверки установки:

      Вы должны увидеть пример приложения React в окне браузера.

      Теперь создадим компонент <Home>:

      Затем добавим следующий код в файл Home.js:

      src/Home.js

      import React from 'react';
      
      export default props => {
        return <h1>Hello {props.name}!</h1>;
      };
      

      При этом будет создан заголовок <h1> с сообщением "Hello“, адресованным имени.

      Далее мы выполним рендеринг <Home> в компоненте <App>. Откройте файл App.js:

      Затем заменим существующие строки кода новыми строками кода:

      src/App.js

      import React from 'react';
      import Home from './Home';
      
      export default () => {
        return <Home name="Sammy" />;
      };
      

      Они передают name в компонент <Home> так, что ожидаемое сообщение будет выглядеть так: "Hello Sammy!".

      В файле index.js нашего приложения мы будем использовать метод ReactDOM hydrate вместо render, чтобы указать блоку рендеринга DOM, чтобы мы восстанавливаем приложение после рендеринга на стороне сервера.

      Откроем файл index.js:

      Замените содержимое файла index.js следующим кодом:

      index.js

      import React from 'react';
      import ReactDOM from 'react-dom';
      import App from './App';
      
      ReactDOM.hydrate(<App />, document.getElementById('root'));
      

      Мы завершили настройку на стороне клиента и теперь можем перейти к настройке на стороне сервера.

      Шаг 2 — Создание сервера Express и рендеринг компонента приложения

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

      • npm install express@4.17.1

      Также можно использовать yarn:

      Создайте каталог server рядом с каталогом src нашего приложения:

      Затем создайте новый файл index.js, содержащий код сервера Express:

      Добавим необходимые элементы импорта и определим некоторые константы:

      server/index.js

      import path from 'path';
      import fs from 'fs';
      
      import React from 'react';
      import express from 'express';
      import ReactDOMServer from 'react-dom/server';
      
      import App from '../src/App';
      
      const PORT = process.env.PORT || 3006;
      const app = express();
      

      Затем добавим код сервера с обработкой ошибок:

      server/index.js

      // ...
      
      app.get('/', (req, res) => {
        const app = ReactDOMServer.renderToString(<App />);
      
        const indexFile = path.resolve('./build/index.html');
        fs.readFile(indexFile, 'utf8', (err, data) => {
          if (err) {
            console.error('Something went wrong:', err);
            return res.status(500).send('Oops, better luck next time!');
          }
      
          return res.send(
            data.replace('<div id="root"></div>', `<div id="root">${app}</div>`)
          );
        });
      });
      
      app.use(express.static('./build'));
      
      app.listen(PORT, () => {
        console.log(`Server is listening on port ${PORT}`);
      });
      

      Как видите, мы можем импортировать наш компонент <App> из клиентского приложения непосредственно с сервера.

      Здесь происходит три важные вещи:

      • Мы предписываем Express вывести содержимое каталога build в виде статичных файлов.
      • Мы будем использовать метод ReactDOMServer, renderToString, для рендеринга нашего приложения в статичную строку HTML.
      • Затем мы считываем статичный файл index.html из готового клиентского приложения, вставляем статичное содержимое нашего приложения в <div> с id "root", а затем отправляем результат в качестве ответа на запрос.

      Шаг 3 — Настройка webpack, Babel и скриптов npm

      Чтобы наш серверный код работал, нам нужно объединить его в комплект и провести транспиляцию, используя webpack и Babel. Для этого добавим в проект зависимости dev, введя следующую команду в окне терминала:

      • npm install webpack@4.42.0 webpack-cli@3.3.12 webpack-node-externals@1.7.2 @babel/core@7.10.4 babel-loader@8.1.0 @babel/preset-env@7.10.4 @babel/preset-react@7.10.4 --save-dev

      Также можно использовать yarn:

      • yarn add webpack@4.42.0 webpack-cli@3.3.12 webpack-node-externals@1.7.2 @babel/core@7.10.4 babel-loader@8.1.0 @babel/preset-env@7.10.4 @babel/preset-react@7.10.4 --dev

      Примечание. В более ранней версии этого учебного модуля мы устанавливали babel-core, babel-preset-env и babel-preset-react-app. Эти пакеты с тех пор были архивированы, и вместо них используются версии с одним репозиторием.

      Далее мы создадим файл конфигурации Babel:

      После этого добавьте готовые настройки env и react-app:

      .babelrc.json

      {
        "presets": [
          "@babel/preset-env",
          "@babel/preset-react"
        ]
      }
      

      Примечание. В более ранней версии этого учебного модуля мы использовали файл .babelrc (без расширения .json). Это был файл конфигурации Babel 6, однако для Babel 7 он больше не используется.

      Теперь мы создадим конфигурацию webpack для сервера, который использует Babel Loader для транспиляции кода. Начните с создания файла:

      Затем добавьте следующие конфигурации в файл webpack.server.js:

      webpack.server.js

      const path = require('path');
      const nodeExternals = require('webpack-node-externals');
      
      module.exports = {
        entry: './server/index.js',
      
        target: 'node',
      
        externals: [nodeExternals()],
      
        output: {
          path: path.resolve('server-build'),
          filename: 'index.js'
        },
      
        module: {
          rules: [
            {
              test: /.js$/,
              use: 'babel-loader'
            }
          ]
        }
      };
      

      С этой конфигурацией наш транспилированный серверный комплект будет выводиться в папку server-build в файле с именем called index.js.

      Обратите внимание на использование target: 'node' и externals: [nodeExternals()] из webpack-node-externals. При этом опускаются файлы из node_modules в комплекте, сервер сможет получить доступ к этим файлам напрямую.

      Это завершает установку зависимости и конфигурации webpack и Babel.

      Теперь мы снова вернемся к файлу package.json и добавим вспомогательные скрипты npm:

      Мы добавим скрипты dev:build-server, dev:start и dev в файл package.json, чтобы легко выполнять сборку и подачу нашего приложения SSR:

      package.json

      "scripts": {
        "dev:build-server": "NODE_ENV=development webpack --config webpack.server.js --mode=development -w",
        "dev:start": "nodemon ./server-build/index.js",
        "dev": "npm-run-all --parallel build dev:*",
        ...
      },
      

      Мы используем nodemon для перезапуска сервера при внесении изменений. Также мы используем npm-run-all для параллельного выполнения нескольких команд.

      Давайте установим эти пакеты, введя следующие команды в окне терминала:

      • npm install nodemon@2.0.4 npm-run-all@4.1.5 --save-dev

      Также можно использовать yarn:

      • yarn add nodemon@2.0.4 npm-run-all@4.1.5 --dev

      Так вы можете запустить следующий код для сборки приложения на стороне клиента, объединения в пакет и транспиляции кода сервера и запуска сервера на порту :3006:

      Также можно использовать yarn:

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

      Откройте в браузере адрес http://localhost:3006/ и вы увидите приложение после рендеринга на стороне сервера.

      Ранее исходный код показал следующее:

      Output

      <div id="root"></div>

      С внесенными изменениями исходный код показывает:

      Output

      <div id="root"><h1 data-reactroot="">Hello <!-- -->Sammy<!-- -->!</h1></div>

      При рендеринге на стороне сервера компонент <App> был успешно конвертирован в формат HTML.

      Заключение

      В этом учебном модуле мы инициализировали приложение React и активировали рендеринг на стороне сервера.

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

      Преимущество использования SSR заключается в наличии приложения, содержимое которого может просмотреть даже сборщик, не выполняющий код JavaScript. Это поможет для поисковой оптимизации (SEO) и отправки метаданных на каналы социальных сетей.

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

      Если вы хотите узнать больше о React, почитайте нашу серию «Программирование на React.js» или посмотрите страницу тем React, где вы найдете упражнения и программные проекты.



      Source link

      Установка и настройка Postfix в качестве сервера SMTP только для отправки в Ubuntu 20.04


      Автор выбрал фонд Free and Open Source Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Postfix — это агент передачи почты (MTA), т. е. приложение для отправки и приема электронной почты. Его можно настроить так, чтобы только локальные приложения могли использовать его для отправки электронной почты. Это может быть полезно, если вам нужно регулярно рассылать по электронной почте уведомления от ваших приложений или у вас много исходящего трафика, а сторонний поставщик услуг электронной почты не разрешает такие объемы. Это облегченная альтернатива развертыванию полноценного сервера SMTP, позволяющая сохранить требуемые функции.

      В этом обучающем модуле мы установим и настроим Postfix как сервер SMTP, доступный только для отправки. Также мы запросим бесплатные сертификаты TLS от Let’s Encrypt для вашего домена и настроим их использование для шифрования исходящей электронной почты.

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

      • Один сервер Ubuntu 20.04, настроенный в соответствии с инструкциями по начальной настройке сервера с Ubuntu 20.04, а также пользователь без привилегий root с привилегиями sudo.
      • Зарегистрированное полное доменное имя. В этом обучающем руководстве мы будем использовать your_domain. Вы можете купить доменное имя на Namecheap, получить его бесплатно на Freenom или воспользоваться услугами любого предпочитаемого регистратора доменных имен.
      • Запись DNS A с your_domain​​​, указывающая на публичный IP-адрес вашего сервера. В руководстве Введение в DigitalOcean DNS содержится подробная информация по их добавлению.

      Примечание. Имя хоста вашего сервера и имя вашего дроплета должны соответствовать your_domain, т. к. DigitalOcean автоматически задает записи PTR для IP-адреса дроплета по его имени.

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

      Шаг 1 — Установка Postfix

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

      Вначале обновите базу данных пакетов:

      Затем выполните установку Postfix, запустив следующую команду:

      • sudo apt install mailutils

      Перед окончанием установки вы увидите окно настройки конфигурации Postfix:

      Выберите в меню пункт Internet Site (Сайт), нажмите TAB для выбора<Ok>, а затем нажмите ENTER

      По умолчанию используется опция Internet Site (Сайт). Это наиболее подходящая опция для нашего случая, поэтому нажмите TAB, а затем нажмите ENTER. Если вы увидите только текст описания, нажмите TAB для выбора пункта OK, а затем нажмите ENTER.

      Если опция не отображается автоматически, запустите следующую команду:

      • sudo dpkg-reconfigure postfix

      После этого откроется еще один диалог настройки конфигурации System mail name (имя системной почты):

      Введите свое доменное имя, а затем нажмите TAB для выбора<Ok>, ENTER

      Имя системной почты System mail name должно совпадать с именем, которое вы присвоили своему серверу при его создании. После завершения настройки нажмите TAB, а затем нажмите ENTER.

      Мы установили Postfix и готовы приступить к настройке.

      Шаг 2 — Настройка Postfix

      На этом шаге мы настроим Postfix для отправки и приема электронных писем только с сервера, на котором он запущен, т. е. с localhost.

      Для этого нужно настроить Postfix для прослушивания только интерфейса виртуальной сети loopback, который сервер использует для внутренней связи. Для внесения изменений потребуется отредактировать главный файл конфигурации Postfix с именем main.cf, хранящийся в каталоге etc/postfix.

      Откройте его для редактирования в предпочитаемом текстовом редакторе:

      • sudo nano /etc/postfix/main.cf

      Найдите следующие строки:

      /etc/postfix/main.cf

      . . .
      mailbox_size_limit = 0
      recipient_delimiter = +
      inet_interfaces = all
      . . .
      

      Задайте для параметра inet_interfaces значение loopback-only:

      /etc/postfix/main.cf

      . . .
      mailbox_size_limit = 0
      recipient_delimiter = +
      inet_interfaces = loopback-only
      . . .
      

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

      /etc/postfix/main.cf

      . . .
      mydestination = $myhostname, your_domain, localhost.com, , localhost
      . . .
      

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

      /etc/postfix/main.cf

      . . .
      mydestination = localhost.$mydomain, localhost, $myhostname
      . . .
      

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

      /etc/postfix/main.cf

      ...
      masquerade_domains = your_main_domain
      

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

      После внесения изменений сохраните и закройте файл.

      Примечание. В случае хостинга нескольких доменов на одном сервере другие домены также можно передать Postfix с помощью директивы mydestination.

      Затем перезапустите Postfix, выполнив следующую команду:

      • sudo systemctl restart postfix

      Вы настроили Postfix только для отправки почты с вашего сервера. Теперь протестируем настройку, отправив тестовое сообщение на адрес электронной почты.

      Шаг 3 — Тестирование сервера SMTP

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

      Выполните следующую команду для отправки тестового письма:

      • echo "This is the body of the email" | mail -s "This is the subject line" your_email_address

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

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

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

      С этой конфигурацией адрес в поле «От» в отправляемых тестовых письмах будет иметь вид your_user_name@your_domain, где your_user_name — имя пользователя сервера, от лица которого вы запустили команду.

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

      Шаг 4 — Переадресация системной почты

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

      Файл /etc/aliases содержит список альтернативных имен получателей электронных писем. Откройте его для редактирования:

      По умолчанию он выглядит так:

      /etc/aliases

      # See man 5 aliases for format
      postmaster:    root
      

      Единственная содержащаяся в нем директива предписывает пересылать сгенерированные системой электронные сообщения пользователю root.

      Добавьте в конец файла следующую строку:

      /etc/aliases

      ...
      root:          your_email_address
      

      Эта строка предписывает пересылать электронные письма, отправленные пользователю root, на указанный адрес электронной почты. Обязательно замените your_email_address своим личным адресом электронной почты. После внесения изменений сохраните и закройте файл.

      Для вступления изменений в силу выполните следующую команду:

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

      Протестируйте отправку электронных писем пользователю root с помощью следующей команды:

      • echo "This is the body of the email" | mail -s "This is the subject line" root

      Письмо должно прийти на указанный вами почтовый ящик. Если его там нет, проверьте папку «Нежелательная почта».

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

      Шаг 5 — Включение шифрования SMTP

      Теперь вы можете включить шифрование SMTP, запросив бесплатный сертификат TLS от Let’s Encrypt для вашего домена (с помощью Certbot) и настроив Postfix для использования этого сертификата при отправке сообщений.

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

      В диалоге подтверждения введите Y и нажмите ENTER.

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

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

      Output

      Rule added Rule added (v6)

      Теперь порт открыт, и мы можем запустить Certbot для получения сертификата:

      • sudo certbot certonly --standalone --rsa-key-size 4096 --agree-tos --preferred-challenges http -d your_domain

      Эта команда предписывает Certbot выдавать сертификаты с размером ключа RSA 4096 бит, запустить временный отдельный веб-сервер (--standalone) для проверки и выполнить проверку через порт 80 (--preferred-challenges http). Перед запуском команды обязательно замените your_domain именем вашего домена и введите свой адрес электронной почты, когда система его запросит.

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

      Output

      Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Obtaining a new certificate Performing the following challenges: http-01 challenge for `your_domain` Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2020-07-11. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

      Как указано в примечаниях, ваши сертификат и файл закрытого ключа сохранены в каталоге /etc/letsencrypt/live/your_domain.

      Получив сертификат, откройте файл main.cf для редактирования:

      • sudo nano /etc/postfix/main.cf

      Найдите следующий раздел:

      /etc/postfix/main.cf

      # TLS parameters
      smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
      smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
      smtpd_tls_security_level=may
      
      smtp_tls_CApath=/etc/ssl/certs
      smtp_tls_security_level=may
      smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
      

      Замените your_domain именем вашего домена, где это необходимо. Ваши настройки TLS для Postfix будут обновлены:

      /etc/postfix/main.cf

      # TLS parameters
      smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem
      smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
      smtpd_tls_security_level=may
      
      smtp_tls_CApath=/etc/ssl/certs
      smtp_tls_security_level=may
      smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
      

      Закончив, сохраните и закройте файл.

      Перезапустите Postfix, чтобы применить изменения:

      • sudo systemctl restart postfix

      Попробуйте отправить электронное письмо еще раз:

      • echo "This is the body of an encrypted email" | mail -s "This is the subject line" your_email_address

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

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

      Заключение

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

      Если вы намереваетесь отправлять электронные письма потенциальным пользователям сайта (например, письма для подтверждения регистрации на форуме), попробуйте настроить записи SPF, чтобы электронные письма с вашего сервера выглядели еще более легитимными.



      Source link

      Настройка сервера IKEv2 VPN с StrongSwan в Ubuntu 20.04


      Предыдущая версия данного обучающего руководства была написана Джастином Эллингвудом (Justin Ellingwood) и Намо (Namo)

      Введение

      Виртуальная частная сеть (VPN) позволяет выполнять защищенное шифрование трафика, передаваемого через незащищенные сети, например, в кафе, на конференции или в аэропорту.

      Internet Key Exchange v2 или IKEv2 — это протокол, который позволяет создавать прямые туннели IPSec между сервером и клиентом. IPSec обеспечивает шифрование сетевого трафика в виртуальных частных сетях IKEv2. IKEv2 изначально поддерживается на ряде платформ (OS X 10.11+, iOS 9.1+, Windows 10) без дополнительных приложений и легко решает проблемы с подключением клиентов.

      В этом обучающем руководстве мы настроим сервер IKEv2 VPN с помощью StrongSwan на сервере Ubuntu 20.04. Затем вы узнаете, как подключиться к нему с помощью клиентов Windows, macOS, Ubuntu, iOS и Android.

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

      Для данного обучающего руководства вам потребуется следующее:

      Шаг 1 — Установка StrongSwan

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

      Начните с обновления кэша локальных пакетов:

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

      • sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins

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

      После завершения установки перейдем к созданию сертификатов.

      Шаг 2 — Создание центра сертификации

      Для идентификации на клиентских системах серверу IKEv2 требуется сертификат. Для упрощения формирования требуемого сертификата пакет strongswan-pki включает утилиту pki, которая может сгенерировать центр сертификации и сертификаты сервера.

      Для начала создадим несколько каталогов для хранения всех активо, с которыми мы будем работать. Структура каталогов соответствует некоторым каталогам в /etc/ipsec.d, куда мы постепенно переместим все создаваемые элементы:

      • mkdir -p ~/pki/{cacerts,certs,private}

      Затем мы заблокируем разрешения, чтобы другие пользователи не могли видеть наши частные файлы:

      Располагая структурой каталогов для хранения всех элементов, мы можем сгенерировать ключ root. Это будет 4096-битный ключ RSA, который будет использоваться для подписи корневого центра сертификации.

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

      • pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

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

      • pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem
      • --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

      Флаг --lifetime 3650 используется для обеспечения действительности корневого сертификата центра сертификации на протяжении 10 лет. Корневой сертификат центра обычно не меняется, поскольку его необходимо перераспределять на каждый использующий его сервер и клиент. Исходя из этого, 10 лет — это безопасный срок действия по умолчанию.

      Вы можете изменить значение различимого имени distinguished name (DN) на любое другое имя по своему желанию. Обычное имя (поле CN) здесь используется только как индикатор, поэтому оно не обязательно должно совпадать с чем-либо в вашей инфраструктуре.

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

      Шаг 3 — Генерирование сертификата для сервера VPN

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

      Вначале создайте закрытый ключ сервера VPN с помощью следующей команды:

      • pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

      Затем создайте и подпишите сертификат сервера VPN, используя ключ центра сертификации, созданный на предыдущем шаге. Запустите следующую команду, но измените поля Common Name (CN) и Subject Alternate Name (SAN) на имя DNS или IP-адрес вашего сервера VPN:

      • pki --pub --in ~/pki/private/server-key.pem --type rsa
      • | pki --issue --lifetime 1825
      • --cacert ~/pki/cacerts/ca-cert.pem
      • --cakey ~/pki/private/ca-key.pem
      • --dn "CN=server_domain_or_IP" --san server_domain_or_IP
      • --flag serverAuth --flag ikeIntermediate --outform pem
      • > ~/pki/certs/server-cert.pem

      Примечание. Если вы используете IP-адрес вместо имени DNS, вам потребуется указать несколько входов --san. Строка в предыдущем блоке команд, где вы указываете distinguished name (--dn ...), должна быть дополнена еще одной строкой, например следующей:

      --dn "CN=IP address --san @IP_address --san IP_address 
      

      Дополнение --san @IP_address необходимо, так как некоторые клиенты буду проверять наличие в сертификате TLS как записи DNS, так и записи IP-адреса для сервера при проверке его подлинности.

      Опция --flag serverAuth используется для указания того, что сертификат будет использоваться для аутентификации сервера, прежде чем будет установлен зашифрованный туннель. Опция --flag ikeIntermediate используется для поддержки более старых клиентов macOS.

      Теперь мы сгенерировали все файлы TLS/SSL, необходимые StrongSwan, и можем переместить их в каталог /etc/ipsec.d следующим образом:

      • sudo cp -r ~/pki/* /etc/ipsec.d/

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

      Шаг 4 — Настройка StrongSwan

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

      • sudo mv /etc/ipsec.conf{,.original}

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

      • sudo nano /etc/ipsec.conf

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

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

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

      /etc/ipsec.conf

      config setup
          charondebug="ike 1, knl 1, cfg 0"
          uniqueids=no
      

      Затем мы создадим раздел конфигурации для сервера VPN. Также мы укажем StrongSwan создать туннели IKEv2 VPN и автоматически загружать этот раздел конфигурации при запуске. Добавьте в файл следующие строки:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          auto=add
          compress=no
          type=tunnel
          keyexchange=ikev2
          fragmentation=yes
          forceencaps=yes
      

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

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          dpdaction=clear
          dpddelay=300s
          rekey=no
      

      Затем мы настроим параметры IPSec «левой» стороны сервера. Каждый из следующих параметров обеспечивает конфигурацию сервера для приема соединений от клиентов и корректной идентификации себя. Вы добавите каждую из этих настроек в файл /etc/ipsec.conf после того, как вы изучите их и поймете, для чего они используются:

      • left=%any Значение %any гарантирует использование сервером сетевого интерфейса при получении входящих соединений для последующей связи с клиентами. Например, если вы подключаете клиента через частную сеть, сервер будет использовать частный IP-адрес, где он получает трафик для остальной части подключения.
      • leftid=@server_domain_or_IP Эта опция контролирует имя, которое сервер показывает клиентам. При совмещении со следующей опцией leftcert, опция leftid обеспечивает совпадение настроенного имени сервера и различимого имени (DN), содержащегося в публичном сертификате.
      • leftcert=server-cert.pem Эта опция — это путь к публичному сертификату для сервера, который вы настроили на шаге 3. Без него сервер не сможет аутентифицировать себя с клиентами или завершить переговоры по настройке IKEv2.
      • leftsendcert=always Значение always гарантирует, что любой клиент, который подключается к серверу, всегда будет получать копию публичного сертификата сервера в рамках настроек первоначального соединения.
      • leftsubnet=0.0.0.0/0 Последняя опция «слева», которую вы добавите, указывает клиентам на подсети, которые доступны за сервером. В этом случае 0.0.0.0/0 используется для представления всего набора адресов IPv4, что означает, что сервер будет указывать клиентам передавать весь свой трафик через VPN по умолчанию.

      Теперь, когда вы ознакомились с каждой из соответствующих опций «слева», добавьте их в файл следующим образом:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          left=%any
          leftid=@server_domain_or_IP
          leftcert=server-cert.pem
          leftsendcert=always
          leftsubnet=0.0.0.0/0
      

      Примечание. При настройке идентификатора сервера (leftid) символ @ нужно указывать только в случае, если ваш сервер VPN будет идентифицироваться по доменному имени:

      /etc/ipsec.conf

          . . .    leftid=@vpn.example.com
          . . .
      

      Если сервер будет идентифицироваться по IP-адресу, просто укажите IP-адрес:

      /etc/ipsec.conf

          . . .
          leftid=your_server_ip
          . . .
      

      Далее мы можем настроить параметры IPSec клиента «справа». Каждый из следующих параметров указывает серверу, как принимать соединения от клиентов, как клиенты должны аутентифицироваться на сервере, а также сообщает диапазоны частных IP-адресов и серверы которые будут использовать клиенты. Добавьте каждую из этих настроек в файл /etc/ipsec.conf после того, как изучите их и поймете, для чего они используются:

      • right=%any Опция %any для стороны соединения right предписывает серверу принимать входящие соединения от удаленных клиентов.
      • rightid=%any Эта опция гарантирует, что сервер не будет отклонять соединения от клиентов, которые предоставляют идентификатор до создания зашифрованного туннеля.
      • rightauth=eap-mschapv2 Эта опция настраивает метод аутентификации, который будут использовать клиенты для аутентификации на сервере. eap-mschapv2 используется здесь для расширения возможностей совместимости и поддержки таких клиентов, как устройства на базе Windows, macOS и Android.
      • rightsourceip=10.10.10.0/24 Эта опция предписывает серверу назначать частные IP-адреса клиентам из указанного пула IP-адресов 10.10.10.0/24.
      • rightdns=8.8.8.8,8.8.4.4 Эти IP-адреса являются публичными интерпретаторами DNS Google. Вместо них можно использовать другие публичные интерпретаторы, интерпретаторы сервера VPN или любые другие, к которым у клиента есть доступ.
      • rightsendcert=never Эта опция сообщает серверу, что клиентам не нужно отправлять сертификат для аутентификации себя.

      Теперь, когда вы ознакомились с необходимыми опциями «справа», добавьте следующие строки в /etc/ipsec.conf:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          right=%any
          rightid=%any
          rightauth=eap-mschapv2
          rightsourceip=10.10.10.0/24
          rightdns=8.8.8.8,8.8.4.4
          rightsendcert=never
      

      Теперь мы укажем StrongSwan запрашивать у клиента учетные данные пользователя при подключении:

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          eap_identity=%identity
      

      И наконец, добавьте следующие строки для поддержки клиентов на базе Linux, Windows, macOS, iOS и Android. Эти строки определяют различные алгоритмы обмена ключами, хэширования, аутентификации и шифрования (обычно их называют набор шифров), которые StrongSwan разрешит использовать разным клиентам.

      /etc/ipsec.conf

      . . .
      conn ikev2-vpn
          . . .
          ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
          esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
      

      Каждый поддерживаемый набор шифров отделяется от других запятой. Например, chacha20poly1305-sha512-curve25519-prfsha512 — это один набор, а aes256gcm16-sha384-prfsha384-ecp384 — другой. Перечисленные здесь наборы шифров выбраны для обеспечения самых широких возможностей совместимости с клиентами на базе Windows, macOS, iOS, Android и Linux.

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

      /etc/ipsec.conf

      config setup
          charondebug="ike 1, knl 1, cfg 0"
          uniqueids=no
      
      conn ikev2-vpn
          auto=add
          compress=no
          type=tunnel
          keyexchange=ikev2
          fragmentation=yes
          forceencaps=yes
          dpdaction=clear
          dpddelay=300s
          rekey=no
          left=%any
          leftid=@server_domain_or_IP
          leftcert=server-cert.pem
          leftsendcert=always
          leftsubnet=0.0.0.0/0
          right=%any
          rightid=%any
          rightauth=eap-mschapv2
          rightsourceip=10.10.10.0/24
          rightdns=8.8.8.8,8.8.4.4
          rightsendcert=never
          eap_identity=%identity
          ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
          esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
      

      Сохраните и закройте файл после того, как проверите, что все строки добавлены корректно. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

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

      Шаг 5 — Настройка аутентификации VPN

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

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

      Откроем для редактирования файл secrets

      • sudo nano /etc/ipsec.secrets

      Вначале мы укажем StrongSwan, где можно найти закрытый ключ:

      /etc/ipsec.secrets

      : RSA "server-key.pem"
      

      Затем мы зададим учетные данные пользователя. Вы можете создать любую комбинацию имени пользователя и пароля:

      /etc/ipsec.secrets

      your_username : EAP "your_password"
      

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

      • sudo systemctl restart strongswan-starter

      Мы полностью настроили параметры сервера и учетные данные пользователя на сервере VPN и теперь можем перейти к самой важной части: настройке брандмауэра.

      Шаг 6 — Настройка брандмауэра и переадресации IP ядра

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

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

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

      Теперь добавьте правило, которое будет разрешать трафик UDP на стандартных портах IPSec 500 и 4500:

      • sudo ufw allow 500,4500/udp

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

      Ваш публичный интерфейс должен содержать слово «dev». Например, в этом результате показан интерфейс с именем eth0, который выделен ниже:

      Output

      default via your_server_ip dev eth0 proto static

      Определив интерфейс публичной сети, откройте файл /etc/ufw/before.rules в своем текстовом редакторе: Правила из этого файла добавляются в брандмауэр перед остальными правилами ввода и вывода. Они используются для настройки перевода сетевых адресов (NAT), чтобы сервер мог корректно настраивать соединения между клиентами и сетью Интернет.

      • sudo nano /etc/ufw/before.rules

      Добавьте в верхнюю часть файла (перед строкой *filter) следующий блок конфигурации: Измените каждый экземпляр eth0 в конфигурации выше для соответствия имени интерфейса, которое вы определили с помощью ip route. Строки *nat создают правила, благодаря которым брандмауэр может обеспечивать маршрутизацию и управление трафиком между клиентами VPN и интернетом. Строка *mangle позволяет настроить максимальный размер сегмента пакета, чтобы предотвратить возможные проблемы с некоторыми клиентами VPN:

      /etc/ufw/before.rules

      *nat
      -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
      -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
      COMMIT
      
      *mangle
      -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
      COMMIT
      
      *filter
      :ufw-before-input - [0:0]
      :ufw-before-output - [0:0]
      :ufw-before-forward - [0:0]
      :ufw-not-local - [0:0]
      . . .
      

      После строки *filter и строк определения цепочки нужно добавить еще один блок конфигурации:

      /etc/ufw/before.rules

      . . .
      *filter
      :ufw-before-input - [0:0]
      :ufw-before-output - [0:0]
      :ufw-before-forward - [0:0]
      :ufw-not-local - [0:0]
      
      -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
      -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
      

      Эти строки указывают брандмауэру перенаправлять трафик ESP (защищенная инкапсуляция полезной нагрузки), чтобы дать клиентам VPN возможность подключения. ESP обеспечивает дополнительную защиту пакетов VPN, когда они проходят через ненадежные сети.

      Сохраните и закройте файл после того, как проверите, что все строки добавлены корректно. Если вы используете nano, нажмите CTRL+X, Y, затем ENTER.

      Прежде чем перезапустить брандмауэр, нам нужно изменить некоторые параметры ядра сети, чтобы разрешить маршрутизацию с одного интерфейса на другой. Файл, который контролирует эти настройки, называется /etc/ufw/sysctl.conf. Нам потребуется настроить в файле несколько вещей.

      Для начала необходимо активировать перенаправление пакетов IPv4, чтобы трафик мог перемещаться между VPN и публичными сетями на сервере. Далее мы отключим обнаружение путей MTU, чтобы предотвратить проблемы с фрагментацией пакетов. И наконец, мы запретим перенаправление ICMP и отправку перенаправлений ICMP, чтобы предотвратить атаки через посредников.

      Откройте файл конфигурации параметров ядра UFW, используя nano или предпочитаемый текстовый редактор:

      • sudo nano /etc/ufw/sysctl.conf

      Теперь добавьте следующую настройку net/ipv4/ip_forward=1 в конце файла, чтобы активировать перенаправление пакетов между интерфейсами:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/ip_forward=1
      

      Следующий блок, отправляющий и принимающий ICMP , перенаправляет пакеты путем добавления следующих строк в конец файла:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/conf/all/accept_redirects=0
      net/ipv4/conf/all/send_redirects=0
      

      И наконец, отключите обнаружение путей MTU, добавив следующую строку в конец файла:

      /etc/ufw/sysctl.conf

      . . .
      net/ipv4/ip_no_pmtu_disc=1
      

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

      • sudo ufw disable
      • sudo ufw enable

      Вам будет предложено подтвердить процесс. Введите Y, чтобы активировать UFW с новыми настройками.

      Шаг 7 — Тестирование подключения VPN на Windows, macOS, Ubuntu, iOS и Android

      Мы завершили подготовку, и пришло время для тестирования. Вначале нужно скопировать созданный вами сертификат CA и установить его на клиентские устройства, которые будут подключаться к VPN. Для этого удобнее всего выполнить вход на ваш сервер и вывести содержимое файла сертификата:

      • cat /etc/ipsec.d/cacerts/ca-cert.pem

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

      Output

      -----BEGIN CERTIFICATE----- MIIFNDCCAxygAwIBAgIIHCsidG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UE . . . H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA== -----END CERTIFICATE-----

      Скопируйте эти данные на свой компьютер, включая строки -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----, и сохраните их в файл с понятным именем, например, ca-cert.pem. Созданный файл должен иметь расширение .pem.

      Также вы можете использовать SFTP, чтобы перенести файл на свой компьютер.

      Когда файл ca-cert.pem будет загружен на ваш компьютер, вы можете настроить подключение к VPN.

      Подключение из Windows

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

      Примечание. Эти инструкции протестированы на установках Windows 10, использующих версии 1903 и 1909.

      Настройка Windows с помощью графических инструментов

      Вначале импортировать сертификат root, выполнив следующие шаги:

      1. Нажмите WINDOWS+R, чтобы открыть диалоговое окно Выполнить и введите mmc.exe, чтобы открыть консоль управления Windows.
      2. Из меню Файл перейдите в раздел Добавить или удалить оснастку, выберите Сертификаты из списка доступных оснасток и нажмите Добавить.
      3. Чтобы разрешить VPN работать для любых пользователей, выберите Учетная запись компьютера и нажмите Далее.
      4. Поскольку мы выполняем настройку на локальном компьютере, выберите пункт Локальный компьютер и нажмите Готово.
      5. Под узлом Корень консоли откройте запись Сертификаты (локальный компьютер), раскройте Доверенные корневые центры сертификации и выберите запись Сертификаты: Просмотр сертификатов

      6. В меню Действие выберите пункт Все задачи и нажмите Импорт, чтобы открыть мастер импорта сертификатов. Нажмите Далее, чтобы пролистать вводное окно.

      7. На экране Импортируемый файл нажмите кнопку Обзор, убедитесь, что вы изменили тип файла с “X.509 Certificate (.cer;.crt)” на “All Files (.) и выберите сохраненный ранее файл ca-cert.pem. Затем нажмите Далее.

      8. Убедитесь, что Хранилище сертификатов имеет значение Доверенные корневые центры сертификации и нажмите Далее.

      9. Нажмите Готово, чтобы импортировать сертификат.

      Затем выполните следующие шаги по настройке VPN:

      1. Откройте Панель управления и перейдите в Центр управления сетями и общим доступом.
      2. Нажмите Создание и настройка нового подключения или сети и выберите пункт Подключение к рабочем месту.
      3. Выберите пункт Использовать мое подключение к Интернету (VPN).
      4. Введите данные сервера VPN. Введите доменное имя сервера или IP-адрес в поле Адрес в Интернете, затем введите в поле Имя пункта назначения описание своего соединения VPN. Затем нажмите Готово.

      Настройка Windows с помощью PowerShell

      Для импорта корневого сертификата СА с помощью PowerShell сначала откройте командную строку PowerShell с правами администратора. Для этого нажмите правой кнопкой мыши значок Пуск и выберите Windows PowerShell (Admin). Также вы можете открыть командную строку как администратор и ввести powershell.

      Затем мы импортируем сертификат, используя командлет PowerShell Import-Certificate. В следующей команде первый аргумент -CertStoreLocation гарантирует, что сертификат импортируется в хранилище доверенных корневых центров сертификации компьютера, чтобы все программы и пользователи могли проверить сертификат сервера VPN. Аргумент -FilePath должен указать расположение, куда вы скопировали сертификат. В следующем примере путь — это C:UserssammyDocumentsca-cert.pem. Убедитесь, что вы отредактировали команду в соответствии с используемым расположением.

      • Import-Certificate `
      • -CertStoreLocation cert:LocalMachineRoot `
      • -FilePath C:userssammyDocumentsca-cert.pem

      Команда выведет примерно следующее:

      Output

      PSParentPath: Microsoft.PowerShell.SecurityCertificate::LocalMachineRoot Thumbprint Subject ---------- ------- DB00813B4087E9367861E8463A60CEA0ADC5F002 CN=VPN root CA

      Теперь для настройки VPN с помощью PowerShell запустите следующую команду. Подставьте имя DNS или IP-адрес вашего сервера в строку -ServerAddress. Различные флаги обеспечат корректную настройку Windows с необходимыми параметрами безопасности, которые соответствуют опциям, заданным в /etc/ipsec.conf.

      • Add-VpnConnection -Name "VPN Connection" `
      • -ServerAddress "server_domain_or_IP" `
      • -TunnelType "IKEv2" `
      • -AuthenticationMethod "EAP" `
      • -EncryptionLevel "Maximum" `
      • -RememberCredential `

      Если команда выполнена успешно, вы не увидите никакого вывода. Чтобы убедиться, что VPN настроен корректно, используйте командлет Get-VPNConnection:

      • Get-VpnConnection -Name "VPN Connection"

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

      Output

      Name : VPN Connection ServerAddress : your_server_ip AllUserConnection : False Guid : {B055A1AB-175C-4028-B4A8-D34309A2B20E} TunnelType : Ikev2 AuthenticationMethod : {Eap} EncryptionLevel : Maximum L2tpIPsecAuth : UseWinlogonCredential : False EapConfigXmlStream : #document ConnectionStatus : Disconnected RememberCredential : True SplitTunneling : False DnsSuffix : IdleDisconnectSeconds : 0

      По умолчанию Windows выбирает более старые и медленные алгоритмы. Запустите командлет Set-VpnConnectionIPsecConfiguration для обновления параметров шифрования, которые будет использовать Windows для обмена ключами IKEv2, а также чтобы провести шифрование пакетов:

      • Set-VpnConnectionIPsecConfiguration -Name "VPN Connection" `
      • -AuthenticationTransformConstants GCMAES256 `
      • -CipherTransformConstants GCMAES256 `
      • -DHGroup ECP384 `
      • -IntegrityCheckMethod SHA384 `
      • -PfsGroup ECP384 `
      • -EncryptionMethod GCMAES256

      Примечание. Если вы хотите удалить соединение VPN и перенастроить его с другими опциями, вы можете запустить командлет Remove-VpnConnection.

      • Remove-VpnConnection -Name "VPN Connection" -Force

      С помощью флага -Force можно пропустить предложение подтвердить удаление. Вы должны быть отключены от VPN, если хотите удалить его с помощью данной команды.

      Подключение к VPN

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

      Подключение из macOS

      Выполните следующие шаги по импорту сертификата:

      1. Дважды щелкните файл сертификата. Откроется экран «Keychain Access» с диалоговым окном, где будет указано: «Keychain Access is trying to modify the system keychain. Enter your password to allow this».
      2. Введите свой пароль и нажмите Modify Keychain
      3. Дважды щелкните импортированный сертификат VPN. После этого откроется небольшое окно свойств, где вы сможете указать уровни доверия. Укажите для параметра IP Security (IPSec) значение Always Trust (всегда доверять), после чего вам нужно будет снова ввести пароль. Настройка будет сохранена автоматически после ввода пароля.

      После импорта и подтверждения надежности сертификата настройте подключение к VPN, выполнив следующие шаги:

      1. Откройте раздел System Preferences (настройки системы) и выберите пункт Network (сеть).
      2. Нажмите небольшую кнопку «плюс» в нижнем левом углу списка сетей.
      3. В открывшемся всплывающем окне установите для параметра Interface (интерфейс) значение VPN, установите для параметра VPN Type (тип VPN) значение IKEv2 и присвойте имя соединению.
      4. В поле Server (сервер) и Remote ID (удаленный идентификатор) введите доменное имя или IP-адрес сервера. Оставьте поле Local ID (локальный идентификатор) пустым.
      5. Нажмите Authentication Settings (настройки аутентификации), выберите пункт Username (имя пользователя) и введите имя пользователя и пароль, которые вы настроили для своего пользователя VPN. Затем нажмите OK.

      Наконец, нажмите кнопку Connect (подключение) для подключения к VPN. Теперь вы должны быть подключены к VPN.

      Подключение из Ubuntu

      Чтобы подключиться с компьютера под управлением Ubuntu, вы должны настроить и управлять StrongSwan как службой или использовать разовую команду при каждой попытке подключения. Далее приводятся инструкции для обоих случаев.

      Управление StrongSwan как службой

      Чтобы управлять StrongSwan как службой, вам нужно выполнить следующие шаги по настройке.

      Сначала обновите свой локальный кэш пакетов с помощью apt

      Затем установите StrongSwan и необходимые плагины для аутентификации:

      • sudo apt install strongswan libcharon-extra-plugins

      Теперь вам потребуется копия сертификата СА в каталоге /etc/ipsec.d/cacerts, чтобы ваш клиент мог проверить подлинность сервера. Запустите следующую команду, чтобы скопировать файл ca-cert.pem в каталог:

      • sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

      Чтобы убедиться, что VPN работает только по запросу, используйте systemctl для автоматического отключения StrongSwan:

      • sudo systemctl disable --now strongswan-starter

      Затем настройте имя пользователя и пароль, которые вы будете использовать для аутентификации на сервере VPN. Отредактируйте /etc/ipsec.secrets с помощью nano или любого предпочитаемого редактора:

      • sudo nano /etc/ipsec.conf

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

      /etc/ipsec.conf

      your_username : EAP "your_password"
      

      А теперь отредактируйте файл /etc/ipsec.conf для настройки вашего клиента в соответствии с конфигурацией сервера:

      /etc/ipsec.conf

      config setup
      
      conn ikev2-rw
          right=server_domain_or_IP
          # This should match the `leftid` value on your server's configuration
          rightid=server_domain_or_IP
          rightsubnet=0.0.0.0/0
          rightauth=pubkey
          leftsourceip=%config
          leftid=username
          leftauth=eap-mschapv2
          eap_identity=%identity
          auto=start
      

      Чтобы подключиться к VPN, введите:

      • sudo systemctl start strongswan-starter

      Чтобы снова отключиться, введите:

      • sudo systemctl stop strongswan-starter

      Использование клиента charon-cmd для разовых подключений

      Чтобы управлять StrongSwan как службой, вам нужно выполнить следующие шаги по настройке.

      Сначала обновите свой локальный кэш пакетов с помощью apt

      Затем установите StrongSwan и необходимые плагины для аутентификации:

      • sudo apt install strongswan libcharon-extra-plugins

      Теперь вам потребуется копия сертификата СА в каталоге /etc/ipsec.d/cacerts, чтобы ваш клиент мог проверить подлинность сервера. Запустите следующую команду, чтобы скопировать файл ca-cert.pem в каталог:

      • sudo cp /tmp/ca-cert.pem /etc/ipsec.d/cacerts

      На этом этапе вы можете подключиться к серверу VPN с помощью charon-cmd, используя сертификат СА сервера, IP-адрес сервера VPN и настроенное имя пользователя.

      Запустите следующую команду для подключения к VPN в любое время:

      • sudo charon-cmd --cert ca-cert.pem --host vpn_domain_or_IP --identity your_username

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

      Подключение из iOS

      Чтобы настроить соединение VPN на устройстве iOS, выполните следующие действия:

      1. Отправьте себе электронное письмо с прикрепленным корневым сертификатом.
      2. Откройте электронное письмо на устройстве iOS, нажмите на вложенный файл сертификата, затем нажмите Установить и введите код доступа. После установки нажмите Готово.
      3. Откройте Настройки, Общие, VPN и нажмите Добавить конфигурацию VPN. После этого откроется экран конфигурации подключения VPN.
      4. Нажмите Тип и выберите IKEv2.
      5. В поле Описание введите короткое имя подключения VPN. Вы можете выбрать все, что угодно.
      6. В поле Server (сервер) и Remote ID (удаленный идентификатор) введите доменное имя или IP-адрес сервера. Поле Local ID (локальный идентификатор) нельзя оставлять пустым.
      7. Введите имя пользователя и пароль в разделе Аутентификация, а затем нажмите Готово.
      8. Выберите соединение VPN, которое вы только что создали, нажмите переключатель вверху страницы, и подключение будет установлено.

      Подключение из Android

      Выполните следующие шаги по импорту сертификата:

      1. Отправьте себе электронное письмо с прикрепленным сертификатом CA. Сохраните сертификат CA в папку «Загрузки».
      2. Загрузите клиент StrongSwan VPN из магазина Play Store.
      3. Откройте приложение. Нажмите значок «подробнее» () в правом верхнем углу и выберите Сертификаты СА.
      4. Снова нажмите значок «подробнее» в правом верхнем углу. Выберите пункт Импорт сертификата.
      5. Найдите файл сертификата CA в папке «Загрузки» и выберите его для импорта в приложение.

      Теперь сертификат импортирован в приложение StrongSwan, и вы можете настроить соединение VPN следующим образом:

      1. В приложении нажмите ADD VPN PROFILE (добавить профиль VPN) сверху.
      2. Введите в поле Server (сервер) доменное имя или публичный IP-адрес вашего сервера VPN.
      3. Обязательно выберите тип VPN: IKEv2 EAP (Username/Password).
      4. Введите поля Username (имя пользователя) и Password (пароль) учетные данные, определенные на сервере.
      5. Уберите флажок Select automatically (выбирать автоматически) в разделе CA certificate (сертификат CA) и нажмите Select CA certificate (выбрать сертификат CA).
      6. Откройте вкладку IMPORTED (импортированные) вверху экрана и выберите импортированный CA (он будет иметь имя «VPN root CA», если вы до этого не изменяли значение «DN»).
      7. Если хотите, можете ввести в поле Profile name (optional) (имя профиля, необязательно) более понятное имя.

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

      Диагностика и устранение неисправностей подключения

      Если вы не сможете импортировать сертификат, убедитесь, что файл имеет расширение .pem, а не .pem.txt.

      Если вы не можете подключиться к VPN, проверьте используемые имя сервера и IP-адрес. Доменное имя или IP-адрес сервера должны соответствовать настроенным как общее имя (CN) при создании сертификата. Если они не совпадают, соединение VPN не будет работать. Например, если вы настроили сертификат с CN vpn.example.com, вы должны использовать vpn.example.com при вводе данных сервера VPN. Еще раз проверьте команду, которую вы использовали для генерирования сертификата и значения, которые использовали при создании соединения VPN.

      Наконец, проверьте конфигурацию VPN и убедитесь, что значение leftid настроено с символом @, если вы используете доменное имя:

      /etc/ipsec.conf

          leftid=@vpn.example.com
      

      Если вы используете IP-адрес, убедитесь, что символ @ опущен. Также убедитесь, что при генерировании файла server-cert.pem вы включили флаги --san @IP_address и --san IP_address.

      Заключение

      В этом обучающем модуле вы создали сервер VPN, использующий протокол IKEv2. Вы узнали о директивах, которые контролируют левую и правую стороны подключения как на сервере, так и на клиентах. Также вы настроили клиент Windows, macOS, iOS, Android или Linux для подключения к VPN.

      Чтобы добавить или удалить пользователей, снова перейдите на Шаг 5. Каждая строка в /etc/ipsec.secrets предназначена для одного пользователя, поэтому добавление или удаление пользователей или изменение паролей требует редактирования файла.

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



      Source link