Настройка сервера OpenVPN в Ubuntu 20.04
Ubuntu | Комментировать запись
Виртуальная частная сеть (VPN) позволяет работать в небезопасных сетях так, как если бы вы были подключены к частной сети. Трафик исходит от VPN-сервера и передается до места назначения. Это обеспечивает безопасный доступ к Интернету со смартфона или ноутбука в любой незащищенной сети (например, в сети WiFi в отеле или кафе).
Вместе с HTTPS этот сервер позволяет защитить ваши логины и транзакции: так вы можете обойти географические ограничения и цензуру, защитить свое местоположение и любой незашифрованный HTTP-трафик.
OpenVPN – это полнофункциональный открытый TLS инструмент VPN, который поддерживает широкий диапазон конфигураций. В этом мануале вы научитесь настраивать сервер OpenVPN на вашем сервере Ubuntu 20.04, а также настраивать доступ к клиентским машинам.
Примечание: Прежде чем приступить, оцените объемы трафика, которые будут проходить через ваш сервер – многие облачные провайдеры взымают дополнительную плату за превышение пропускной способности.
Требования
Для работы вам понадобится:
- Сервер Ubuntu 20.04, полностью настроенный по этому мануалу. Все действия по настройке OpenVPN нужно будет выполнять в сессии пользователя sudo. В этом мануале мы будем называть эту машину сервером OpenVPN, или сервером 1.
- Отдельный сервер Ubuntu 20.04, который будет служить вашим центром сертификации (ЦС или CA). В мануале этот сервер будет называться сервером ЦС. Чтобы настроить его, выполните разделы 1-3 мануала Установка и настройка центра сертификации в Ubuntu 20.04.
Примечание: Технически в качестве сервера ЦС возможно использовать тот же сервер OpenVPN или локальную машину, но этого делать не рекомендуется, так как это подвергает VPN некоторым уязвимостям. Согласно официальной документации OpenVPN вы должны разместить свой ЦС на автономной машине, предназначенной для импорта и подписания запросов на сертификаты. Потому в этом мануале предполагается, что ваш ЦС находится на отдельном сервере.
- Также вам понадобится клиентская машина, с помощью которой вы подключитесь к серверу OpenVPN. Для этих целей рекомендуем вам использовать свою локальную машину. В мануале мы будем называть ее клиентом OpenVPN.
Примечание: Если при настройке этих серверов вы отключите парольную аутентификацию, в дальнейшем вы можете столкнуться с трудностями при передаче файлов между ними. Чтобы устранить эту проблему, вы можете восстановить парольную аутентификацию на каждом сервере. В качестве альтернативы вы можете создать пару ключей SSH для каждого сервера, а затем добавить открытый SSH-ключ сервера OpenVPN в файл authorized_keys ЦС-машины (и в обратном направлении).
Читайте также: Установка SSH-ключей в Ubuntu 20.04
1: Установка OpenVPN и EasyRSA
Сначала установите на сервер пакеты OpenVPN и Easy-RSA.
Easy-RSA – это инструмент управления инфраструктурой открытых ключей (PKI, public key infrastructure), с помощью которого вы сгенерируете запрос сертификата к вашему ЦС на сервере OpenVPN.
Оба пакета доступны в официальном репозитории Ubuntu, а значит, вы можете установить их при помощи менеджера apt. Обновите индекс пакетов и установите необходимые пакеты на сервер:
sudo apt update
sudo apt install openvpn easy-rsa
Затем вам нужно создать новый каталог ~/easy-rsa на сервере OpenVPN:
mkdir ~/easy-rsa
После этого создайте симлинк из скрипта easyrsa в каталог ~/easy-rsa:
ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Примечание: В других мануалах вам могут предложить скопировать файлы пакета easy-rsa в каталог ~/easy-rsa, но мы рекомендуем создать симлинк. Тогда все обновления пакета easy-rsa будут автоматически отражаться на скрипте PKI.
Теперь передайте каталог вашему пользователю sudo и заблокируйте доступ других пользователей к этому каталогу:
sudo chown 8host ~/easy-rsa
chmod 700 ~/easy-rsa
Вы успешно установили все необходимое программное обеспечение. Теперь пора создать инфраструктуру открытых ключей (PKI) на сервере OpenVPN
2: Создание инфраструктуры открытых ключей
Прежде чем создать закрытый ключ и сертификат для вашего сервера OpenVPN, вам необходимо создать локальный каталог для инфраструктуры открытых ключей. Это нужно сделать на сервере OpenVPN. Этот каталог вы будете использовать для управления запросами сертификатов сервера и клиентов, чтобы не отправлять их прямо на сервер ЦС.
Чтобы создать каталог PKI на вашем сервере OpenVPN, нужно заполнить стандартными значениями файл vars. Сначала перейдите в каталог easy-rsa, а затем создайте и отредактируйте файл vars в удобном для вас текстовом редакторе.
cd ~/easy-rsa
nano vars
Когда файл откроется, вставьте в него эти две строки:
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Теперь ваши закрытые ключи и запросы сертификатов поддерживают современную эллиптическую криптографию (Elliptic Curve Cryptography, ECC) для генерации ключей и защиты подписей ваших клиентов и сервера OpenVPN.
Настройка серверов OpenVPN и ЦС для поддержки ECC позволяет им использовать алгоритмы эллиптической кривой для обмена данными, если клиент и сервер пытаются установить общий симметричный ключ. Обмен ключами с помощью ECC значительно быстрее, чем с помощью простого классического алгоритма Диффи-Хеллмана, поскольку числа ECC намного меньше и вычисления выполняются быстрее.
Примечание: Когда клиенты подключаются к OpenVPN, они используют асимметричное шифрование (через открытый и закрытый ключ) для выполнения рукопожатия TLS. Однако при передаче зашифрованного трафика VPN сервер и клиенты используют симметричное шифрование, которое также называется шифрованием с общим ключом.
Симметричное шифрование требует значительно меньше вычислительных затрат по сравнению с асимметричным: используемые числа намного меньше, а современные процессоры оптимизируют симметричные операции шифрования.
Чтобы переключиться с асимметричного шифрования на симметричное, сервер и клиент OpenVPN будут использовать эллиптический алгоритм Диффи-Хеллмана (ECDH) для скорейшего согласования общего секретного ключа.
Заполнив файл vars, вы можете приступить к созданию каталога PKI. Для этого запустите скрипт easyrsa с параметром init-pki. Если вы следовали нашим руководствам по предварительной настройке, вы уже выполнили эту команду на сервере ЦС. Теперь ее необходимо выполнить здесь, на этом сервере, поскольку ваш сервер OpenVPN и сервер ЦС имеют отдельные каталоги PKI:
./easyrsa init-pki
Обратите внимание, вам не нужно создавать центр сертификации на вашем сервере OpenVPN, поскольку сервер ЦС несет полную ответственность за проверку и подпись сертификатов. PKI на вашем VPN-сервере используется только как централизованное место для хранения запросов и публичных сертификатов.
После инициализации вашей PKI на сервере OpenVPN вы готовы перейти к созданию и секретного ключа и запроса сертификата для сервера OpenVPN.
3: Создание запроса на сертификат и закрытого ключа для сервера OpenVPN
Теперь, когда на вашем сервере OpenVPN установлены все необходимые компоненты, пора переходить к созданию секретного ключа и запроса на подпись сертификата (CSR) на вашем сервере OpenVPN. После этого вы передадите запрос в свой ЦС для подписания, что создаст необходимый сертификат. Получив подписанный сертификат, вы перенесете его обратно на сервер OpenVPN и установите его для использования сервером.
Для начала перейдите в каталог ~/easy-rsa на сервере OpenVPN:
cd ~/easy-rsa
Теперь вызовите easyrsa с опцией gen-req, за которой укажите Common Name (CN) для этой машины. Вы можете выбрать любое значение в Common Name, но лучше выбрать что-то описательное. В этом руководстве CN сервера OpenVPN будет server. Не забудьте также включить опцию nopass. Несоблюдение этого требования защитит файл запроса паролем, что в дальнейшем может привести к проблемам с доступом.
Примечание: Если вы выберете здесь не server, а другое имя, вам придется соответствующим образом изменить некоторые из приведенных ниже инструкций. Например, вам нужно подставить правильные имена при копировании сгенерированных файлов в каталог /etc/openvpn. Позже вам нужно будет изменить файл /etc/openvpn/server.conf, чтобы указать правильные файлы .crt и .key.
./easyrsa gen-req server nopass
Common Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/8host/easy-rsa/pki/reqs/server.req
key: /home/8host/easy-rsa/pki/private/server.key
Это создаст закрытый ключ для сервера и файл запроса сертификата server.req. Скопируйте ключ сервера в каталог /etc/openvpn/server:
sudo cp /home/8host/easy-rsa/pki/private/server.key /etc/openvpn/server/
Вы успешно создали закрытый ключ, а также сгенерировали запрос на подпись сертификата для сервера OpenVPN. CSR теперь готов к подписанию вашим CA. В следующем разделе вы узнаете, как подписать CSR с помощью закрытого ключа вашего сервера ЦС.
4: Подпись запроса на сертификат для сервера OpenVPN
На предыдущем этапе вы создали запрос на подпись сертификата (CSR) и закрытый ключ для сервера OpenVPN. Теперь сервер ЦС должен узнать о сертификате server и подписать его. Когда ЦС проверит и передаст сертификат обратно на сервер OpenVPN, клиенты, которые доверяют вашему ЦС, смогут также доверять и серверу OpenVPN.
Используйте SCP или другой способ передачи на сервере OpenVPN, чтобы скопировать запрос server.req на сервер ЦС для подписи:
scp /home/8host/easy-rsa/pki/reqs/server.req 8host@your_ca_server_ip:/tmp
Теперь войдите на сервер ЦС как пользователь sudo, которому принадлежит каталог easy-rsa (согласно этому мануалу, в нем вы создали свою PKI). Импортируйте запрос сертификата, используя скрипт easyrsa:
cd ~/easy-rsa
./easyrsa import-req /tmp/server.req server
. . .
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.
Затем подпишите запрос, запустив сценарий easyrsa с параметром sign-req, затем укажите тип запроса и Common Name. Запрос может быть двух типов: client или server. Поскольку мы работаем с запросом сертификата для сервера OpenVPN, обязательно используйте тип запроса server:
./easyrsa sign-req server server
В выводе вам будет предложено подтвердить, что запрос поступил из надежного источника. Введите yes, затем нажмите Enter для подтверждения:
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 3650 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/8host/easy-rsa/pki/issued/server.crt
Если вы зашифровали свой ключ CA, сейчас вам будет предложено ввести пароль.
Выполнив эти шаги, вы получите подписанный запрос сертификата для сервера OpenVPN, используя закрытый ключ CA-сервера. Полученный файл server.crt содержит открытый ключ шифрования сервера OpenVPN, а также подпись от сервера ЦС. Смысл подписи заключается в том, чтобы сообщить всем, кто доверяет серверу ЦС, что они также могут доверять и вашему серверу OpenVPN при подключении к нему.
Чтобы завершить настройку сертификатов, скопируйте файлы server.crt и ca.crt с сервера ЦС на сервер OpenVPN:
scp pki/issued/server.crt 8host@your_vpn_server_ip:/tmp
scp pki/ca.crt 8host@your_vpn_server_ip:/tmp
Теперь вернитесь на ваш сервер OpenVPN, скопируйте файлы из /tmp в /etc/openvpn/server.
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Теперь сервер OpenVPN почти готов к подключениям. На следующем этапе мы выполним некоторые дополнительные действия, чтобы повысить безопасность сервера.
5: Настройка криптографии OpenVPN
Для повышения безопасности мы добавим дополнительный общий секретный ключ, который сервер и все клиенты будут использовать с директивой OpenVPN tls-crypt. Эта опция используется для обфускации сертификата TLS, который используется при подключении сервера и клиента. Она также используется сервером OpenVPN для быстрой проверки входящих пакетов: если пакет подписан с помощью общего ключа, сервер обрабатывает его; если он не подписан, сервер знает, что он из ненадежного источника, и может сбросить его, не выполняя дополнительную работу по расшифровке.
Эта опция поможет вашему серверу OpenVPN справиться с незаверенным трафиком, сканированием портов и атаками типа «Denial of Service». Также она затруднит идентификацию сетевого трафика OpenVPN.
Чтобы создать общий ключ tls-crypt, выполните следующие команды на сервере OpenVPN в каталоге ~/easy-rsa:
cd ~/easy-rsa
openvpn --genkey --secret ta.key
В результате вы получите файл в каталоге /etc/openvpn/server/:
sudo cp ta.key /etc/openvpn/server
Имея эти файлы на сервере OpenVPN, вы готовы создавать сертификаты клиентов и файлы ключей для подключения к VPN.
6: Генерирование сертификатов и ключей клиента
Теперь можно создать клиентский сертификат и пару ключей. Это можно сделать на клиентской машине, а затем подписать ЦС, но в этом мануале мы будем генерировать подписанный ключ на сервере OpenVPN – так проще. Это позволяет написать сценарий, который будет автоматически генерировать конфигурационные файлы клиентов, в которых будут необходимые ключи и сертификаты. Благодаря этому вам не придется передавать ключи, сертификаты и конфигурации на клиентские машины.
Создайте один клиентский ключ/сертификат. Если у вас больше одного клиента, вы можете повторить этот процесс необходимое количество раз. При этом передайте скрипту уникальное значение для каждого клиента. В мануале клиент условно называется client1.
Создайте в домашнем каталоге структуру каталогов для хранения сертификата клиента и файлов ключей:
mkdir -p ~/client-configs/keys
Поскольку сертификаты и ключи клиентов, а также файлы конфигурации будут находиться в этом каталоге, вы должны закрыть доступ к нему:
chmod -R 700 ~/client-configs
Затем вернитесь в каталог EasyRSA и запустите скрипт easyrsa с опциями gen-req и nopass, указав common name клиента:
cd ~/easy-rsa
./easyrsa gen-req client1 nopass
Нажмите Enter, чтобы подтвердить Common name. Скопируйте client1.key в ~/client-configs/keys/:
cp pki/private/client1.key ~/client-configs/keys/
Передайте файл client1.req на сервер ЦС:
scp pki/reqs/client1.req 8host@your_ca_server_ip:/tmp
Войдите на машину ЦС, перейдите в каталог EasyRSA и импортируйте запрос на сертификат:
cd ~/easy-rsa
./easyrsa import-req /tmp/client1.req client1
Затем подпишите запрос так же, как и для сервера. Но на этот раз укажите тип запроса client:
./easyrsa sign-req client client1
В ответ введите yes, чтобы подтвердить, что вы хотите подписать запрос сертификата и что он пришел из надежного источника:
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Опять же, если вы защитили свой ключ ЦС, вам будет предложено ввести пароль.
Это создаст клиентский сертификат client1.crt, который нужно передать на сервер:
scp pki/issued/client1.crt 8host@your_server_ip:/tmp
Подключитесь обратно на сервер OpenVPN и скопируйте сертификат клиента в каталог ~/client-configs/keys/:
cp /tmp/client1.crt ~/client-configs/keys/
Затем скопируйте ca.crt и ta.key в каталог ~/client-configs/keys/и установите права доступа к нему:
cp ~/easy-rsa/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
sudo chown 8host.8host ~/client-configs/keys/*
Теперь все серверные и клиентские сертификаты и ключи сгенерированы и хранятся в соответствующих каталогах на сервере. Позже вам еще придется поработать с этими файлами. На данный момент вы можете перейти к настройке OpenVPN на сервере.
7: Настройка сервиса OpenVPN
Теперь пора настроить сервис OpenVPN. При этом используются созданные ранее учетные данные и файлы. В данном разделе мы покажем, как настроить OpenVPN по образцу, который включен в документацию проекта.
Для начала нужно скопировать образец файла server.conf OpenVPN в каталог конфигурации, чтобы его можно было использовать в качестве основы для новых конфигураций.
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/
sudo gunzip /etc/openvpn/server/server.conf.gz
Откройте файл в текстовом редакторе:
sudo nano /etc/openvpn/server/server.conf
Найдите в файле раздел HMAC и директиву tls-auth. Добавьте в начало этой строки точку с запятой, чтобы закомментировать tls-auth. Под этой директивой добавьте такую строку:
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key
Затем найдите раздел шифров, а в нем закомментированные строки cipher. Стандартное значение AES-256-CBC обеспечивает нормальное шифрование, но AES-256-GCM надежнее, производительнее и хорошо поддерживается. Закомментируйте первое значение, добавив точку с запятой, а под ним добавьте строку с новым значением:
;cipher AES-256-CBC
cipher AES-256-GCM
Ниже вы можете добавить строку auth, чтобы выбрать алгоритм HMAC. SHA256 – хороший выбор:
auth SHA256
Затем найдите директиву dh, которая определяет параметры Диффи-Хеллмана. Поскольку ранее мы настроили поддержку Elliptic Curve Cryptography, нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку (типа dh dh2048.pem или dh dh.pem), а под ней вставьте строку dh none:
;dh dh2048.pem
dh none
Чтобы OpenVPN запускался без привилегий, найдите настройки user и group и удалите “;” в начале этих строк:
user nobody
group nogroup
Принудительное перенаправление трафика на VPN (опционально)
В приведенных выше настройках будет создано VPN-соединение между двумя машинами, но подключение к туннелю не будет выполняться принудительно. Если вы хотите использовать VPN для маршрутизации всего трафика, вам нужно переместить настройки DNS на клиентские компьютеры.
Для начала раскомментируйте несколько директив в файле server.conf, которые настраивают клиентские компьютеры для перенаправления всего веб-трафика через VPN. Найдите push “redirect-gateway def1 bypass-dhcp” и удалите точку с запятой в начале строки, чтобы раскомментировать ее:
push "redirect-gateway def1 bypass-dhcp"
Ниже найдите раздел dhcp-option. Удалите “;” в начале строк, чтобы раскомментировать их:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Эти строки позволят клиентам использовать OpenDNS резолверы по перечисленным IP-адресам. Если вы предпочитаете другие резолверы, укажите их здесь.
Это должно помочь клиентам переконфигурировать DNS для использования туннеля VPN в качестве шлюза по умолчанию.
Изменение порта и протокола (опционально)
По умолчанию сервер OpenVPN использует порт 1194 и протокол UDP для приема клиентских подключений. Если вам нужно использовать другой порт из-за ограничений сетевой среды, вы можете изменить параметр port. Если вы не размещаете веб-контент на своем сервере OpenVPN, можете использовать порт 443, поскольку он обычно разблокирован в брандмауэре.
Чтобы настроить OpenVPN для прослушивания порта 443, откройте файл server.conf и найдите строку, которая выглядит так:
port 1194
Измените порт:
# Optional!
port 443
Часто протокол ограничивается этим портом. Если это так, измените значение proto с UDP на TCP:
# Optional!
proto tcp
Если вы переключили протокол на TCP, вам нужно будет изменить значение директивы explicit-exit-notify с 1 на 0, так как эта директива поддерживается только UDP. В противном случае TCP вызовет ошибки при запуске службы OpenVPN:
# Optional!
explicit-exit-notify 0
Если вам не нужно использовать другой порт, лучше оставить эти два параметра по умолчанию.
Настройка нестандартных учетных данных (опционально)
Если ранее вы указали другое имя в команде ./easyrsa gen-req server, измените строки cert и key, чтобы указать соответствующие файлы .crt и .key. Если вы использовали значение по умолчанию server, ничего менять не нужно.
cert server.crt
key server.key
Сохраните и закройте файл.
8: Конфигурации сети сервера OpenVPN
Затем нужно настроить некоторые параметры сервера, чтобы OpenVPN мог правильно маршрутизировать трафик.
Во-первых, нужно разрешить серверу пересылать трафик. Это довольно важно для функциональности, которую мы хотим предоставить VPN-серверу.
Все, что нам нужно, находится в файле /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
В начало файла добавьте эту строку:
net.ipv4.ip_forward = 1
Сохраните и закройте файл.
Чтобы обновить настройки в текущей сессии, введите:
sudo sysctl -p
net.ipv4.ip_forward = 1
Теперь ваш сервер OpenVPN сможет перенаправлять входящий трафик с одного устройства Ethernet на другое. Этот параметр гарантирует, что сервер может направлять трафик от клиентов, которые подключаются через виртуальный интерфейс VPN, через другие физические устройства Ethernet. Он будет направлять весь веб-трафик вашего клиента через IP-адрес вашего сервера, и внешний IP-адрес вашего клиента будет фактически скрыт.
Далее нужно будет настроить некоторые правила брандмауэра, чтобы обеспечить корректную передачу трафика на сервер OpenVPN и с него.
9: Настройка брандмауэра
Мы до сих пор не сообщили OpenVPN о том, куда отправлять входящий веб-трафик от клиентов. Вы можете указать, как сервер должен обрабатывать клиентский трафик, установив некоторые правила брандмауэра и конфигурации маршрутизации.
Если вы выполнили мануал по начальной настройке сервера, на вашем сервере уже должен быть установлен и запущен ufw. Чтобы пропустить трафик OpenVPN через брандмауэр, вам нужно включить маскарадинг (эта технология iptables выполняет динамический NATдля корректной маршрутизации клиентов).
Для начала нам нужно определить открытый сетевой интерфейс машины. Для этого введите:
ip route list default
Открытый интерфейс будет указан в выводе после dev. Например, в этом случае это интерфейс eth0:
default via 159.65.160.1 dev eth0 proto static
Определив интерфейс, связанный с маршрутом по умолчанию, откройте файл /etc/ufw/before.rules, чтобы добавить соответствующую конфигурацию:
sudo nano /etc/ufw/before.rules
Правила UFW обычно добавляются с помощью команды ufw. Однако правила, перечисленные в файле before.rules, считываются и вводятся в действие до того, как будут загружены обычные правила UFW. В начало файла добавьте выделенные ниже строки. Это установит политику по умолчанию для цепочки POSTROUTING в таблице nat и будет маскировать весь трафик, поступающий из VPN. Не забудьте заменить wlp11s0 в строке -A POSTROUTING интерфейсом, который вы определили ранее.
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
# Don't delete these required lines, otherwise there will be errors
*filter
. . .
Сохраните и закройте файл.
Также UFW нужно разрешить пересылать пакеты по умолчанию. Для этого откройте /etc/default/ufw:
sudo nano /etc/default/ufw
Внутри найдите директиву DEFAULT_FORWARD_POLICY. Измените значение DROP на ACCEPT:
DEFAULT_FORWARD_POLICY="ACCEPT"
Сохраните и закройте файл.
Затем нужно настроить брандмауэр для поддержки трафика OpenVPN.
Если вы не изменили порт и протокол в файле /etc/openvpn/server.conf, вам нужно будет открыть UDP-трафик на порт 1194. Если вы изменили порт и/или протокол, откорректируйте здесь эти значения.
Также нужно добавить SSH-порт, если вы забыли добавить его, следуя инструкциям в предварительных требованиях:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
Теперь нужно отключить и снова включить UFW, чтобы брандмауэр считал все новые параметры из всех файлов.
sudo ufw disable
sudo ufw enable
Теперь сервер может правильно обрабатывать трафик OpenVPN.
10: Запуск сервиса OpenVPN
Сейчас можно запустить OpenVPN на сервере. Это делается с помощью утилиты systemctl. Давайте добавим сервис в автозагрузку, чтобы VPN запускалась вместе с сервером. Для этого введите команду:
sudo systemctl -f enable openvpn-server@server.service
Запустите OpenVPN:
sudo systemctl start openvpn-server@server.service
Убедитесь, что сервис успешно запущен:
sudo systemctl status openvpn-server@server.service
Если все работает правильно, вы увидите:
openvpn-server@server.service - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/openvpn-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-29 15:39:59 UTC; 6s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 16872 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1137)
Memory: 1.0M
CGroup: /system.slice/system-openvpn\x2dserver.slice/openvpn-server@server.service
└─16872 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --c>
. . .
. . .
Apr 29 15:39:59 ubuntu-20 openvpn[16872]: Initialization Sequence Completed
11: Создание инфраструктуры клиентской конфигурации
Создание конфигурационных файлов для клиентов OpenVPN может быть затруднительно, так как каждый клиент должен иметь собственную конфигурацию и при этом она должна совпадать с настройками, указанными в конфигурации сервера. Вместо того чтобы создавать файлы, которые можно использовать только на одном клиенте, создайте инфраструктуру конфигурации клиента, которую вы можете использовать для создания конфигурационных файлов на ходу. Сначала вы создадите базовый конфигурационный файл, а затем напишете скрипт, который позволит генерировать уникальные конфигурационные файлы клиентов, сертификаты и ключи.
Создайте в своем домашнем каталоге структуру каталогов для хранения файлов:
mkdir -p ~/client-configs/files
Затем скопируйте образец конфигурации клиента в каталог client-configs, чтобы использовать его в качестве базовой конфигурации:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Откройте этот новый файл в текстовом редакторе:
nano ~/client-configs/base.conf
В него нужно внести несколько поправок.
Сначала найдите директиву remote. Она указывает клиенту адрес сервера OpenVPN. Это должен быть внешний IP-адрес вашего сервера OpenVPN. Если вы изменили порт, который прослушивает сервер OpenVPN, замените 1194 новым номером порта.
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 1194
. . .
Убедитесь также, что протокол указан правильно.
proto udp
Затем раскомментируйте директивы user и group, удалив “;”:
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
Найдите директивы ca, cert и key. Закомментируйте их, так как сертификаты и ключи нужно добавить внутри самого файла:
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key
Также раскомментируйте директиву tls-auth, чтобы добавить ta.key прямо в конфигурационный файл клиента:
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
Параметры cipher и auth должны отражать значения из файла /etc/openvpn/server.conf.
cipher AES-256-GCM
auth SHA256
Затем где-нибудь в файле поместите директиву key-direction. Для работы с сервером должно быть установлено значение «1»:
key-direction 1
В завершение добавьте несколько закомментированных строк. Их нужно включить в каждый конфиг, но активировать их можно только для клиентов Linux, которые поставляются с файлом /etc/openvpn/update-resolv-conf. Этот скрипт использует утилиту resolvconf для обновления информации DNS для клиентов Linux.
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Затем добавьте следующие строки для клиентов, которые используют систему systemd-resolved:
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
Сохраните и закройте файл.
Позже, в разделе 13, мы расскажем, как работает DNS-разрешение на клиентах Linux и какую группу строк вам нужно раскомментировать.
Теперь создайте простой скрипт для компиляции базовой конфигурации с соответствующими сертификатами, ключами и файлами шифрования. Он поместит сгенерированную конфигурацию в каталог ~/client-configs/files. Создайте и откройте файл make_config.sh:
nano ~/client-configs/make_config.sh
Вставьте в него такой сценарий, вместо 8host укажите имя своего пользователя:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn
Сохраните и закройте файл.
Сделайте его исполняемым.
chmod 700 ~/client-configs/make_config.sh
Этот скрипт создаст копию файла base.conf, который вы создали, соберет все файлы сертификатов и ключей клиента, извлечет их содержимое, добавит их в копию базового файла конфигурации и экспортирует все это содержимое в новый конфигурационный файл клиента. Это означает, что вместо того, чтобы отдельно управлять конфигурацией каждого клиента, его сертификатом и ключами, вы сможете хранить всю информацию в одном месте. Преимущество этого подхода заключается в том, что если вам когда-либо понадобится добавить клиента в будущем, вы сможете просто запустить этот скрипт, чтобы быстро создать конфигурацию и убедиться, что вся важная информация доступна.
Обратите внимание: при добавлении каждого нового клиента вам необходимо будет создать для него новые ключи и сертификаты, прежде чем вы сможете запустить этот скрипт и создать его конфигурационный файл.
12: Генерирование клиентской конфигурации
Если вы следовали руководству, вы создали клиентский сертификат и ключ client1.crt и client1.key в разделе 6. Чтобы создать конфигурацию для этих учетных данных, нужно перейти в каталог ~/client-configs и использовать созданный вами сценарий:
cd cd ~/client-configs
./make_config.sh client1
Если все сделано правильно, в каталоге ~/client-configs/files появится файл client1.ovpn.
ls ~/client-configs/files
client1.ovpn
Теперь необходимо перенести конфигурации клиента на клиентское устройство. Например, это может быть ваш локальный компьютер или мобильное устройство.
Приложения, используемые вами для осуществления этой передачи, зависят от вашего выбора и операционной системы устройства. Но лучше бы приложение использовало SFTP (SSH file transfer protocol) или SCP (Secure Copy). Это позволяет передать конфиденциальные данные клиента по зашифрованному соединению.
Ниже приведен пример команды SFTP с файлом client1.ovpn. Эту команду можно запустить с вашего локального компьютера (macOS или Linux). Она помещает файл .ovpn в домашний каталог:
sftp 8host@openvpn_server_ip:client-configs/files/client1.ovpn ~/
Также вы можете использовать следующие приложения и мануалы:
- WinSCP
- Использование SFTP для безопасного обмена файлами с удаленным сервером
- Безопасное управление файлами сервера с помощью Filezilla
13: Клиентская конфигурация
Теперь мы обсудим, как установить клиентский профиль VPN в Windows, macOS, iOS и Android. Эти разделы не зависят друг от друга, поэтому их не нужно выполнять последовательно – просто выберите нужную вам систему и следуйте инструкциям.
Соединение OpenVPN будет называться так же, как файл .ovpn. В данном примере это означает, что соединение будет называться client1.ovpn для первого созданного файла клиента.
Система Windows
Установка
Приложение OpenVPN для Windows можно найти здесь. Выберите подходящую версию инсталлятора.
Примечание: Для установки OpenVPN требуются административные права.
После установки OpenVPN скопируйте файл .ovpn в:
C:\Program Files\OpenVPN\config
Когда вы запустите OpenVPN, он автоматически увидит профиль и сделает его доступным.
OpenVPN должен запускаться как администратор каждый раз, когда он используется даже с помощью административных учетных записей. Чтобы не кликать правой кнопкой мыши и не выбирать Run as administrator каждый раз, когда вы используете VPN, вы можете настроить такой запуск, но это должно быть сделано из учетной записи администратора. Это также означает, что стандартным пользователям необходимо будет ввести пароль администратора для использования OpenVPN. С другой стороны, стандартные пользователи не могут правильно подключиться к серверу, если у приложения OpenVPN на клиенте нет прав администратора, поэтому необходимы повышенные привилегии.
Чтобы приложение OpenVPN всегда запускалось как администратор, кликните по нему правой кнопкой мыши и выберите Properties. В нижней части вкладки Compatibility нажмите Change settings for all users. В новом окне установите флажок Run this program as an administrator.
Подключение
Каждый раз, когда вы запускаете GUI OpenVPN, Windows спрашивает, хотите ли вы разрешить программе вносить изменения на компьютер. Здесь нужно выбрать Yes. Запуск клиентского приложения OpenVPN только помещает апплет в системный трей, чтобы VPN можно было подключать и отключать по мере необходимости; фактически это не создает VPN-соединения.
После запуска OpenVPN инициируйте соединение; для этого войдите в апплет панели задач и кликните правой кнопкой мыши по значку OpenVPN. Откроется контекстное меню. Выберите client1 в верхней части меню (это наш профиль client1.ovpn) и нажмите Connect.
Откроется окно состояния, показывающее вывод лога при установлении соединения, а после подключения клиента появится сообщение.
Отключить VPN можно так же: зайдите в апплет панели задач, кликните правой кнопкой мыши по OpenVPN, выберите профиль клиента и нажмите Disconnect.
Система macOS
Установка
Tunnelblick – это свободный и открытый клиент OpenVPN для macOS. Загрузить последний образ можно отсюда. Кликните дважды по загруженному файлу .dmg и следуйте инструкциям.
В конце установки Tunnelblick спросит, есть ли у вас файлы конфигурации. Выберите I have configuration files и дайте Tunnelblick закончить установку. Откройте окно Finder и дважды щелкните client1.ovpn. Tunnelblick установит профиль клиента. Для этого требуются административные привилегии.
Подключение
Запустите Tunnelblick, дважды кликнув по Tunnelblick в папке Applications. После запуска в строке меню в верхней правой части экрана появится значок Tunnelblick для управления соединениями. Нажмите на значок, а затем выберите пункт меню Connect, чтобы начать VPN-соединение. Выберите соединение client1.
Система Linux
Установка
Если вы используете Linux, у вас есть множество инструментов, которые вы можете использовать в зависимости от вашего дистрибутива. Утилиты подключения могут также быть в среде рабочего стола или диспетчера окон.
Однако самым универсальным способом подключения является программное обеспечение OpenVPN.
В Ubuntu или Debian вы можете установить его так же, как и на сервере:
sudo apt update
sudo apt install openvpn
В CentOS нужно добавить репозиторий EPEL, после чего можно установить программу.
sudo yum install epel-release
sudo yum install openvpn
Настройка клиентов с поддержкой systemd-resolved
Проверьте, поддерживает ли ваш дистрибутив systemd-resolved для обработки DNS-разрешения. Для этого запросите файл /etc/resolv.conf:
ls cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
. . .
nameserver 127.0.0.53
options edns0
Если ваша система настроена на поддержку systemd-resolved для DNS-разрешения, после опции nameserver будет IP-адрес 127.0.0.53. В файле также должны быть комментарии (например, вывод, объясняющий, как systemd-resolved управляет файлом). Если у вас указан другой IP-адрес, не 127.0.0.53, скорее всего, ваша система не использует systemd-resolved – тогда вы можете перейти к следующему разделу по настройке клиентов Linux, которые используют скрипт update-resolv-conf.
Для поддержки этих клиентов сначала установите пакет openvpn-systemd-resolved. Он предоставляет сценарии, которые заставят systemd-resolved использовать VPN-сервер для разрешения DNS.
sudo apt install openvpn-systemd-resolved
Затем отредактируйте конфигурационный файл клиента OpenVPN, который вы передали:
nano client1.ovpn
Раскомментируйте следующие строки, которые вы поместили ранее, чтобы настроить параметры DNS:
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
Настройка клиентов с поддержкой update-resolv-conf
Если ваша система не использует systemd-resolved для управления DNS, проверьте, содержит ли ваш дистрибутив скрипт /etc/openvpn/update-resolv-conf:
ls /etc/openvpn
update-resolv-conf
Если ваш клиент включает файл update-resolv-conf, отредактируйте конфигурационный файл клиента OpenVPN, который вы передали ранее:
nano client1.ovpn
Раскомментируйте эти три строки, добавленные вами ранее в параметры DNS:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Если вы используете CentOS, измените директиву group с nogroup на nobody, чтобы значение отражало доступные группы дистрибутива:
group nobody
Сохраните и закройте файл.
Подключение
Теперь вы можете подключиться к VPN, просто указав команду openvpn в файл конфигурации клиента:
sudo openvpn --config client1.ovpn
Это должно подключить вас к вашему VPN.
Примечание: Если ваш клиент использует systemd-resolved для управления DNS, проверьте правильность настроек, введя команду systemd-resolv –status:
systemd-resolve --status tun0
Вы должны увидеть подобный результат:
Link 22 (tun0)
. . .
DNS Servers: 208.67.222.222
208.67.220.220
DNS Domain: ~.
Если вы видите IP-адреса DNS-серверов, которые вы настроили на сервере OpenVPN, а в поле DNS Domain указано значение «~.», вы правильно настроили свой клиент. Вы также можете проверить, отправляет ли сервер DNS-запросы через VPN; для этого обратитесь к сайту DNS leak test.com
Система iOS
Установка
В iTunes App Store найдите и установите OpenVPN Connect, официальное клиентское приложение iOS OpenVPN. Чтобы перенести конфигурацию клиента iOS на устройство, подключите его непосредственно к компьютеру.
Здесь будет описание завершения передачи iTunes. Откройте iTunes на компьютере и нажмите iPhone > apps. Прокрутите вниз до раздела File Sharing и кликните по OpenVPN. Пустое окно справа, OpenVPN Documents, предназначено для обмена файлами. Перетащите файл .ovpn в окно OpenVPN Documents.
Теперь запустите приложение OpenVPN на iPhone. Появится уведомление о том, что новый профиль готов к импорту. Нажмите зеленый плюсик, чтобы импортировать его.
Подключение
OpenVPN теперь готов к использованию с новым профилем. Запустите соединение, сдвинув кнопку Connect в положение On. Чтобы прервать соединение, нужно сдвинуть ту же кнопку в положение Off.
Примечание: Переключатель VPN в разделе Settings нельзя использовать для подключения к VPN. Если вы попытаетесь, вы сможете подключаться только с помощью приложения OpenVPN.
Android
Установка
Откройте Google Play Store. Найдите и установите Android OpenVPN Connect, официальное клиентское приложение Android OpenVPN.
Профиль .ovpn можно перенести, подключив устройство Android к компьютеру с помощью USB и скопировав файл. В качестве альтернативы, если у вас есть устройство для чтения SD-карт, вы можете использовать SD-карту устройства, скопировать профиль на нее и затем вставить карту обратно в Android-устройство.
Запустите приложение OpenVPN и откройте меню, чтобы импортировать профиль.
Затем перейдите к расположению сохраненного профиля (/sdcard/Download/) и выберите файл. Приложение сообщит, что профиль был импортирован.
Подключение
Для подключения щелкните переключатель рядом с профилем, который вы хотите использовать. Вы увидите статистику вашего соединения и трафика, маршрутизируемого через ваш сервер OpenVPN, в реальном времени.
Чтобы отключиться, просто еще раз нажмите переключатель в левом верхнем углу. Вам будет предложено подтвердить, что вы хотите отключиться от VPN.
14: Тестирование VPN-соединения
Примечание: Этот метод проверки работает только в случае, если вы перенаправили весь трафик на VPN в разделе 7.
Теперь, когда все установлено, нужно выполнить простую проверку, чтобы убедиться, что VPN работает правильно. Без VPN-подключения откройте браузер и перейдите в DNSLeakTest.
Сайт вернет IP-адрес, назначенный вашим провайдером интернет-услуг, так вас видят другие сайты в сети. Чтобы проверить настройки DNS через один и тот же сайт, нажмите Extended Test, и он расскажет вам, какие DNS-серверы вы используете.
Подключите клиент OpenVPN к VPN вашего сервера и обновите браузер. Теперь у вашего VPN-сервера должен появиться совершенно другой IP-адрес и в сети вас видят по-другому. Опять же, расширенный тест DNSLeakTest проверит ваши настройки DNS и подтвердит, что вы используете DNS-резолверы, настроенные вашим VPN.
15: Отзыв клиентских сертификатов
Иногда возникает необходимость отозвать сертификат клиента, чтобы предотвратить дальнейший доступ к серверу OpenVPN.
Эта процедура описана в соответствующем разделе мануала Установка и настройка центра сертификации в Ubuntu 20.04.
После отзыва сертификата клиента вам нужно скопировать сгенерированный файл crl.pem на сервер OpenVPN в каталог /etc/openvpn/server.
sudo cp /tmp/crl.pem /etc/openvpn/server/
Затем откройте конфигурационный файл сервера OpenVPN:
sudo nano /etc/openvpn/server/server.conf
В нижнюю часть файла добавьте опцию crl-verify, которая скажет серверу OpenVPN проверять список отзыва сертификатов:
crl-verify crl.pem
Сохраните и закройте файл.
Перезапустите OpenVPN, чтобы отозвать сертификаты:
sudo systemctl restart openvpn-server@server.service
Теперь клиент не сможет подключаться к серверу с помощью старых учетных данных.
Чтобы отозвать сертификаты других клиентов, выполните следующие действия:
- Отзовите сертификат с помощью команды ./easyrsa revoke client_name
- Создайте новый CRL
- Перенесите новый файл crl.pem на сервер OpenVPN и скопируйте его в каталог /etc/openvpn, чтобы перезаписать старый список.
- Перезапустите службу OpenVPN.
Так вы сможете отозвать любые сертификаты клиентов.
Чтобы отозвать дополнительных клиентов, выполните этот процесс:
Заключение
Теперь у вас есть безопасный доступ к интернету: ваши личные данные, локация и трафик полностью защищены от перехвата и цензуры.
Чтобы настроить больше клиентов, повторите разделы 6 и 11-13 для каждого дополнительного устройства. Чтобы отнять доступ у клиентов, выполните раздел 15.
За дополнительной информацией можно обратиться к официальной документации OpenVPN.
Tags: OpenVPN, Ubuntu, Ubuntu 20.04, VPN