One place for hosting & domains

      настройка

      Настройка сервера 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

      Настройка удаленного рабочего стола с помощью X2Go в Ubuntu 20.04


      Автор выбрал Software in the Public Interest (SPI) для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Обычно серверы на базе Linux не имеют предустановленного графического пользовательского интерфейса. Если вы хотите запустить приложение с графическим интерфейсом на вашем экземпляре, стандартным решением может быть использование системы Virtual Network Computing (VNC). К сожалению, решения VNC могут быть низкопроизводительными и небезопасными. Многие из них также требуют дополнительной ручной настройки. В отличие от них X2Go предлагает функционирующий «облачный рабочий стол» со всеми преимуществами вычислительной системы с быстрой сетью, которая всегда онлайн, доступна удаленно и легко масштабируется. Также X2Go характеризуется большим быстродействием и надежностью по сравнению с многими решениями VNC.

      В этом обучающем руководстве мы будем использовать X2Go для создания среды рабочего стола XFCE в Ubuntu 20.04 с удаленным доступом. Этот облачный рабочий стол будет включать те же утилиты, которые вы бы получили при установке Ubuntu 20.04 и среды XFCE на ваш ПК (почти такие же, как при настройке Xubuntu).

      Процесс настройки, описанный в данном руководстве, будет полезен, если:

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

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

      Перед началом работы вам потребуется следующее:

      • Экземпляр Ubuntu 20.04 x64 с минимум 2 ГБ оперативной памяти. 2 ГБ — это минимум, оптимальным же является объем памяти 4 ГБ или больше, особенно если вы планируете работать с приложениями, которые используют много памяти. По желанию вы можете использовать дроплет DigitalOcean.

      • Пользователь с привилегиями sudo и ключ SSH. Воспользуйтесь этим руководством, чтобы начать работу: Начальная настройка сервера с помощью Ubuntu 20.04. Убедитесь, что вы выполнили шаг 4 и настроили брандмауэр для ограничения всех подключений, за исключением OpenSSH.

      Шаг 1 — Установка среды рабочего стола на сервер

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

      Сначала обновите информацию диспетчера пакетов о самой последней доступной версии ПО:

      В этом обучающем руководстве мы устанавливаем XFCE в качестве среды рабочего стола. XFCE не использует графические эффекты, такие как наложение изображения, что делает его совместимым с X2Go и оптимизирует обновления экрана. Для справки, такие среды рабочего стола, как LXDE и MATE (с отключенной функцией наложения изображений) также работаю хорошо, но для их установки вам придется заменить команду из данного руководства. Например, вместо sudo apt-get install xubuntu-desktop вам нужно ввести sudo apt-get install lubuntu-desktop для установки LXDE.

      При установке XFCE можно выбрать два варианта: минимальный пакет Minimal Desktop Environment или полный пакет Full Desktop Environment. Выбор зависит от ваших потребностей, о чем мы поговорим далее. Выберите один вариант из двух.

      Полный пакет Full Desktop Environment

      Рекомендуется для большинства случаев использования. Если вы не хотите подбирать вручную каждый необходимый вам компонент и предпочитаете получить набор пакетов по умолчанию, например текстовый процессор, веб-браузер, почтовый клиент и другие предустановленные программы, выбирайте xubuntu-desktop.

      Установка и настройка полного пакета Full Desktop Environment. Этот пакет подобен тому, что вы бы получили при установке Xubuntu с загрузочного диска или карты памяти USB на ваш локальный ПК.

      • sudo apt-get install xubuntu-desktop

      При выборе диспетчера отображения выбирайте lightdm.

      Выбор lightdm в качестве диспетчера отображения

      Минимальный пакет Minimal Desktop Environment

      Если вы хотите установить небольшой базовый набор пакетов, а затем добавлять остальные необходимые программы вручную, выбирайте метапакет xubuntu-core.

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

      Установите xfce4 и все дополнительные зависимости, необходимые для его поддержки:

      • sudo apt-get install xubuntu-core

      Вы установили графическую среду. Теперь вы можете определить способ удаленного просмотра.

      Шаг 2 — Установка X2Go на сервер

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

      В предыдущих версиях Ubuntu (до 18.04) x2goserver не был включен в репозитории по умолчанию, поэтому вы были вынуждены выполнять дополнительные действия для установки пакета программного пакета. Мы оставим здесь ссылку на случай, если пакеты уберут из будущих версий Ubuntu. К счастью, Ubuntu 20.04, кодовое название Focal Fossa, имеет необходимый пакет в репозиториях по умолчанию, поэтому установка пройдет быстрее.

      Для установки X2Go на ваш сервер введите следующую команду:

      • sudo apt-get install x2goserver x2goserver-xsession

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

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

      Вы настроили ваш сервер. Введите exit или закройте окно терминала. Остальные шаги будут сосредоточены на настройке клиента на вашем локальном компьютере.

      Шаг 3 — Установка локального клиента X2Go

      X2Go готов к использованию без предварительной подготовки. Если вы используете Windows или Mac OS X на вашем локальном компьютере, вы можете загрузить программное обеспечение для клиента X2Go здесь. Если вы используете Debian или Ubuntu, вы можете установить клиент X2Go с помощью следующей команды на локальном компьютере:

      • sudo apt-get install x2goclient

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

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

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

      Шаг 4 — Подключение к удаленному рабочему столу

      При первом открытии клиента X2Go должно появиться окно. Если не появится, нажмите вкладку Session в меню вверху слева и выберите New session … (Новый сеанс).

      Скриншот клиента X2Go — Создание нового сеанса

      В поле Session name (Имя сеанса) введите что-то, что поможет отличать серверы друг от друга. Использование имени сеанса особенно важно, если вы планируете подключить несколько компьютеров.

      Введите IP-адрес вашего сервера или полное доменное имя (FQDN) в поле Host в разделе Server.

      Введите имя пользователя, которое использовалось для подключения SSH в поле Login.

      Так как на шаге 2 вы установили XFCE, выберите XFCE в качестве типа сеанса Session type.

      Так как вы подключились к серверу с помощью ключей SSH, то в заключение нажмите значок папки рядом с Use RSA/DSA key for ssh connection и выберите ваш закрытый ключ. Если вы решили не использовать защитные ключи SSH, оставьте это поле пустым. Клиент X2Go будет запрашивать пароль при каждом входе.

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

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

      Главное окно X2Go — Список сеансов

      Если вы работаете на OS X на вашем локальном компьютере, OS X может предложить установить XQuartz для запуска X11. В этом случае следуйте инструкциям по установке.

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

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

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

      CTRL+ALT+F включает и выключает полноэкранный режим. Работа в полноэкранном режиме может быть похожа на работу на локальном рабочем столе. При полноэкранном режиме сочетание клавиш будут захвачены удаленным устройством, а не локальным компьютером.

      CTRL+ALT+M уменьшает удаленный просмотр, даже если вы находитесь в полноэкранном режиме.

      CTRL+ALT+T закрывает сеанса, но графический интерфейс остается запущенным на сервере. Это быстрый способ отключения без выхода из системы или закрытия приложений на сервере. То же самое произойдет, если вы нажмете кнопку закрытия окна.

      Есть два способа, как завершить удаленный сеанс и закрыть все графические программы, запущенные в нем. Вы можете удаленно выйти из меню запуска XFCE или же нажать на кнопку, отмеченную кружком и небольшой чертой (как значок «включено/спящий режим») в нижнем правом углу основной части экрана X2Go.

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

      Главное окно X2Go — Кнопка завершения сеанса

      Теперь вы успешно получили доступ к удаленному рабочему столу и настроили его.

      Заключение

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

      Если вы хотите узнать больше, посетите сайт с официальной документацией X2Go.



      Source link

      Настройка Django с Postgres, Nginx и Gunicorn в Ubuntu 20.04


      Введение

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

      В этом руководстве мы покажем, как установить и настроить некоторые компоненты Ubuntu 20.04 для поддержки и обслуживания приложений Django. Вначале мы создадим базу данных PostgreSQL вместо того, чтобы использовать базу данных по умолчанию SQLite. Мы настроим сервер приложений Gunicorn для взаимодействия с нашими приложениями. Затем мы настроим Nginx для работы в качестве обратного прокси-сервера Gunicorn, что даст нам доступ к функциям безопасности и повышения производительности для обслуживания наших приложений.

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

      Для прохождения этого обучающего модуля вам потребуется новый экземпляр сервера Ubuntu 20.04 с базовым брандмауэром и пользователем с привилегиями sudo и без привилегий root. Чтобы узнать, как выполнить данные настройки, воспользуйтесь нашим руководством по начальной настройке сервера.

      Мы будем устанавливать Django в виртуальной среде. Установка Django в отдельную среду проекта позволит отдельно обрабатывать проекты и их требования.

      Когда база данных будет работать, мы выполним установку и настройку сервера приложений Gunicorn. Он послужит интерфейсом нашего приложения и будет обеспечивать преобразование запросов клиентов по протоколу HTTP в вызовы Python, которые наше приложение сможет обрабатывать. Затем мы настроим Nginx в качестве обратного прокси-сервера для Gunicorn, чтобы воспользоваться высокоэффективными механизмами обработки соединений и удобными функциями безопасности.

      Давайте приступим.

      Установка пакетов из хранилищ Ubuntu

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

      Нам нужно обновить локальный индекс пакетов apt, а затем загрузить и установить пакеты. Конкретный состав устанавливаемых пакетов зависит от того, какая версия Python будет использоваться в вашем проекте.

      Если вы используете Django с Python 3, введите следующее:

      • sudo apt update
      • sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

      Версия Django 1.11 — это последняя версия Django с поддержкой Python 2. Если вы создаете новый проект, мы настоятельно рекомендуем использовать Python 3. Если же вам необходимо использовать Python 2, введите:

      • sudo apt update
      • sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl

      Таким образом вы установите pip, файлы разработки Python для последующего построения сервера Gunicorn, СУБД Postgres и необходимые для взаимодействия с ней библиотеки, а также веб-сервер Nginx.

      Создание базы данных и пользователя PostgreSQL

      Вначале мы создадим базу данных и пользователя базы данных для нашего приложения Django.

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

      Во время установки Postgres был создан пользователь операционной системы с именем postgres, соответствующий пользователю postgres базы данных PostgreSQL с правами администратора. Этот пользователь нам потребуется для выполнения административных задач. Мы можем использовать sudo и передать это имя пользователя с опцией -u.

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

      Вы увидите диалог PostgreSQL, где можно будет задать наши требования.

      Вначале создайте базу данных для своего проекта:

      • CREATE DATABASE myproject;

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

      Затем создайте пользователя базы данных для нашего проекта. Обязательно выберите безопасный пароль:

      • CREATE USER myprojectuser WITH PASSWORD 'password';

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

      Мы зададим кодировку по умолчанию UTF-8, чего и ожидает Django. Также мы зададим схему изоляции транзакций по умолчанию «read committed», которая будет блокировать чтение со стороны неподтвержденных транзакций. В заключение мы зададим часовой пояс. По умолчанию наши проекты Django настроены на использование стандарта времени UTC. Все эти рекомендации взяты непосредственно из проекта Django:

      • ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
      • ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
      • ALTER ROLE myprojectuser SET timezone TO 'UTC';

      Теперь мы предоставим созданному пользователю доступ для администрирования новой базы данных:

      • GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

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

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

      Создание виртуальной среды Python для вашего проекта

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

      Для этого нам потребуется доступ к команде virtualenv. Для установки мы можем использовать pip.

      Если вы используете Python 3, обновите pip и установите пакет с помощью следующей команды:

      • sudo -H pip3 install --upgrade pip
      • sudo -H pip3 install virtualenv

      Если вы используете Python 2, обновите pip и установите пакет с помощью следующей команды:

      • sudo -H pip install --upgrade pip
      • sudo -H pip install virtualenv

      После установки virtualenv мы можем начать формирование нашего проекта. Создайте каталог для файлов нашего проекта и перейдите в этот каталог:

      • mkdir ~/myprojectdir
      • cd ~/myprojectdir

      Создайте в каталоге проекта виртуальную среду Python с помощью следующей команды:

      Эта команда создаст каталог myprojectenv в каталоге myprojectdir. В этот каталог будут установлены локальная версия Python и локальная версия pip. Мы можем использовать эту команду для установки и настройки изолированной среды Python для нашего проекта.

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

      • source myprojectenv/bin/activate

      Командная строка изменится, показывая, что теперь вы работаете в виртуальной среде Python. Она будет выглядеть примерно следующим образом: (myprojectenv)user@host:~/myprojectdir$.

      После запуска виртуальной среды установите Django, Gunicorn и адаптер PostgreSQL psycopg2 с помощью локального экземпляра pip:

      Примечание. Если виртуальная среда активирована (когда перед командной строкой стоит (myprojectenv)), необходимо использовать pip вместо pip3, даже если вы используете Python 3. Копия инструмента в виртуальной среде всегда имеет имя pip вне зависимости от версии Python.

      • pip install django gunicorn psycopg2-binary

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

      Создание и настройка нового проекта Django

      Установив компоненты Python, мы можем создать реальные файлы проекта Django.

      Создание проекта Django

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

      • django-admin.py startproject myproject ~/myprojectdir

      Сейчас каталог вашего проекта (в нашем случае ~/myprojectdir) должен содержать следующее:

      • ~/myprojectdir/manage.py: скрипт управления проектом Django.
      • ~/myprojectdir/myproject/: пакет проекта Django. В нем должны содержаться файлы __init__.py, settings.py, urls.py, asgi.py и wsgi.py.
      • ~/myprojectdir/myprojectenv/: каталог виртуальной среды, который мы создали до этого.

      Изменение настроек проекта

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

      • nano ~/myprojectdir/myproject/settings.py

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

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

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

      ~/myprojectdir/myproject/settings.py

      . . .
      # The simplest case: just add the domain name(s) and IP addresses of your Django server
      # ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
      # To respond to 'example.com' and any subdomains, start the domain with a dot
      # ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
      ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']
      

      Затем найдите раздел, который будет настраивать доступ к базе данных. Он будет начинаться с DATABASES. Конфигурация в файле предназначена для базы данных SQLite. Мы уже создали базу данных PostgreSQL для нашего проекта, и поэтому нужно изменить настройки.

      Измените настройки, указав параметры базы данных PostgreSQL. Мы даем указания Django использовать адаптер psycopg2, который мы установили с помощью pip. Нам нужно указать имя базы данных, имя пользователя базы данных, пароль пользователя базы данных, и указать, что база данных расположена на локальном компьютере. Вы можете оставить для параметра PORT пустую строку:

      ~/myprojectdir/myproject/settings.py

      . . .
      
      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.postgresql_psycopg2',
              'NAME': 'myproject',
              'USER': 'myprojectuser',
              'PASSWORD': 'password',
              'HOST': 'localhost',
              'PORT': '',
          }
      }
      
      . . .
      

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

      ~/myprojectdir/myproject/settings.py

      . . .
      
      STATIC_URL = '/static/'
      STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
      

      Сохраните файл и закройте его после завершения.

      Завершение начальной настройки проекта

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

      • ~/myprojectdir/manage.py makemigrations
      • ~/myprojectdir/manage.py migrate

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

      • ~/myprojectdir/manage.py createsuperuser

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

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

      • ~/myprojectdir/manage.py collectstatic

      Данную операцию нужно будет подтвердить. Статичные файлы будут помещены в каталог static в каталоге вашего проекта.

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

      Создайте исключение для порта 8000 с помощью следующей команды:

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

      • ~/myprojectdir/manage.py runserver 0.0.0.0:8000

      Откройте в вашем браузере доменное имя или IP-адрес вашего сервера с суффиксом :8000:

      http://server_domain_or_IP:8000
      

      Вы должны получить страницу индекса Django по умолчанию:

      Страница индекса Django

      Если вы добавите /admin в конце URL в адресной строке, вам будет предложено ввести имя пользователя и пароль администратора, созданные с помощью команды createsuperuser:

      Окно входа в качестве администратора Django

      После аутентификации вы получите доступ к интерфейсу администрирования Django по умолчанию:

      Интерфейс администрирования Django

      Завершив тестирование, нажмите CTRL-C в окне терминала, чтобы завершить работу сервера разработки.

      Тестирование способности Gunicorn обслуживать проект

      Перед выходом из виртуальной среды нужно протестировать способность Gunicorn обслуживать приложение. Для этого нам нужно войти в каталог нашего проекта и использовать gunicorn для загрузки модуля WSGI проекта:

      • cd ~/myprojectdir
      • gunicorn --bind 0.0.0.0:8000 myproject.wsgi

      Gunicorn будет запущен на том же интерфейсе, на котором работал сервер разработки Django. Теперь вы можете вернуться и снова протестировать приложение.

      Примечание. В интерфейсе администратора не применяются стили, поскольку Gunicorn не умеет находить необходимый для этого статичный контент CSS.

      Мы передали модуль в Gunicorn, указав относительный путь к файлу Django wsgi.py, который представляет собой точку входа в наше приложение. Для этого мы использовали синтаксис модуля Python. В этом файле определена функция application, которая используется для взаимодействия с приложением. Дополнительную информацию о спецификации WSGI можно найти здесь.

      После завершения тестирования нажмите CTRL-C в окне терминала, чтобы остановить работу Gunicorn.

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

      Индикатор виртуальной среды будет убран из командной строки.

      Создание файлов сокета и служебных файлов systemd для Gunicorn

      Мы убедились, что Gunicorn может взаимодействовать с нашим приложением Django, но теперь нам нужно реализовать более надежный способ запуска и остановки сервера приложений. Для этого мы создадим служебные файлы и файлы сокета systemd.

      Сокет Gunicorn создается при загрузке и прослушивает подключения. При подключении systemd автоматически запускает процесс Gunicorn для обработки подключения.

      Создайте и откройте файл сокета systemd для Gunicorn с привилегиями sudo:

      • sudo nano /etc/systemd/system/gunicorn.socket

      В этом файле мы создадим раздел [Unit] для описания сокета, раздел [Socket] для определения расположения сокета и раздел [Install], чтобы обеспечить установку сокета в нужное время:

      /etc/systemd/system/gunicorn.socket

      [Unit]
      Description=gunicorn socket
      
      [Socket]
      ListenStream=/run/gunicorn.sock
      
      [Install]
      WantedBy=sockets.target
      

      Сохраните файл и закройте его после завершения.

      Теперь создайте и откройте служебный файл systemd для Gunicorn с привилегиями sudo в текстовом редакторе. Имя файла службы должно соответствовать имени файла сокета за исключением расширения:

      • sudo nano /etc/systemd/system/gunicorn.service

      Начните с раздела [Unit], предназначенного для указания метаданных и зависимостей. Здесь мы разместим описание службы и предпишем системе инициализации запускать ее только после достижения сетевой цели. Поскольку наша служба использует сокет из файла сокета, нам потребуется директива Requires, чтобы задать это отношение:

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      

      Теперь откроем раздел [Service]. Здесь указываются пользователь и группа, от имени которых мы хотим запустить данный процесс. Мы сделаем владельцем процесса учетную запись обычного пользователя, поскольку этот пользователь является владельцем всех соответствующих файлов. Групповым владельцем мы сделаем группу www-data, чтобы Nginx мог легко взаимодействовать с Gunicorn.

      Затем мы составим карту рабочего каталога и зададим команду для запуска службы. В данном случае мы укажем полный путь к исполняемому файлу Gunicorn, установленному в нашей виртуальной среде. Мы привяжем процесс к сокету Unix, созданному в каталоге /run, чтобы процесс мог взаимодействовать с Nginx. Мы будем регистрировать все данные на стандартном выводе, чтобы процесс journald мог собирать журналы Gunicorn. Также здесь можно указать любые необязательные настройки Gunicorn. Например, в данном случае мы задали 3 рабочих процесса:

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      
      [Service]
      User=sammy
      Group=www-data
      WorkingDirectory=/home/sammy/myprojectdir
      ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn 
                --access-logfile - 
                --workers 3 
                --bind unix:/run/gunicorn.sock 
                myproject.wsgi:application
      

      Наконец, добавим раздел [Install]. Это покажет systemd, куда привязывать эту службу, если мы активируем ее запуск при загрузке. Нам нужно, чтобы эта служба запускалась во время работы обычной многопользовательской системы:

      /etc/systemd/system/gunicorn.service

      [Unit]
      Description=gunicorn daemon
      Requires=gunicorn.socket
      After=network.target
      
      [Service]
      User=sammy
      Group=www-data
      WorkingDirectory=/home/sammy/myprojectdir
      ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn 
                --access-logfile - 
                --workers 3 
                --bind unix:/run/gunicorn.sock 
                myproject.wsgi:application
      
      [Install]
      WantedBy=multi-user.target
      

      Теперь служебный файл systemd готов. Сохраните и закройте его.

      Теперь мы можем запустить и активировать сокет Gunicorn. Файл сокета /run/gunicorn.sock будет создан сейчас, а также будет создаваться при загрузке. При подключении к этому сокету systemd автоматически запустит gunicorn.service для его обработки:

      • sudo systemctl start gunicorn.socket
      • sudo systemctl enable gunicorn.socket

      Успешность операции можно подтвердить, проверив файл сокета.

      Проверка файла сокета Gunicorn

      Проверьте состояние процесса, чтобы узнать, удалось ли его запустить:

      • sudo systemctl status gunicorn.socket

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

      Output

      ● gunicorn.socket - gunicorn socket Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese> Active: active (listening) since Fri 2020-06-26 17:53:10 UTC; 14s ago Triggers: ● gunicorn.service Listen: /run/gunicorn.sock (Stream) Tasks: 0 (limit: 1137) Memory: 0B CGroup: /system.slice/gunicorn.socket

      Затем проверьте наличие файла gunicorn.sock в каталоге /run:

      Output

      /run/gunicorn.sock: socket

      Если команда systemctl status указывает на ошибку, а также если в каталоге отсутствует файл gunicorn.sock, это означает, что сокет Gunicorn не удалось создать корректно. Проверьте журналы сокета Gunicorn с помощью следующей команды:

      • sudo journalctl -u gunicorn.socket

      Еще раз проверьте файл /etc/systemd/system/gunicorn.socket и устраните любые обнаруженные проблемы, прежде чем продолжить.

      Тестирование активации сокета

      Если вы запустили только gunicorn.socket, служба gunicorn.service не будет активирована из-за отсутствия подключений к сокету. Для проверки можно ввести следующую команду:

      • sudo systemctl status gunicorn

      Output

      ● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: inactive (dead)

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

      • curl --unix-socket /run/gunicorn.sock localhost

      Выводимые данные приложения должны отобразиться в терминале в формате HTML. Это показывает, что Gunicorn запущен и может обслуживать ваше приложение Django. Вы можете убедиться, что служба Gunicorn работает, с помощью следующей команды:

      • sudo systemctl status gunicorn

      Output

      ● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-26 18:52:21 UTC; 2s ago TriggeredBy: ● gunicorn.socket Main PID: 22914 (gunicorn) Tasks: 4 (limit: 1137) Memory: 89.1M CGroup: /system.slice/gunicorn.service ├─22914 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> ├─22927 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> ├─22928 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> └─22929 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico> Jun 26 18:52:21 django-tutorial systemd[1]: Started gunicorn daemon. Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Starting gunicorn 20.0.4 Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Listening at: unix:/run/gunicorn.sock (22914) Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Using worker: sync Jun 26 18:52:21 django-tutorial gunicorn[22927]: [2020-06-26 18:52:21 +0000] [22927] [INFO] Booting worker with pid: 22927 Jun 26 18:52:21 django-tutorial gunicorn[22928]: [2020-06-26 18:52:21 +0000] [22928] [INFO] Booting worker with pid: 22928 Jun 26 18:52:21 django-tutorial gunicorn[22929]: [2020-06-26 18:52:21 +0000] [22929] [INFO] Booting worker with pid: 22929

      Если результаты выводов команд curl или systemctl status указывают на наличие проблемы, посмотрите подробные данные в журналах:

      • sudo journalctl -u gunicorn

      Проверьте файл /etc/systemd/system/gunicorn.service на наличие проблем. Если вы внесли изменения в файл /etc/systemd/system/gunicorn.service, выполните перезагрузку демона, чтобы заново считать определение службы, и перезапустите процесс Gunicorn с помощью следующей команды:

      • sudo systemctl daemon-reload
      • sudo systemctl restart gunicorn

      Обязательно устраните вышеперечисленные проблемы, прежде чем продолжить.

      Настройка Nginx как прокси для Gunicorn

      Мы настроили Gunicorn, и теперь нам нужно настроить Nginx для передачи трафика в процесс.

      Для начала нужно создать и открыть новый серверный блок в каталоге Nginx sites-available:

      • sudo nano /etc/nginx/sites-available/myproject

      Откройте внутри него новый серверный блок. Вначале мы укажем, что этот блок должен прослушивать обычный порт 80, и что он должен отвечать на доменное имя или IP-адрес нашего сервера:

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      }
      

      Затем мы укажем Nginx игнорировать любые проблемы при поиске favicon. Также мы укажем, где можно найти статичные ресурсы, собранные нами в каталоге ~/myprojectdir/static. Все эти строки имеют стандартный префикс URI «/static», так что мы можем создать блок location для соответствия этим запросам:

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      
          location = /favicon.ico { access_log off; log_not_found off; }
          location /static/ {
              root /home/sammy/myprojectdir;
          }
      }
      

      В заключение мы создадим блок location / {} для соответствия всем другим запросам. В этот блок мы включим стандартный файл proxy_params, входящий в комплект установки Nginx, и тогда трафик будет передаваться напрямую на сокет Gunicorn:

      /etc/nginx/sites-available/myproject

      server {
          listen 80;
          server_name server_domain_or_IP;
      
          location = /favicon.ico { access_log off; log_not_found off; }
          location /static/ {
              root /home/sammy/myprojectdir;
          }
      
          location / {
              include proxy_params;
              proxy_pass http://unix:/run/gunicorn.sock;
          }
      }
      

      Сохраните файл и закройте его после завершения. Теперь мы можем активировать файл, привязав его к каталогу sites-enabled:

      • sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

      Протестируйте конфигурацию Nginx на ошибки синтаксиса:

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

      • sudo systemctl restart nginx

      Нам нужна возможность открыть брандмауэр для обычного трафика через порт 80. Поскольку нам больше не потребуется доступ к серверу разработки, мы можем удалить правило и открыть порт 8000:

      • sudo ufw delete allow 8000
      • sudo ufw allow 'Nginx Full'

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

      Примечание. После настройки Nginx необходимо защитить трафик на сервер с помощью SSL/TLS. Это важно, поскольку в противном случае вся информация, включая пароли, будет отправляться через сеть в простом текстовом формате.

      Если у вас имеется доменное имя, проще всего будет использовать Let’s Encrypt для получения сертификата SSL для защиты вашего трафика. Следуйте указаниям этого руководства, чтобы настроить Let’s Encrypt с Nginx в Ubuntu 20.04. Следуйте процедуре, используя серверный блок Nginx, созданный нами в этом обучающем модуле.

      Диагностика и устранение неисправностей Nginx и Gunicorn

      Если на последнем шаге не будет показано ваше приложение, вам нужно будет провести диагностику и устранение неисправностей установки.

      Nginx показывает страницу по умолчанию, а не приложение Django

      Если Nginx показывает страницу по умолчанию, а не выводит ваше приложение через прокси, это обычно означает, что вам нужно изменить параметр server_name в файле /etc/nginx/sites-available/myproject, чтобы он указывал на IP-адрес или доменное имя вашего сервера.

      Nginx использует server_name, чтобы определять, какой серверный блок использовать для ответа на запросы. Если вы увидите страницу Nginx по умолчанию, это будет означать, что Nginx не может найти явное соответствие запросу в серверном блоке и выводит блок по умолчанию, заданный в /etc/nginx/sites-available/default.

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

      Nginx выводит ошибку 502 Bad Gateway вместо приложения Django

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

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

      • sudo tail -F /var/log/nginx/error.log

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

      Вы можете получить следующее сообщение:

      connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)

      Это означает, что Nginx не удалось найти файл gunicorn.sock в указанном расположении. Вы должны сравнить расположение proxy_pass, определенное в файле etc/nginx/sites-available/myproject, с фактическим расположением файла gunicorn.sock, сгенерированным блоком systemd gunicorn.socket.

      Если вы не можете найти файл gunicorn.sock в каталоге /run, это означает, что файл сокета systemd не смог его создать. Вернитесь к разделу проверки файла сокета Gunicorn и выполните процедуру диагностики и устранения неисправностей Gunicorn.

      connect() to unix:/run/gunicorn.sock failed (13: Permission denied)

      Это означает, что Nginx не удалось подключиться к сокету Gunicorn из-за проблем с правами доступа. Это может произойти, если выполнять процедуру с использованием пользователя root вместо пользователя с привилегиями sudo. Хотя systemd может создать файл сокета Gunicorn, Nginx не может получить к нему доступ.

      Это может произойти из-за ограничения прав доступа в любой точке между корневым каталогом (/) и файлом gunicorn.sock. Чтобы посмотреть права доступа и владения файла сокета и всех его родительских каталогов, нужно ввести абсолютный путь файла сокета как параметр команды namei:

      • namei -l /run/gunicorn.sock

      Output

      f: /run/gunicorn.sock drwxr-xr-x root root / drwxr-xr-x root root run srw-rw-rw- root root gunicorn.sock

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

      В приведенном выше примере для файла сокета и каждого из каталогов пути к файлу сокета установлены всеобщие права доступа на чтение и исполнение (запись в столбце разрешений каталогов заканчивается на r-x, а не на ---). Процесс Nginx должен успешно получить доступ к сокету.

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

      Django выводит ошибку: «could not connect to server: Connection refused»

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

      OperationalError at /admin/login/
      could not connect to server: Connection refused
          Is the server running on host "localhost" (127.0.0.1) and accepting
          TCP/IP connections on port 5432?
      

      Это означает, что Django не может подключиться к базе данных Postgres. Убедиться в нормальной работе экземпляра Postgres с помощью следующей команды:

      • sudo systemctl status postgresql

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

      • sudo systemctl start postgresql
      • sudo systemctl enable postgresql

      Если проблемы не исчезнут, проверьте правильность настроек базы данных, заданных в файле ~/myprojectdir/myproject/settings.py.

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

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

      Следующие журналы могут быть полезными:

      • Проверьте журналы процессов Nginx с помощью команды: sudo journalctl -u nginx
      • Проверьте журналы доступа Nginx с помощью команды: sudo less /var/log/nginx/access.log
      • Проверьте журналы ошибок Nginx с помощью команды: sudo less /var/log/nginx/error.log
      • Проверьте журналы приложения Gunicorn с помощью команды: sudo journalctl -u gunicorn
      • Проверьте журналы сокета Gunicorn с помощью команды: sudo journalctl -u gunicorn.socket

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

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

      • sudo systemctl restart gunicorn

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

      • sudo systemctl daemon-reload
      • sudo systemctl restart gunicorn.socket gunicorn.service

      Если вы измените конфигурацию серверного блока Nginx, протестируйте конфигурацию и Nginx с помощью следующей команды:

      • sudo nginx -t && sudo systemctl restart nginx

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

      Заключение

      В этом руководстве мы создали и настроили проект Django в его собственной виртуальной среде. Мы настроили Gunicorn для трансляции запросов клиентов, чтобы Django мог их обрабатывать. Затем мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских соединений и вывода проектов, соответствующих запросам клиентов.

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



      Source link