D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Виртуальная частная сеть (VPN) позволяет вам получать доступ к Интернету, скрывая свое местоположение, что дает вам свободу безопасного доступа к Интернету в ненадежных сетях и обхода географических ограничений и цензуры. OpenVPN — это VPN-решение с открытым исходным кодом Transport Layer Security (TLS) для достижения этой цели.
В нашем руководстве мы установим OpenVPN на сервер Debian 12 и настроим его для доступа с клиентского компьютера, а также создадим VPN-соединение между ними для перенаправления всего трафика от клиента через сервер OpenVPN.
Требования
- Сервер под управлением Debian 12, поддерживающий соединения IPv4 и IPv6. Мы будем называть его сервером OpenVPN. На нем включен и работает несложный брандмауэр (UFW).
- Сервер под управлением Debian 12, поддерживающий соединения IPv4 и IPv6. Мы настроим его как частный центр сертификации (CA), который мы будем называть сервером CA.
- Пользователь без прав root с привилегиями sudo как на OpenVPN, так и на сервере CA.
- Клиентская машина для подключения к серверу OpenVPN. Вы можете использовать локальное устройство в качестве клиентской машины. У OpenVPN есть клиенты для Windows, Linux, macOS, Android и iOS. Вы можете использовать любой из них для подключения. Для руководства мы будем использовать клиентский ПК Debian 12.
- Все обновлено на OpenVPN и сервере CA.
# обновляем репы
apt update
# обновляем систему
apt upgrade
# ставим судо для удобства
apt install sudo
[Шаг 1 — Настройка сервера CA]
Центр сертификации (CA) — это организация, ответственная за выпуск цифровых сертификатов для проверки личности в Интернете. В этом руководстве мы будем использовать автономный сервер в качестве частного сервера CA, который будет проверять сертификаты сервера OpenVPN и клиента. Ваш сервер CA не должен запускать никаких других служб, кроме импорта, подписи и проверки сертификатов.
Шаг 1.1 — Установка Easy-RSA
Первым шагом является установка набора скриптов easy-rsa. Easy-rsa — это инструмент управления центром сертификации, используемый для генерации закрытого ключа и открытого корневого сертификата.
# ставим тулзы
sudo apt install easy-rsa -y
Шаг 1.2 — Создание каталога инфраструктуры открытых ключей
Следующим шагом является создание каркаса инфраструктуры открытых ключей (PKI) на сервере CA.
# создаем каталог
mkdir /root/easy-rsa
Создайте символические ссылки, указывающие на установленные easy-rsa файлы пакета.
# создадим символическую ссылку
ln -s /usr/share/easy-rsa/* /root/easy-rsa/
Ограничьте доступ к каталогу PKI.
# меняем права на 700
chmod 700 /root/easy-rsa/
Инициализируйте PKI.
# переходим в нужный каталог
cd /root/easy-rsa
# инициализируем pki
./easyrsa init-pki
Вы получите следующий результат.
* Notice:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /root/easy-rsa/pki
* Notice:
IMPORTANT: Easy-RSA 'vars' file has now been moved to your PKI above.
Шаг 1.3 — Создание центра сертификации
Прежде чем вы сможете создать закрытый ключ и сертификат вашего CA, вам необходимо настроить информацию об организации для него. Файл конфигурации vars уже создан в pki каталоге. Откройте его для редактирования.
# переходим в нужный каталог
cd /root/easy-rsa
# правим переменные
nano pki/vars
Найдите следующие переменные и раскомментируйте их, удалив символ решетки (#) перед ними и отредактировав, как показано ниже.
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Rostovskaya Oblast"
set_var EASYRSA_REQ_CITY "Rostov-on-Don"
set_var EASYRSA_REQ_ORG "xss.is"
set_var EASYRSA_REQ_EMAIL "yasha@xss.is"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Выполните следующую команду, чтобы создать пару корневого открытого и закрытого ключей для вашего центра сертификации.
# билдим КА
./easyrsa build-ca
Вам будет предложено ввести парольную фразу для вашей пары ключей. Выберите надежную парольную фразу и запомните ее для дальнейшего использования. Далее вам будет предложено ввести парольную фразу PEM. Вам также будет предложено указать общее имя (CN) для вашего CA. Вы можете ввести любую строку, но для простоты нажмите ENTER, чтобы принять имя по умолчанию.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Using configuration from /root/easy-rsa/pki/0317a4e9/temp.7598e8cc
Enter PEM pass phrase:
802B61D1317F0000:error:14000065:UI routines:UI_set_result_ex:result too small:../crypto/ui/ui_lib.c:888:You must type in 4 to 1024 characters
802B61D1317F0000:error:1400006B:UI routines:UI_process
rocessing error:../crypto/ui/ui_lib.c:548:while reading strings
802B61D1317F0000:error:0480006D
EM routines
EM_def_callback
roblems getting password:../crypto/pem/pem_lib.c:62:
802B61D1317F0000:error:07880109:common libcrypto routines:do_ui_passphrase:interrupted or cancelled:../crypto/passphrase.c:184:
802B61D1317F0000:error:1C80009F
rovider routines
8info_to_encp8:unable to get passphrase:../providers/implementations/encode_decode/encode_key2any.c:116:
Easy-RSA error:
Failed to build the CA
Host: nix | Linux | /bin/bash
Если вы не хотите, чтобы при каждом взаимодействии с вашим центром сертификации вам предлагалось вводить пароль, вы можете использовать следующую команду.
# выключаем пароль
/root/easy-rsa/easyrsa build-ca nopass
Это создаст два файла:
/root/easy-rsa/pki/ca.crt - это файл открытого сертификата CA. Каждому пользователю и серверу OpenVPN понадобится копия этого файла.
/root/easy-rsa/pki/private/ca.key — это закрытый ключ, используемый CA для подписи сертификатов для сервера и клиента OpenVPN. Если злоумышленник получит доступ к вашему CA и, в свою очередь, к вашему ca.key файлу, вам нужно будет уничтожить ваш CA. Вот почему ваш ca.key файл должен находиться только на вашем компьютере CA, и в идеале ваш компьютер CA должен быть отключен от сети, когда не подписывает запросы на сертификаты, в качестве дополнительной меры безопасности.
[Шаг 2 — Установка OpenVPN и Easy-RSA на сервере OpenVPN]
Войдите на свой сервер OpenVPN и установите пакеты OpenVPN и Easy-RSA.
# обновляем репы
apt update
# обновялем систему
apt upgrade
# ставим судо для удобства
apt install sudo
# ставим опенвпн и рса
sudo apt install openvpn easy-rsa -y
Создайте каталог /root/easy-rsa.
# создаем каталог для рса
mkdir /root/easy-rsa
Создайте символическую ссылку из easy-rsa скрипта, который мы установили, как на сервере CA.
# делаем символическую ссылку
ln -s /usr/share/easy-rsa/* /root/easy-rsa/
Ограничим доступ к каталогу.
# меняем права на 700
chmod 700 /root/easy-rsa
Шаг 3 — Создание PKI для сервера OpenVPN
Следующий шаг — создать каталог PKI с помощью опции init-pki. Хотя вы уже запустили эту команду на сервере CA в рамках предварительных условий, ее необходимо запустить здесь, поскольку ваш сервер OpenVPN и сервер CA имеют отдельные каталоги PKI.
# переходим в нужный каталог
cd /root/easy-rsa
# инициализируем пки
./easyrsa init-pki
PKI на сервере OpenVPN используется как централизованное место для хранения запросов на сертификаты и открытых сертификатов.
Откройте каталог /root/easy-rsa/pki/vars для хранения необходимой информации для создания PKI и откройте его для редактирования.
# правим переменные
nano pki/vars
Найдите следующие переменные и раскомментируйте их, удалив символ решетки (#) перед ними и изменив их значения, как показано ниже.
->
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
->
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Поскольку мы не используем этот сервер в качестве CA, это единственные значения, которые нам нужны. Это настраивает ваши серверы OpenVPN и CA на использование ECC, что означает, что когда клиент и сервер пытаются установить общий симметричный ключ, они используют алгоритмы эллиптических кривых для обмена. Это значительно быстрее, чем использование простого Диффи-Хеллмана с классическим алгоритмом RSA, поскольку числа намного меньше, а вычисления быстрее.
[Шаг 4 — Создание запроса сертификата сервера OpenVPN и закрытого ключа]
Перейдите в /root/easy-rsa/ каталог на сервере OpenVPN.
# переходим в нужный каталог
cd /root/easy-rsa
Следующий шаг — сгенерировать закрытый ключ и запрос на подпись сертификата (CSR) на вашем сервере OpenVPN. Запустите easy-rsa команду с gen-req опцией, за которой следует общее имя (CN) для сервера. Для нашего руководства мы будем использовать server в качестве CN для сервера OpenVPN. Мы также будем использовать опцию nopass, чтобы избежать проблем с разрешениями.
# делаем запрос
./easyrsa gen-req server nopass
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:
* Notice:
Keypair and certificate request completed. Your files are:
req: /root/easy-rsa/pki/reqs/server.req
key: /root/easy-rsa/pki/private/server.key
Это создаст закрытый ключ для сервера и файл запроса сертификата с именем server.req. Скопируйте ключ сервера в каталог /etc/openvpn/server.
# копируем закрытый ключ
sudo cp /root/easy-rsa/pki/private/server.key /etc/openvpn/server/
Запрос на подпись сертификата (CSR) теперь готов к подписанию центром сертификации.
[Шаг 5 — Подписание CSR сервера OpenVPN]
Следующий шаг — скопировать файл CSR на сервер CA для подписи. Если на ваших серверах включена аутентификация по паролю, вы можете просто использовать следующую команду для копирования файла.
# копируем файл на сервер 1.1.1.1
scp /root/easy-rsa/pki/reqs/server.req root@1.1.1.1:/tmp
Если вы не хотите использовать аутентификацию по паролю, вам необходимо сгенерировать пару ключей SSH для каждого сервера, а затем добавить открытый ключ SSH сервера OpenVPN в файл authorized_keys машины CA и наоборот.
Если вы не хотите проходить через все это, вы можете просто скопировать файлы. Откройте файл на сервере OpenVPN, скопируйте его содержимое, а затем создайте файл на сервере CA и вставьте содержимое.
Снова войдите в систему CA Server, перейдите в каталог /root/easy-rsa и импортируйте файл CSR.
# переходим в нужный каталог
cd /root/easy-rsa
# импортируем запрос
./easyrsa import-req /tmp/server.req server
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
* Notice:
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.
Подпишите запрос с помощью следующей команды. Поскольку мы подписываем CSR сервера OpenVPN, мы будем использовать его общее имя (CN).
# подписываем
./easyrsa sign-req server server
Вам будет предложено проверить, исходит ли запрос из надежного источника. Введите yes и нажмите клавишу ENTER для подтверждения.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
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 825 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details:
Далее вам будет предложено ввести парольную фразу закрытого ключа CA, которую вы установили ранее
Using configuration from /root/easy-rsa/pki/787c6c48/temp.ee62a106
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Apr 10 16:49:09 2027 GMT (825 days)
Write out database with 1 new entries
Database updated
* Notice:
Certificate created at: /root/easy-rsa/pki/issued/server.crt
Полученный сертификат содержит открытый ключ шифрования сервера OpenVPN, а также подпись сервера CA. Скопируйте сертификаты обратно на сервер OpenVPN.
# копируем файлы обратно на сервер впн
scp pki/issued/server.crt root@8.8.8.8:/tmp
scp pki/ca.crt root@8.8.8.8:/tmp
На вашем сервере OpenVPN скопируйте файлы в каталог /etc/openvpn/server.
# копируем файлы в каталог опенвпн
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
[Шаг 6 — Настройка криптографии OpenVPN]
Мы добавим дополнительный общий секретный ключ, который сервер и все клиенты будут использовать с директивой tls-crypt OpenVPN. Это гарантирует, что сервер OpenVPN сможет справиться с неаутентифицированным трафиком, сканированием портов и атаками типа "отказ в обслуживании". Это также усложнит идентификацию сетевого трафика OpenVPN.
Перейдите в каталог /root/easy-rsa.
# переходим в нужный каталог
cd /root/easy-rsa
Создайте надежный ключ Диффи-Хеллмана для использования во время обмена ключами с помощью следующей команды.
# создаем ключ ДХ
./easyrsa gen-dh
Сгенерируйте предварительный tls-crypt ключ. Это создаст файл с именем ta.key
# генерируем ключ
sudo openvpn --genkey secret ta.key
Скопируйте ta.key в каталог /etc/openvpn/server.
# копируем ключи в каталог опенвпн
sudo cp ta.key /etc/openvpn/server
sudo cp pki/dh.pem /etc/openvpn/server
[Шаг 7 — Создание клиентского сертификата и пары ключей]
Создайте каталог на вашем VPN-сервере для хранения клиентского сертификата и файлов ключей.
# создаем каталог для ключей
mkdir -p /root/client-configs/keys
Ограничьте права доступа к каталогу, чтобы защитить его.
# меняем права на 700
chmod -R 700 /root/client-configs
Далее переключитесь в каталог /root/easy-rsa.
# переходим в каталог
cd /root/easy-rsa
Сгенерируйте клиентский ключ client1 с Common Name для клиента. Вы можете использовать любой CN для клиента.
# генерируем клиентский ключ
./easyrsa gen-req client1 nopass
Нажмите, ENTER чтобы подтвердить Common Name. Вы получите следующий вывод.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [client1]:
* Notice:
Keypair and certificate request completed. Your files are:
req: /root/easy-rsa/pki/reqs/client1.req
key: /root/easy-rsa/pki/private/client1.key
Далее скопируйте файл client1.key файл в каталог /root/client-configs/keys.
# копируем ключ в папку клиентов
cp pki/private/client1.key /root/client-configs/keys/
Передайте файл client1.req на сервер CA.
# копируем файл на сервер 1.1.1.1
scp pki/reqs/client1.req root@1.1.1.1:/tmp
Снова войдите на сервер CA и импортируйте запрос сервера.
# переходим в каталог
cd /root/easy-rsa
# Импортируем запрос
./easyrsa import-req /tmp/client1.req client1
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
* Notice:
The request has been successfully imported with a short name of: client1
You may now use this name to perform signing operations on this request.
Подпишите запрос, используя следующую команду. Мы используем client в качестве типа запроса.
# подписываем
./easyrsa sign-req client client1
При появлении соответствующего запроса нажмите yes чтобы подтвердить подписание запроса и убедиться, что он поступил из надежного источника.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
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 client certificate for 825 days:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Вам будет предложено ввести парольную фразу CA.
Using configuration from /root/easy-rsa/pki/8d3a02ae/temp.53b43101
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until Apr 10 17:09:50 2027 GMT (825 days)
Write out database with 1 new entries
Database updated
* Notice:
Certificate created at: /root/easy-rsa/pki/issued/client1.crt
Перенесите созданный сертификат обратно на сервер OpenVPN.
# копируем обратно на сервер впн
scp pki/issued/client1.crt root@8.8.8.8:/tmp
На сервере OpenVPN скопируйте клиентский сертификат в каталог /root/client-configs/keys.
# копируем сертификат
cp /tmp/client1.crt /root/client-configs/keys/
Скопируйте файлы ca.crt и ta.key в каталог /root/client-configs/keys и установите соответствующие разрешения для вашего текущего сервера.
# копируем файлы
sudo cp /root/easy-rsa/ta.key /root/client-configs/keys/
# копируем файлы
sudo cp /etc/openvpn/server/ca.crt /root/client-configs/keys/
# меняем права
sudo chown root:root /root/client-configs/keys/*
[Шаг 8 — Настройка OpenVPN]
Скопируйте пример файла server.conf в качестве отправной точки для настройки OpenVPN.
# копируем образец сервера
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
Откройте файл для редактирования.
# открываем на редактирование
sudo nano /etc/openvpn/server/server.conf
Найдите раздел HMAC файла, найдя директиву tls-auth. Закомментируйте строку, добавив точку с запятой (
в начале строки. Добавьте новую строку под ней, как показано.
;tls-auth ta.key 0 # Этот файл секретный
tls-crypt ta.key
Далее измените значение криптографического шифра, найдя строки cipher. Значение по умолчанию установлено на AES-256-CBC. Закомментируйте значение по умолчанию и добавьте еще одну строку с AES-256-GCM шифрованием, которое обеспечивает лучший уровень шифрования и производительности, как показано.
;cipher AES-256-CBC
cipher AES-256-GCM
Ниже добавьте директиву auth для выбора алгоритма дайджеста сообщений HMAC.
auth SHA256
Поскольку мы используем эллиптическое шифрование, нам нужно отключить шифрование Диффи-Хеллмана. Закомментируйте строку dh dh2048.pem и добавьте dh none ниже нее.
;dh dh2048.pem
dh none
OpenVPN должен работать без привилегий после запуска. Чтобы включить это, найдите и раскомментируйте строки ;user openvpn и ;group openvpn и измените их, как показано.
user nobody
group nogroup
Перенаправить весь трафик через VPN
Настройки выше создают VPN-соединение между клиентом и сервером, но не заставляют никакие соединения использовать туннель. Для этого начните с поиска строки "redirect-gateway def1 bypass-dhcp". Эта строка сообщает клиенту о необходимости перенаправить весь свой трафик через сервер OpenVPN. Раскомментируйте строку, чтобы включить эту функциональность.
push "redirect-gateway def1 bypass-dhcp"
Найдите раздел dhcp-option ниже этой строки. Удалите точку с запятой из начала обеих строк. Это сообщает клиенту о необходимости использовать резолверы OpenDNS.
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Изменить порт и протокол
OpenVPN использует порт 1194 и протокол UDP по умолчанию для приема клиентских подключений. Вы можете изменить порт в зависимости от ваших потребностей. Если вы не размещаете веб-контент на своем сервере OpenVPN, вы можете использовать порт 4433.
Найдите строку port 1194 и измените ее значение.
# Optional!
port 4433
Найдите строку proto udp строку и закомментируйте ее, добавив точку с запятой перед ней. И раскомментируйте строку, proto tcp удалив точку с запятой, как показано.
proto tcp
;proto udp
Поскольку мы используем протокол TCP, нам необходимо изменить значение директивы explicit-exit-notify с 1 на 0, так как эта директива используется только UDP.
explicit-exit-notify 0
Укажите нестандартные учетные данные
Если вы выбрали другое имя во время команды ./easy-rsa gen-req server ранее, вам нужно изменить строки cert и key так, чтобы они указывали на соответствующие файлы .crt и .key. Поскольку мы используем имя server по умолчанию, значение по умолчанию является правильным.
cert server.crt
key server.key
После завершения сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
[Шаг 9 — Настройте сетевую конфигурацию сервера OpenVPN]
Следующий шаг — настроить сетевую конфигурацию сервера, чтобы OpenVPN мог правильно маршрутизировать трафик. Первое, что нам нужно настроить — это переадресация портов.
Откройте файл /etc/sysctl.conf для редактирования.
# открываем на правку
sudo nano /etc/sysctl.conf
Добавьте следующую строку в конец файла.
net.ipv4.ip_forward = 1
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Чтобы прочитать файл и загрузить новые значения для текущего сеанса, используйте следующую команду.
# перечитаем
sudo sysctl -p
Эта конфигурация будет направлять весь веб-трафик от вашего клиента через IP-адрес вашего сервера, а публичный IP-адрес вашего клиента будет фактически скрыт.
[Шаг 10 — Настройка брандмауэра]
Чтобы разрешить OpenVPN проходить через брандмауэр, необходимо включить маскарадинг — концепцию iptables, которая обеспечивает динамическую трансляцию сетевых адресов (NAT) "на лету" для правильной маршрутизации клиентских подключений.
Прежде чем открывать файл конфигурации брандмауэра для добавления правил маскарадинга, сначала найдите публичный сетевой интерфейс вашего компьютера с помощью следующей команды.
# смотрим маршрут
ip route list default
Вы получите аналогичный результат.
default via 10.0.0.1 dev ens3 onlink
Это говорит нам, что имя интерфейса — ens3. Откройте /etc/ufw/before.rulesфайл для редактирования.
# сначала стави фаер
sudo apt install ufw -y
# открываем на правку правила
sudo nano /etc/ufw/before.rules
Эти правила считываются и применяются до загрузки обычных правил UFW. Добавьте следующие строки в начало файла, как показано.
*nat
OSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE
COMMIT
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Далее нам нужно настроить UFW, чтобы разрешить пересылаемые пакеты по умолчанию. Откройте файл /etc/default/ufw для редактирования.
# открываем для правки
sudo nano /etc/default/ufw
Найдите директиву DEFAULT_FORWARD_POLICY и измените ее значение с DROP на ACCEPT.
DEFAULT_FORWARD_POLICY="ACCEPT"
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
И, наконец, откройте порт 4433, который вы ранее настроили для сервера OpenVPN.
sudo ufw allow 22/tcp
sudo ufw allow 4433/tcp
Отключите и включите брандмауэр, чтобы применить новую конфигурацию.
sudo ufw disable
sudo ufw enable
[Шаг 11 — Запускаем OpenVPN]
Запустите службу 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; disabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Mon 2025-01-06 11:02:39 MSK; 175ms ago
Docs: man
penvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Process: 7295 ExecStart=/usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --conf>
Main PID: 7295 (code=exited, status=1/FAILURE)
Status: "Pre-connection initialization successful"
CPU: 35ms
Включите запуск службы OpenVPN при загрузке.
# добавляем в автозапуск впн
sudo systemctl -f enable openvpn-server@server.service
[Шаг 12 — Создание конфигурации клиента]
Перед тестированием клиента нам необходимо создать файлы конфигурации для клиента, который мы будем использовать. Создайте каталог для хранения файлов конфигурации клиента.
# создаем папку для клиентских конфигов
mkdir -p /root/client-configs/files
Скопируйте пример файла конфигурации клиента в каталог.
# копируем пример конфига
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /root/client-configs/base.conf
Откройте файл конфигурации для редактирования.
# редачим файл
nano /root/client-configs/base.conf
Найдите директиву remote и установите ее так, чтобы она указывала на публичный IP-адрес вашего сервера OpenVPN. Также измените порт, чтобы он соответствовал выбранному вами ранее порту.
# айпи сервера
remote 8.8.8.8 4433
Установите выбранный ранее протокол, раскомментировав его и закомментировав настройку proto udp.
# порт сервера
proto tcp
Раскомментируйте директивы user и group, удалив точку с запятой перед ними. Также измените значения следующим образом.
# права
user nobody
group nogroup
Найдите директивы ca, cert и key и закомментируйте их, поставив перед ними точку с запятой. Это потому, что мы добавим сертификаты и ключи в файл конфигурации клиента.
#
;ca ca.crt
;cert client.crt
;key client.key
Закомментируйте директиву tls-auth , так как мы добавим ta.key непосредственно в файл конфигурации клиента.
#
;tls-auth ta.key 1
Соответствуйте настройке cipher, которую вы установили в файле "/etc/openvpn/server/server.conf". Также добавьте настройку auth в конец файла.
cipher AES-256-GCM
auth SHA256
Добавьте директиву key-direction и задайте её 1 для корректной работы VPN.
key-direction 1
Далее добавьте несколько закомментированных строк для обработки различных методов, используемых VPN-клиентами для разрешения DNS. Добавьте следующий набор строк для клиентов, которые не используют systemd-resolved но полагаются на утилиту resolvconf для управления DNS.
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Добавьте следующий набор строк для клиентов, использующих systemd-resolved DNS-разрешение.
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Создайте скрипт для компиляции базовой конфигурации с соответствующими файлами сертификата, ключа и шифрования, а затем скопируйте сгенерированный файл конфигурации в каталог /root/client-configs/files.
Создайте и откройте файл make_config.sh в каталоге /root/client-configs.
# правим файл
nano /root/client-configs/make_config.sh
Вставьте в него следующий код.
#!/bin/bash
KEY_DIR=/root/client-configs/keys
OUTPUT_DIR=/root/client-configs/files
BASE_CONFIG=/root/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
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Сделайте файл исполняемым и ограничьте права доступа к нему.
# Меняем права
chmod 700 /root/client-configs/make_config.sh
Этот скрипт делает копию файла base.conf, собирает все файлы сертификатов и ключей, извлекает их содержимое, добавляет их в базовый файл конфигурации и экспортирует все это для создания нового файла конфигурации клиента. Каждый раз, когда вы добавляете нового клиента, вам нужно сгенерировать для него новые ключи и сертификаты, а затем запустить этот скрипт для создания файла конфигурации клиента.
Мы уже создали файлы клиентского сертификата и ключей на шаге 7. Давайте создадим для них файл конфигурации.
Перейдите в каталог /root/client-configs.
# идем в нужный каталог
cd /root/client-configs
Запустите скрипт для создания файла конфигурации клиента.
# запускам скрипт
./make_config.sh client1
Это создаст файл с именем client1.ovpn. Измените параметр, если вы хотите другое имя файла. Проверьте содержимое каталога.
# смотрим файлы
ls /root/client-configs/files
Это файл конфигурации, который вам нужно передать клиенту, который затем будет использоваться для подключения к серверу OpenVPN. Вы можете использовать любой протокол/программу SFTP для передачи файла клиенту.
[Шаг 13 — Установка и тестирование клиентского соединения]
Для нашего руководства мы используем клиентскую машину Debian 12. Установите OpenVPN с помощью следующей команды.
# обновляем репы
apt update
# обновляем систему
apt upgrade
# ставим судо для удобства
apt install sudo
# ставим впн на клиенте
sudo apt install openvpn -y
Проверьте, использует ли ваша система systemd-resolved управление DNS-запросами, выполнив следующую команду.
# смотрим днс
cat /etc/resolv.conf
Если система использует systemd-resolved, то IP-адрес выше будет 127.0.0.53. Кроме того, комментарий в верхней части файла подтвердит то же самое. Если IP-адрес отличается от 127.0.0.53, то система не использует systemd-resolved, и вам нужно выполнить шаги, указанные ниже.
Но сначала загрузите файл client1.ovpn с сервера с помощью следующей команды.
# копируем файл с сервера себе на клиента
scp root@8.8.8.8:/root/client-configs/files/client1.ovpn /tmp
===
Для клиентов с systemd-resolved
Установите пакет openvpn-systemd-resolved, содержащий скрипты, принудительно использующие systemd-resolved VPN-сервер для DNS.
# ставим пакеты
sudo apt install openvpn-systemd-resolved -y
Откройте файл конфигурации клиента для редактирования.
# редачим
nano /tmp/client1.ovpn
Раскомментируйте следующие строки в файле, удалив точку с запятой перед ними.
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
===
Для клиентов с update-resolv-conf
Это шаг, который вам нужно использовать, если у вас система Debian. Во-первых, убедитесь, что ваш дистрибутив использует update-resolv-conf.
# смотрим файлы
ls /etc/openvpn
Если в вашей системе есть этот update-resolv-conf файл, откройте файл конфигурации клиента для редактирования.
# снова редачим
nano /tmp/client1.ovpn
Раскомментируйте следующие строки в файле, удалив точку с запятой перед ними.
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Если вы используете дистрибутив на базе CentOS, измените директиву group с nogroup на nobody.
group nobody
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Подключение клиента
Выполните следующую команду для подключения клиента к VPN-серверу.
sudo openvpn --config /tmp/client1.ovpn
2023-08-08 16:23:29 Note: Kernel support for ovpn-dco missing, disabling data channel offload.
2023-08-08 16:23:29 OpenVPN 2.6.3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
2023-08-08 16:23:29 library versions: OpenSSL 3.0.9 30 May 2023, LZO 2.10
2023-08-08 16:23:29 DCO version: N/A
2023-08-08 16:23:29 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
2023-08-08 16:23:29 TCP/UDP: Preserving recently used remote address: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-08-08 16:23:29 Attempting to establish TCP connection with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCP connection established with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCPv4_CLIENT link local: (not bound)
2023-08-08 16:23:29 TCPv4_CLIENT link remote: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-08-08 16:23:29 TLS: Initial packet from [AF_INET]69.28.91.204:443, sid=6bd67e12 50ebf8bc
2023-08-08 16:23:30 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-08-08 16:23:30 VERIFY KU OK
2023-08-08 16:23:30 Validating certificate extended key usage
2023-08-08 16:23:30 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-08-08 16:23:30 VERIFY EKU OK
2023-08-08 16:23:30 VERIFY OK: depth=0, CN=server
2023-08-08 16:23:30 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 384 bit ECsecp384r1, signature: ecdsa-with-SHA512
2023-08-08 16:23:30 [server] Peer Connection Initiated with [AF_INET]69.28.91.204:443
2023-08-08 16:23:30 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1
2023-08-08 16:23:30 TLS: tls_multi_process: initial untrusted session promoted to trusted
2023-08-08 16:23:31 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
2023-08-08 16:23:31 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM,protocol-flags cc-exit tls-ekm dyn-tls-crypt,tun-mtu 1500'
2023-08-08 16:23:31 OPTIONS IMPORT: --ifconfig/up options modified
2023-08-08 16:23:31 OPTIONS IMPORT: route options modified
2023-08-08 16:23:31 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-08-08 16:23:31 OPTIONS IMPORT: tun-mtu set to 1500
2023-08-08 16:23:31 net_route_v4_best_gw query: dst 0.0.0.0
2023-08-08 16:23:31 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-08-08 16:23:31 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:b7:cc:29
2023-08-08 16:23:31 TUN/TAP device tun0 opened
2023-08-08 16:23:31 net_iface_mtu_set: mtu 1500 for tun0
2023-08-08 16:23:31 net_iface_up: set tun0 up
2023-08-08 16:23:31 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-08-08 16:23:31 /etc/openvpn/update-resolv-conf tun0 1500 0 10.8.0.6 10.8.0.5 init
2023-08-08 16:23:31 net_route_v4_add: 69.28.91.204/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 UID set to nobody
2023-08-08 16:23:31 GID set to nogroup
2023-08-08 16:23:31 Capabilities retained: CAP_NET_ADMIN
2023-08-08 16:23:31 Initialization Sequence Completed
2023-08-08 16:23:31 Data Channel: cipher 'AES-256-GCM', peer-id: 0
2023-08-08 16:23:31 Timers: ping 10, ping-restart 120
2023-08-08 16:23:31 Protocol options: protocol-flags cc-exit tls-ekm dyn-tls-crypt
Вы можете проверить соединение, выполнив curl ident.me в своем браузере, и вы увидите свой IP-адрес и местоположение вашего сервера OpenVPN.
# ставим курл
apt install curl -y
# делаем запрос на сервер
curl ident.me
Проверить сайт на утечку айпи можно здесь - https://www.dnsleaktest.com/
Приведенная выше команда запускает OpenVPN на переднем плане, что означает, что терминал будет заблокирован. Чтобы закрыть соединение, вам нужно нажать Ctrl + C. Однако вы можете запустить OpenVPN и в фоновом режиме. Используйте следующую команду, чтобы сделать это.
# запускаем в фоновом режиме
sudo openvpn --config client1.ovpn --daemon
Чтобы завершить соединение, найдите идентификатор процесса.
# ищем процесс
ps aux | grep openvpn
nobody 1819 0.1 0.3 13316 7860 ? Ss 16:18 0:00 openvpn --config /tmp/client1.ovpn --daemon
root 1833 0.0 0.1 6332 2144 pts/0 S+ 16:18 0:00 grep openvpn
Как вы видите, идентификатор процесса, соответствующий процессу OpenVPN — 1819. Завершите VPN-подключение с помощью следующей команды, чтобы завершить процесс.
# завершаем процесс
sudo kill -9 1819
OpenVPN предлагает графические клиенты для платформ Windows, macOS, Android и iOS, куда вы можете импортировать файл конфигурации клиента для подключения.
[Шаг 14 — Отзыв клиентских сертификатов]
Если вы хотите отозвать сертификат клиента, чтобы предотвратить доступ, вы можете сделать это, войдя на сервер CA.
Перейдите в каталог /root/easy-rsa.
# идем в нужный каталог
cd /root/easy-rsa
Запустите скрипт с опцией revoke, за которой следует имя клиента.
# отзываем клиента
./easyrsa revoke client1
Вам будет предложено отозвать сертификат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Please confirm you wish to revoke the certificate
with the following subject:
subject=
commonName = client1
serial-number: 940E2BF50BA5C75649EF18F7969FDE4A
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
Если ваш закрытый ключ CA защищен парольной фразой, введите ее при появлении соответствующего запроса.
Using configuration from /root/easy-rsa/pki/2f7d3491/temp.36ca6058
Revoking Certificate 940E2BF50BA5C75649EF18F7969FDE4A.
Database updated
* Notice:
IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
Это отзывет сертификат на сервере CA. Однако сервер OpenVPN не имеет возможности проверить статус отзыва. Для этого нам нужно сгенерировать список отзыва сертификатов (CRL) и передать его на сервер OpenVPN.
Сгенерируйте CRL.
# генерируем для отзыва
./easyrsa gen-crl
Вам будет предложено ввести парольную фразу CA. Приведенная выше команда генерирует файл crl.pem.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Using configuration from /root/easy-rsa/pki/e39ca1a2/temp.e63e54d4
* Notice:
An updated CRL has been created.
CRL file: /root/easy-rsa/pki/crl.pem
Скопируйте этот файл на сервер OpenVPN.
# копируем крл на сервер
scp /root/easy-rsa/pki/crl.pem root@8.8.8.8:/tmp
Снова войдите на сервер OpenVPN и скопируйте файл CRL в каталог /etc/openvpn/server.
# копируем крл в папку
sudo cp /tmp/crl.pem /etc/openvpn/server/
Откройте файл конфигурации сервера OpenVPN для редактирования.
# открываем на редактиирование
sudo nano /etc/openvpn/server/server.conf
Добавьте следующую строку в конец файла. Это дает указание серверу OpenVPN проверить список отзыва на наличие клиентов, которые были ограничены.
crl-verify crl.pem
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Перезапустите сервер OpenVPN, чтобы изменения вступили в силу.
# перегружаем сервис
sudo systemctl restart openvpn-server@server.service
Клиент больше не может подключиться к серверу OpenVPN.
Заключение
На этом завершается наше руководство по установке и настройке сервера OpenVPN на сервере Debian 12.
В нашем руководстве мы установим OpenVPN на сервер Debian 12 и настроим его для доступа с клиентского компьютера, а также создадим VPN-соединение между ними для перенаправления всего трафика от клиента через сервер OpenVPN.
Требования
- Сервер под управлением Debian 12, поддерживающий соединения IPv4 и IPv6. Мы будем называть его сервером OpenVPN. На нем включен и работает несложный брандмауэр (UFW).
- Сервер под управлением Debian 12, поддерживающий соединения IPv4 и IPv6. Мы настроим его как частный центр сертификации (CA), который мы будем называть сервером CA.
- Пользователь без прав root с привилегиями sudo как на OpenVPN, так и на сервере CA.
- Клиентская машина для подключения к серверу OpenVPN. Вы можете использовать локальное устройство в качестве клиентской машины. У OpenVPN есть клиенты для Windows, Linux, macOS, Android и iOS. Вы можете использовать любой из них для подключения. Для руководства мы будем использовать клиентский ПК Debian 12.
- Все обновлено на OpenVPN и сервере CA.
# обновляем репы
apt update
# обновляем систему
apt upgrade
# ставим судо для удобства
apt install sudo
[Шаг 1 — Настройка сервера CA]
Центр сертификации (CA) — это организация, ответственная за выпуск цифровых сертификатов для проверки личности в Интернете. В этом руководстве мы будем использовать автономный сервер в качестве частного сервера CA, который будет проверять сертификаты сервера OpenVPN и клиента. Ваш сервер CA не должен запускать никаких других служб, кроме импорта, подписи и проверки сертификатов.
Шаг 1.1 — Установка Easy-RSA
Первым шагом является установка набора скриптов easy-rsa. Easy-rsa — это инструмент управления центром сертификации, используемый для генерации закрытого ключа и открытого корневого сертификата.
# ставим тулзы
sudo apt install easy-rsa -y
Шаг 1.2 — Создание каталога инфраструктуры открытых ключей
Следующим шагом является создание каркаса инфраструктуры открытых ключей (PKI) на сервере CA.
# создаем каталог
mkdir /root/easy-rsa
Создайте символические ссылки, указывающие на установленные easy-rsa файлы пакета.
# создадим символическую ссылку
ln -s /usr/share/easy-rsa/* /root/easy-rsa/
Ограничьте доступ к каталогу PKI.
# меняем права на 700
chmod 700 /root/easy-rsa/
Инициализируйте PKI.
# переходим в нужный каталог
cd /root/easy-rsa
# инициализируем pki
./easyrsa init-pki
Вы получите следующий результат.
* Notice:
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /root/easy-rsa/pki
* Notice:
IMPORTANT: Easy-RSA 'vars' file has now been moved to your PKI above.
Шаг 1.3 — Создание центра сертификации
Прежде чем вы сможете создать закрытый ключ и сертификат вашего CA, вам необходимо настроить информацию об организации для него. Файл конфигурации vars уже создан в pki каталоге. Откройте его для редактирования.
# переходим в нужный каталог
cd /root/easy-rsa
# правим переменные
nano pki/vars
Найдите следующие переменные и раскомментируйте их, удалив символ решетки (#) перед ними и отредактировав, как показано ниже.
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Rostovskaya Oblast"
set_var EASYRSA_REQ_CITY "Rostov-on-Don"
set_var EASYRSA_REQ_ORG "xss.is"
set_var EASYRSA_REQ_EMAIL "yasha@xss.is"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Выполните следующую команду, чтобы создать пару корневого открытого и закрытого ключей для вашего центра сертификации.
# билдим КА
./easyrsa build-ca
Вам будет предложено ввести парольную фразу для вашей пары ключей. Выберите надежную парольную фразу и запомните ее для дальнейшего использования. Далее вам будет предложено ввести парольную фразу PEM. Вам также будет предложено указать общее имя (CN) для вашего CA. Вы можете ввести любую строку, но для простоты нажмите ENTER, чтобы принять имя по умолчанию.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Using configuration from /root/easy-rsa/pki/0317a4e9/temp.7598e8cc
Enter PEM pass phrase:
802B61D1317F0000:error:14000065:UI routines:UI_set_result_ex:result too small:../crypto/ui/ui_lib.c:888:You must type in 4 to 1024 characters
802B61D1317F0000:error:1400006B:UI routines:UI_process
802B61D1317F0000:error:0480006D
802B61D1317F0000:error:07880109:common libcrypto routines:do_ui_passphrase:interrupted or cancelled:../crypto/passphrase.c:184:
802B61D1317F0000:error:1C80009F
Easy-RSA error:
Failed to build the CA
Host: nix | Linux | /bin/bash
Если вы не хотите, чтобы при каждом взаимодействии с вашим центром сертификации вам предлагалось вводить пароль, вы можете использовать следующую команду.
# выключаем пароль
/root/easy-rsa/easyrsa build-ca nopass
Это создаст два файла:
/root/easy-rsa/pki/ca.crt - это файл открытого сертификата CA. Каждому пользователю и серверу OpenVPN понадобится копия этого файла.
/root/easy-rsa/pki/private/ca.key — это закрытый ключ, используемый CA для подписи сертификатов для сервера и клиента OpenVPN. Если злоумышленник получит доступ к вашему CA и, в свою очередь, к вашему ca.key файлу, вам нужно будет уничтожить ваш CA. Вот почему ваш ca.key файл должен находиться только на вашем компьютере CA, и в идеале ваш компьютер CA должен быть отключен от сети, когда не подписывает запросы на сертификаты, в качестве дополнительной меры безопасности.
[Шаг 2 — Установка OpenVPN и Easy-RSA на сервере OpenVPN]
Войдите на свой сервер OpenVPN и установите пакеты OpenVPN и Easy-RSA.
# обновляем репы
apt update
# обновялем систему
apt upgrade
# ставим судо для удобства
apt install sudo
# ставим опенвпн и рса
sudo apt install openvpn easy-rsa -y
Создайте каталог /root/easy-rsa.
# создаем каталог для рса
mkdir /root/easy-rsa
Создайте символическую ссылку из easy-rsa скрипта, который мы установили, как на сервере CA.
# делаем символическую ссылку
ln -s /usr/share/easy-rsa/* /root/easy-rsa/
Ограничим доступ к каталогу.
# меняем права на 700
chmod 700 /root/easy-rsa
Шаг 3 — Создание PKI для сервера OpenVPN
Следующий шаг — создать каталог PKI с помощью опции init-pki. Хотя вы уже запустили эту команду на сервере CA в рамках предварительных условий, ее необходимо запустить здесь, поскольку ваш сервер OpenVPN и сервер CA имеют отдельные каталоги PKI.
# переходим в нужный каталог
cd /root/easy-rsa
# инициализируем пки
./easyrsa init-pki
PKI на сервере OpenVPN используется как централизованное место для хранения запросов на сертификаты и открытых сертификатов.
Откройте каталог /root/easy-rsa/pki/vars для хранения необходимой информации для создания PKI и откройте его для редактирования.
# правим переменные
nano pki/vars
Найдите следующие переменные и раскомментируйте их, удалив символ решетки (#) перед ними и изменив их значения, как показано ниже.
->
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
->
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Поскольку мы не используем этот сервер в качестве CA, это единственные значения, которые нам нужны. Это настраивает ваши серверы OpenVPN и CA на использование ECC, что означает, что когда клиент и сервер пытаются установить общий симметричный ключ, они используют алгоритмы эллиптических кривых для обмена. Это значительно быстрее, чем использование простого Диффи-Хеллмана с классическим алгоритмом RSA, поскольку числа намного меньше, а вычисления быстрее.
[Шаг 4 — Создание запроса сертификата сервера OpenVPN и закрытого ключа]
Перейдите в /root/easy-rsa/ каталог на сервере OpenVPN.
# переходим в нужный каталог
cd /root/easy-rsa
Следующий шаг — сгенерировать закрытый ключ и запрос на подпись сертификата (CSR) на вашем сервере OpenVPN. Запустите easy-rsa команду с gen-req опцией, за которой следует общее имя (CN) для сервера. Для нашего руководства мы будем использовать server в качестве CN для сервера OpenVPN. Мы также будем использовать опцию nopass, чтобы избежать проблем с разрешениями.
# делаем запрос
./easyrsa gen-req server nopass
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:
* Notice:
Keypair and certificate request completed. Your files are:
req: /root/easy-rsa/pki/reqs/server.req
key: /root/easy-rsa/pki/private/server.key
Это создаст закрытый ключ для сервера и файл запроса сертификата с именем server.req. Скопируйте ключ сервера в каталог /etc/openvpn/server.
# копируем закрытый ключ
sudo cp /root/easy-rsa/pki/private/server.key /etc/openvpn/server/
Запрос на подпись сертификата (CSR) теперь готов к подписанию центром сертификации.
[Шаг 5 — Подписание CSR сервера OpenVPN]
Следующий шаг — скопировать файл CSR на сервер CA для подписи. Если на ваших серверах включена аутентификация по паролю, вы можете просто использовать следующую команду для копирования файла.
# копируем файл на сервер 1.1.1.1
scp /root/easy-rsa/pki/reqs/server.req root@1.1.1.1:/tmp
Если вы не хотите использовать аутентификацию по паролю, вам необходимо сгенерировать пару ключей SSH для каждого сервера, а затем добавить открытый ключ SSH сервера OpenVPN в файл authorized_keys машины CA и наоборот.
Если вы не хотите проходить через все это, вы можете просто скопировать файлы. Откройте файл на сервере OpenVPN, скопируйте его содержимое, а затем создайте файл на сервере CA и вставьте содержимое.
Снова войдите в систему CA Server, перейдите в каталог /root/easy-rsa и импортируйте файл CSR.
# переходим в нужный каталог
cd /root/easy-rsa
# импортируем запрос
./easyrsa import-req /tmp/server.req server
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
* Notice:
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.
Подпишите запрос с помощью следующей команды. Поскольку мы подписываем CSR сервера OpenVPN, мы будем использовать его общее имя (CN).
# подписываем
./easyrsa sign-req server server
Вам будет предложено проверить, исходит ли запрос из надежного источника. Введите yes и нажмите клавишу ENTER для подтверждения.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
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 825 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details:
Далее вам будет предложено ввести парольную фразу закрытого ключа CA, которую вы установили ранее
Using configuration from /root/easy-rsa/pki/787c6c48/temp.ee62a106
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Apr 10 16:49:09 2027 GMT (825 days)
Write out database with 1 new entries
Database updated
* Notice:
Certificate created at: /root/easy-rsa/pki/issued/server.crt
Полученный сертификат содержит открытый ключ шифрования сервера OpenVPN, а также подпись сервера CA. Скопируйте сертификаты обратно на сервер OpenVPN.
# копируем файлы обратно на сервер впн
scp pki/issued/server.crt root@8.8.8.8:/tmp
scp pki/ca.crt root@8.8.8.8:/tmp
На вашем сервере OpenVPN скопируйте файлы в каталог /etc/openvpn/server.
# копируем файлы в каталог опенвпн
sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
[Шаг 6 — Настройка криптографии OpenVPN]
Мы добавим дополнительный общий секретный ключ, который сервер и все клиенты будут использовать с директивой tls-crypt OpenVPN. Это гарантирует, что сервер OpenVPN сможет справиться с неаутентифицированным трафиком, сканированием портов и атаками типа "отказ в обслуживании". Это также усложнит идентификацию сетевого трафика OpenVPN.
Перейдите в каталог /root/easy-rsa.
# переходим в нужный каталог
cd /root/easy-rsa
Создайте надежный ключ Диффи-Хеллмана для использования во время обмена ключами с помощью следующей команды.
# создаем ключ ДХ
./easyrsa gen-dh
Сгенерируйте предварительный tls-crypt ключ. Это создаст файл с именем ta.key
# генерируем ключ
sudo openvpn --genkey secret ta.key
Скопируйте ta.key в каталог /etc/openvpn/server.
# копируем ключи в каталог опенвпн
sudo cp ta.key /etc/openvpn/server
sudo cp pki/dh.pem /etc/openvpn/server
[Шаг 7 — Создание клиентского сертификата и пары ключей]
Создайте каталог на вашем VPN-сервере для хранения клиентского сертификата и файлов ключей.
# создаем каталог для ключей
mkdir -p /root/client-configs/keys
Ограничьте права доступа к каталогу, чтобы защитить его.
# меняем права на 700
chmod -R 700 /root/client-configs
Далее переключитесь в каталог /root/easy-rsa.
# переходим в каталог
cd /root/easy-rsa
Сгенерируйте клиентский ключ client1 с Common Name для клиента. Вы можете использовать любой CN для клиента.
# генерируем клиентский ключ
./easyrsa gen-req client1 nopass
Нажмите, ENTER чтобы подтвердить Common Name. Вы получите следующий вывод.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [client1]:
* Notice:
Keypair and certificate request completed. Your files are:
req: /root/easy-rsa/pki/reqs/client1.req
key: /root/easy-rsa/pki/private/client1.key
Далее скопируйте файл client1.key файл в каталог /root/client-configs/keys.
# копируем ключ в папку клиентов
cp pki/private/client1.key /root/client-configs/keys/
Передайте файл client1.req на сервер CA.
# копируем файл на сервер 1.1.1.1
scp pki/reqs/client1.req root@1.1.1.1:/tmp
Снова войдите на сервер CA и импортируйте запрос сервера.
# переходим в каталог
cd /root/easy-rsa
# Импортируем запрос
./easyrsa import-req /tmp/client1.req client1
Вы получите следующий результат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
* Notice:
The request has been successfully imported with a short name of: client1
You may now use this name to perform signing operations on this request.
Подпишите запрос, используя следующую команду. Мы используем client в качестве типа запроса.
# подписываем
./easyrsa sign-req client client1
При появлении соответствующего запроса нажмите yes чтобы подтвердить подписание запроса и убедиться, что он поступил из надежного источника.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
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 client certificate for 825 days:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Вам будет предложено ввести парольную фразу CA.
Using configuration from /root/easy-rsa/pki/8d3a02ae/temp.53b43101
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until Apr 10 17:09:50 2027 GMT (825 days)
Write out database with 1 new entries
Database updated
* Notice:
Certificate created at: /root/easy-rsa/pki/issued/client1.crt
Перенесите созданный сертификат обратно на сервер OpenVPN.
# копируем обратно на сервер впн
scp pki/issued/client1.crt root@8.8.8.8:/tmp
На сервере OpenVPN скопируйте клиентский сертификат в каталог /root/client-configs/keys.
# копируем сертификат
cp /tmp/client1.crt /root/client-configs/keys/
Скопируйте файлы ca.crt и ta.key в каталог /root/client-configs/keys и установите соответствующие разрешения для вашего текущего сервера.
# копируем файлы
sudo cp /root/easy-rsa/ta.key /root/client-configs/keys/
# копируем файлы
sudo cp /etc/openvpn/server/ca.crt /root/client-configs/keys/
# меняем права
sudo chown root:root /root/client-configs/keys/*
[Шаг 8 — Настройка OpenVPN]
Скопируйте пример файла server.conf в качестве отправной точки для настройки OpenVPN.
# копируем образец сервера
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
Откройте файл для редактирования.
# открываем на редактирование
sudo nano /etc/openvpn/server/server.conf
Найдите раздел HMAC файла, найдя директиву tls-auth. Закомментируйте строку, добавив точку с запятой (
;tls-auth ta.key 0 # Этот файл секретный
tls-crypt ta.key
Далее измените значение криптографического шифра, найдя строки cipher. Значение по умолчанию установлено на AES-256-CBC. Закомментируйте значение по умолчанию и добавьте еще одну строку с AES-256-GCM шифрованием, которое обеспечивает лучший уровень шифрования и производительности, как показано.
;cipher AES-256-CBC
cipher AES-256-GCM
Ниже добавьте директиву auth для выбора алгоритма дайджеста сообщений HMAC.
auth SHA256
Поскольку мы используем эллиптическое шифрование, нам нужно отключить шифрование Диффи-Хеллмана. Закомментируйте строку dh dh2048.pem и добавьте dh none ниже нее.
;dh dh2048.pem
dh none
OpenVPN должен работать без привилегий после запуска. Чтобы включить это, найдите и раскомментируйте строки ;user openvpn и ;group openvpn и измените их, как показано.
user nobody
group nogroup
Перенаправить весь трафик через VPN
Настройки выше создают VPN-соединение между клиентом и сервером, но не заставляют никакие соединения использовать туннель. Для этого начните с поиска строки "redirect-gateway def1 bypass-dhcp". Эта строка сообщает клиенту о необходимости перенаправить весь свой трафик через сервер OpenVPN. Раскомментируйте строку, чтобы включить эту функциональность.
push "redirect-gateway def1 bypass-dhcp"
Найдите раздел dhcp-option ниже этой строки. Удалите точку с запятой из начала обеих строк. Это сообщает клиенту о необходимости использовать резолверы OpenDNS.
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Изменить порт и протокол
OpenVPN использует порт 1194 и протокол UDP по умолчанию для приема клиентских подключений. Вы можете изменить порт в зависимости от ваших потребностей. Если вы не размещаете веб-контент на своем сервере OpenVPN, вы можете использовать порт 4433.
Найдите строку port 1194 и измените ее значение.
# Optional!
port 4433
Найдите строку proto udp строку и закомментируйте ее, добавив точку с запятой перед ней. И раскомментируйте строку, proto tcp удалив точку с запятой, как показано.
proto tcp
;proto udp
Поскольку мы используем протокол TCP, нам необходимо изменить значение директивы explicit-exit-notify с 1 на 0, так как эта директива используется только UDP.
explicit-exit-notify 0
Укажите нестандартные учетные данные
Если вы выбрали другое имя во время команды ./easy-rsa gen-req server ранее, вам нужно изменить строки cert и key так, чтобы они указывали на соответствующие файлы .crt и .key. Поскольку мы используем имя server по умолчанию, значение по умолчанию является правильным.
cert server.crt
key server.key
После завершения сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
[Шаг 9 — Настройте сетевую конфигурацию сервера OpenVPN]
Следующий шаг — настроить сетевую конфигурацию сервера, чтобы OpenVPN мог правильно маршрутизировать трафик. Первое, что нам нужно настроить — это переадресация портов.
Откройте файл /etc/sysctl.conf для редактирования.
# открываем на правку
sudo nano /etc/sysctl.conf
Добавьте следующую строку в конец файла.
net.ipv4.ip_forward = 1
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Чтобы прочитать файл и загрузить новые значения для текущего сеанса, используйте следующую команду.
# перечитаем
sudo sysctl -p
Эта конфигурация будет направлять весь веб-трафик от вашего клиента через IP-адрес вашего сервера, а публичный IP-адрес вашего клиента будет фактически скрыт.
[Шаг 10 — Настройка брандмауэра]
Чтобы разрешить OpenVPN проходить через брандмауэр, необходимо включить маскарадинг — концепцию iptables, которая обеспечивает динамическую трансляцию сетевых адресов (NAT) "на лету" для правильной маршрутизации клиентских подключений.
Прежде чем открывать файл конфигурации брандмауэра для добавления правил маскарадинга, сначала найдите публичный сетевой интерфейс вашего компьютера с помощью следующей команды.
# смотрим маршрут
ip route list default
Вы получите аналогичный результат.
default via 10.0.0.1 dev ens3 onlink
Это говорит нам, что имя интерфейса — ens3. Откройте /etc/ufw/before.rulesфайл для редактирования.
# сначала стави фаер
sudo apt install ufw -y
# открываем на правку правила
sudo nano /etc/ufw/before.rules
Эти правила считываются и применяются до загрузки обычных правил UFW. Добавьте следующие строки в начало файла, как показано.
*nat
-A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE
COMMIT
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Далее нам нужно настроить UFW, чтобы разрешить пересылаемые пакеты по умолчанию. Откройте файл /etc/default/ufw для редактирования.
# открываем для правки
sudo nano /etc/default/ufw
Найдите директиву DEFAULT_FORWARD_POLICY и измените ее значение с DROP на ACCEPT.
DEFAULT_FORWARD_POLICY="ACCEPT"
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
И, наконец, откройте порт 4433, который вы ранее настроили для сервера OpenVPN.
sudo ufw allow 22/tcp
sudo ufw allow 4433/tcp
Отключите и включите брандмауэр, чтобы применить новую конфигурацию.
sudo ufw disable
sudo ufw enable
[Шаг 11 — Запускаем OpenVPN]
Запустите службу 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; disabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Mon 2025-01-06 11:02:39 MSK; 175ms ago
Docs: man
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Process: 7295 ExecStart=/usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --conf>
Main PID: 7295 (code=exited, status=1/FAILURE)
Status: "Pre-connection initialization successful"
CPU: 35ms
Включите запуск службы OpenVPN при загрузке.
# добавляем в автозапуск впн
sudo systemctl -f enable openvpn-server@server.service
[Шаг 12 — Создание конфигурации клиента]
Перед тестированием клиента нам необходимо создать файлы конфигурации для клиента, который мы будем использовать. Создайте каталог для хранения файлов конфигурации клиента.
# создаем папку для клиентских конфигов
mkdir -p /root/client-configs/files
Скопируйте пример файла конфигурации клиента в каталог.
# копируем пример конфига
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /root/client-configs/base.conf
Откройте файл конфигурации для редактирования.
# редачим файл
nano /root/client-configs/base.conf
Найдите директиву remote и установите ее так, чтобы она указывала на публичный IP-адрес вашего сервера OpenVPN. Также измените порт, чтобы он соответствовал выбранному вами ранее порту.
# айпи сервера
remote 8.8.8.8 4433
Установите выбранный ранее протокол, раскомментировав его и закомментировав настройку proto udp.
# порт сервера
proto tcp
Раскомментируйте директивы user и group, удалив точку с запятой перед ними. Также измените значения следующим образом.
# права
user nobody
group nogroup
Найдите директивы ca, cert и key и закомментируйте их, поставив перед ними точку с запятой. Это потому, что мы добавим сертификаты и ключи в файл конфигурации клиента.
#
;ca ca.crt
;cert client.crt
;key client.key
Закомментируйте директиву tls-auth , так как мы добавим ta.key непосредственно в файл конфигурации клиента.
#
;tls-auth ta.key 1
Соответствуйте настройке cipher, которую вы установили в файле "/etc/openvpn/server/server.conf". Также добавьте настройку auth в конец файла.
cipher AES-256-GCM
auth SHA256
Добавьте директиву key-direction и задайте её 1 для корректной работы VPN.
key-direction 1
Далее добавьте несколько закомментированных строк для обработки различных методов, используемых VPN-клиентами для разрешения DNS. Добавьте следующий набор строк для клиентов, которые не используют systemd-resolved но полагаются на утилиту resolvconf для управления DNS.
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Добавьте следующий набор строк для клиентов, использующих systemd-resolved DNS-разрешение.
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Создайте скрипт для компиляции базовой конфигурации с соответствующими файлами сертификата, ключа и шифрования, а затем скопируйте сгенерированный файл конфигурации в каталог /root/client-configs/files.
Создайте и откройте файл make_config.sh в каталоге /root/client-configs.
# правим файл
nano /root/client-configs/make_config.sh
Вставьте в него следующий код.
#!/bin/bash
KEY_DIR=/root/client-configs/keys
OUTPUT_DIR=/root/client-configs/files
BASE_CONFIG=/root/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
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Сделайте файл исполняемым и ограничьте права доступа к нему.
# Меняем права
chmod 700 /root/client-configs/make_config.sh
Этот скрипт делает копию файла base.conf, собирает все файлы сертификатов и ключей, извлекает их содержимое, добавляет их в базовый файл конфигурации и экспортирует все это для создания нового файла конфигурации клиента. Каждый раз, когда вы добавляете нового клиента, вам нужно сгенерировать для него новые ключи и сертификаты, а затем запустить этот скрипт для создания файла конфигурации клиента.
Мы уже создали файлы клиентского сертификата и ключей на шаге 7. Давайте создадим для них файл конфигурации.
Перейдите в каталог /root/client-configs.
# идем в нужный каталог
cd /root/client-configs
Запустите скрипт для создания файла конфигурации клиента.
# запускам скрипт
./make_config.sh client1
Это создаст файл с именем client1.ovpn. Измените параметр, если вы хотите другое имя файла. Проверьте содержимое каталога.
# смотрим файлы
ls /root/client-configs/files
Это файл конфигурации, который вам нужно передать клиенту, который затем будет использоваться для подключения к серверу OpenVPN. Вы можете использовать любой протокол/программу SFTP для передачи файла клиенту.
[Шаг 13 — Установка и тестирование клиентского соединения]
Для нашего руководства мы используем клиентскую машину Debian 12. Установите OpenVPN с помощью следующей команды.
# обновляем репы
apt update
# обновляем систему
apt upgrade
# ставим судо для удобства
apt install sudo
# ставим впн на клиенте
sudo apt install openvpn -y
Проверьте, использует ли ваша система systemd-resolved управление DNS-запросами, выполнив следующую команду.
# смотрим днс
cat /etc/resolv.conf
Если система использует systemd-resolved, то IP-адрес выше будет 127.0.0.53. Кроме того, комментарий в верхней части файла подтвердит то же самое. Если IP-адрес отличается от 127.0.0.53, то система не использует systemd-resolved, и вам нужно выполнить шаги, указанные ниже.
Но сначала загрузите файл client1.ovpn с сервера с помощью следующей команды.
# копируем файл с сервера себе на клиента
scp root@8.8.8.8:/root/client-configs/files/client1.ovpn /tmp
===
Для клиентов с systemd-resolved
Установите пакет openvpn-systemd-resolved, содержащий скрипты, принудительно использующие systemd-resolved VPN-сервер для DNS.
# ставим пакеты
sudo apt install openvpn-systemd-resolved -y
Откройте файл конфигурации клиента для редактирования.
# редачим
nano /tmp/client1.ovpn
Раскомментируйте следующие строки в файле, удалив точку с запятой перед ними.
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
===
Для клиентов с update-resolv-conf
Это шаг, который вам нужно использовать, если у вас система Debian. Во-первых, убедитесь, что ваш дистрибутив использует update-resolv-conf.
# смотрим файлы
ls /etc/openvpn
Если в вашей системе есть этот update-resolv-conf файл, откройте файл конфигурации клиента для редактирования.
# снова редачим
nano /tmp/client1.ovpn
Раскомментируйте следующие строки в файле, удалив точку с запятой перед ними.
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Если вы используете дистрибутив на базе CentOS, измените директиву group с nogroup на nobody.
group nobody
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Подключение клиента
Выполните следующую команду для подключения клиента к VPN-серверу.
sudo openvpn --config /tmp/client1.ovpn
2023-08-08 16:23:29 Note: Kernel support for ovpn-dco missing, disabling data channel offload.
2023-08-08 16:23:29 OpenVPN 2.6.3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
2023-08-08 16:23:29 library versions: OpenSSL 3.0.9 30 May 2023, LZO 2.10
2023-08-08 16:23:29 DCO version: N/A
2023-08-08 16:23:29 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
2023-08-08 16:23:29 TCP/UDP: Preserving recently used remote address: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-08-08 16:23:29 Attempting to establish TCP connection with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCP connection established with [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 TCPv4_CLIENT link local: (not bound)
2023-08-08 16:23:29 TCPv4_CLIENT link remote: [AF_INET]69.28.91.204:443
2023-08-08 16:23:29 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-08-08 16:23:29 TLS: Initial packet from [AF_INET]69.28.91.204:443, sid=6bd67e12 50ebf8bc
2023-08-08 16:23:30 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-08-08 16:23:30 VERIFY KU OK
2023-08-08 16:23:30 Validating certificate extended key usage
2023-08-08 16:23:30 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-08-08 16:23:30 VERIFY EKU OK
2023-08-08 16:23:30 VERIFY OK: depth=0, CN=server
2023-08-08 16:23:30 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 384 bit ECsecp384r1, signature: ecdsa-with-SHA512
2023-08-08 16:23:30 [server] Peer Connection Initiated with [AF_INET]69.28.91.204:443
2023-08-08 16:23:30 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1
2023-08-08 16:23:30 TLS: tls_multi_process: initial untrusted session promoted to trusted
2023-08-08 16:23:31 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
2023-08-08 16:23:31 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM,protocol-flags cc-exit tls-ekm dyn-tls-crypt,tun-mtu 1500'
2023-08-08 16:23:31 OPTIONS IMPORT: --ifconfig/up options modified
2023-08-08 16:23:31 OPTIONS IMPORT: route options modified
2023-08-08 16:23:31 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-08-08 16:23:31 OPTIONS IMPORT: tun-mtu set to 1500
2023-08-08 16:23:31 net_route_v4_best_gw query: dst 0.0.0.0
2023-08-08 16:23:31 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-08-08 16:23:31 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:b7:cc:29
2023-08-08 16:23:31 TUN/TAP device tun0 opened
2023-08-08 16:23:31 net_iface_mtu_set: mtu 1500 for tun0
2023-08-08 16:23:31 net_iface_up: set tun0 up
2023-08-08 16:23:31 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-08-08 16:23:31 /etc/openvpn/update-resolv-conf tun0 1500 0 10.8.0.6 10.8.0.5 init
2023-08-08 16:23:31 net_route_v4_add: 69.28.91.204/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-08-08 16:23:31 UID set to nobody
2023-08-08 16:23:31 GID set to nogroup
2023-08-08 16:23:31 Capabilities retained: CAP_NET_ADMIN
2023-08-08 16:23:31 Initialization Sequence Completed
2023-08-08 16:23:31 Data Channel: cipher 'AES-256-GCM', peer-id: 0
2023-08-08 16:23:31 Timers: ping 10, ping-restart 120
2023-08-08 16:23:31 Protocol options: protocol-flags cc-exit tls-ekm dyn-tls-crypt
Вы можете проверить соединение, выполнив curl ident.me в своем браузере, и вы увидите свой IP-адрес и местоположение вашего сервера OpenVPN.
# ставим курл
apt install curl -y
# делаем запрос на сервер
curl ident.me
Проверить сайт на утечку айпи можно здесь - https://www.dnsleaktest.com/
Приведенная выше команда запускает OpenVPN на переднем плане, что означает, что терминал будет заблокирован. Чтобы закрыть соединение, вам нужно нажать Ctrl + C. Однако вы можете запустить OpenVPN и в фоновом режиме. Используйте следующую команду, чтобы сделать это.
# запускаем в фоновом режиме
sudo openvpn --config client1.ovpn --daemon
Чтобы завершить соединение, найдите идентификатор процесса.
# ищем процесс
ps aux | grep openvpn
nobody 1819 0.1 0.3 13316 7860 ? Ss 16:18 0:00 openvpn --config /tmp/client1.ovpn --daemon
root 1833 0.0 0.1 6332 2144 pts/0 S+ 16:18 0:00 grep openvpn
Как вы видите, идентификатор процесса, соответствующий процессу OpenVPN — 1819. Завершите VPN-подключение с помощью следующей команды, чтобы завершить процесс.
# завершаем процесс
sudo kill -9 1819
OpenVPN предлагает графические клиенты для платформ Windows, macOS, Android и iOS, куда вы можете импортировать файл конфигурации клиента для подключения.
[Шаг 14 — Отзыв клиентских сертификатов]
Если вы хотите отозвать сертификат клиента, чтобы предотвратить доступ, вы можете сделать это, войдя на сервер CA.
Перейдите в каталог /root/easy-rsa.
# идем в нужный каталог
cd /root/easy-rsa
Запустите скрипт с опцией revoke, за которой следует имя клиента.
# отзываем клиента
./easyrsa revoke client1
Вам будет предложено отозвать сертификат.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Please confirm you wish to revoke the certificate
with the following subject:
subject=
commonName = client1
serial-number: 940E2BF50BA5C75649EF18F7969FDE4A
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
Если ваш закрытый ключ CA защищен парольной фразой, введите ее при появлении соответствующего запроса.
Using configuration from /root/easy-rsa/pki/2f7d3491/temp.36ca6058
Revoking Certificate 940E2BF50BA5C75649EF18F7969FDE4A.
Database updated
* Notice:
IMPORTANT!!!
Revocation was successful. You must run gen-crl and upload a CRL to your
infrastructure in order to prevent the revoked cert from being accepted.
Это отзывет сертификат на сервере CA. Однако сервер OpenVPN не имеет возможности проверить статус отзыва. Для этого нам нужно сгенерировать список отзыва сертификатов (CRL) и передать его на сервер OpenVPN.
Сгенерируйте CRL.
# генерируем для отзыва
./easyrsa gen-crl
Вам будет предложено ввести парольную фразу CA. Приведенная выше команда генерирует файл crl.pem.
* Notice:
Using Easy-RSA configuration from: /root/easy-rsa/pki/vars
* Notice:
Using SSL: openssl OpenSSL 3.0.15 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)
Using configuration from /root/easy-rsa/pki/e39ca1a2/temp.e63e54d4
* Notice:
An updated CRL has been created.
CRL file: /root/easy-rsa/pki/crl.pem
Скопируйте этот файл на сервер OpenVPN.
# копируем крл на сервер
scp /root/easy-rsa/pki/crl.pem root@8.8.8.8:/tmp
Снова войдите на сервер OpenVPN и скопируйте файл CRL в каталог /etc/openvpn/server.
# копируем крл в папку
sudo cp /tmp/crl.pem /etc/openvpn/server/
Откройте файл конфигурации сервера OpenVPN для редактирования.
# открываем на редактиирование
sudo nano /etc/openvpn/server/server.conf
Добавьте следующую строку в конец файла. Это дает указание серверу OpenVPN проверить список отзыва на наличие клиентов, которые были ограничены.
crl-verify crl.pem
Сохраните файл, нажав F2 и введя Y при появлении соответствующего запроса.
Перезапустите сервер OpenVPN, чтобы изменения вступили в силу.
# перегружаем сервис
sudo systemctl restart openvpn-server@server.service
Клиент больше не может подключиться к серверу OpenVPN.
Заключение
На этом завершается наше руководство по установке и настройке сервера OpenVPN на сервере Debian 12.