Как создать VPN на VPS

Для этой статьи мы будем использовать Ubuntu 16.04 и команды, в основном используемые в дистрибутивах, основанных на Debian.

Установка OpenVPN:

Чтобы установить openvpn и easy-rsa, выполним команды:
# apt update && apt upgrade 
# apt install easy-rsa openvpn -y

Первая команда обновит vps, вторая - установит VPN сервер.

Установите каталог для CA-сертификатов. OpenVPN является TLS/SSL-ориентированным VPN. Это значит, он использует сертификаты для шифрования трафика между сервером и клиентом. Чтобы выпустить доверенные сертификаты, нам понадобится установить наш собственный простой удостоверяющий центр (CA). 1. Для начала, скопируем каталог с easy-rsa шаблоном в наш домашний каталог командой make-cadir:

$ make-cadir ~/openvpn-ca

2. Перейдем в новосозданный каталог, чтобы начать настройку CA:

$ cd ~/openvpn-ca

3. Сконфигурируем переменные CA. Чтобы сконфигурировать те значения, которые будет использовать наш CA, нам нужно отредактировать файл vars в каталоге. Откроем этот файл в текстовом редакторе.

$ nano vars
Внутри вы найдете несколько переменных, которые можно регулировать, чтобы определить как именно будут созданы ваши сертификаты. Мы будем работать только с некоторыми из них. Ближе к концу файла найдите настройки, устанавливающие значения по умолчанию для новых сертификатов. Это должно выглядеть, например, так:

. . .
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
. . .
Отредактируйте значения по вашему усмотрению, но не оставляйте их пустыми.

. . .
export KEY_COUNTRY="UA"
export KEY_PROVINCE="Kiyv"
export KEY_CITY="Kiyv"
export KEY_ORG="ABC Hosting"
export KEY_EMAIL="happyuser@zzz.com.ua"
export KEY_OU="Community"
. . .
Пока мы здесь, отредактируем значение переменной KEY_NAME прямо под разделом, который заполняет поле subject. Чтобы упростить, в этом руководстве назовём его "server":

export KEY_NAME="server"
Когда закончите, сохраните и закройте файл. Чтобы сделать это его в редакторе nano, используйте комбинацию ctrl+o, а после этого нажмите enter, чтобы сохранить текущий файл, и ctrl+x, чтобы выйти из редактора. 4. Теперь мы можем использовать установленные нами переменные и утилиты easy-rsa чтобы собрать собственный центр сертификации. Убедитесь, что вы находитесь в своем CA каталоге, выполните команду source vars (файл, который вы только что редактировали):

$ cd ~/openvpn-ca
$ source vars
Если команда была выполнена корректно, вы должны увидеть следующее: NOTE: If you run
./clean-all
, I will be doing a
rm -rf on /home/sammy/openvpn-ca/keys
Убедитесь, что мы действуем в "чистом" окружении, набрав:
$ ./clean-all
Теперь мы можем собрать наш корневой CA. Выполним:

$ ./build-ca
Это запустит процесс создания ключа корневого CA и сертификата. Так как ранее мы отредактировали файл vars, все значения должны быть выставлены автоматически. Просто нажимайте ENTER во время сеанса чтобы подтвердить выбранные значения.

Пример вывода:
Generating a 2048 bit RSA private key
..........................................................................................+++
...............................+++
writing new private key to 'ca.key'
-----
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.
-----
Country Name (2 letter code) [UA]:
State or Province Name (full name) [Kyiv]:
Locality Name (eg, city) [Kyiv]:
Organization Name (eg, company) [ABC Hosting]:
Organizational Unit Name (eg, section) [Community]:
Common Name (eg, your name or your server's hostname) [ABC Hosting CA]:
Name [server]:
Email Address [happyuser@zzz.com.ua]:
Теперь у нас есть CA, который можно использовать для создания оставшихся нужных нам файлов. 5. Создадим сертификат сервера, ключ и файлы для шифрования Далее мы генерируем пару ключ и сертификат сервера, а также некоторые дополнительные файлы, используемые в процессе шифрования. Запускаем создание пары сертификата сервера и ключа. Мы можем сделать это, набрав:
$ ./build-key-server server
На заметку: если вы выберете здесь имя, отличное от server, вы должны будете скорректировать некоторые моменты ниже, пользуясь данной инструкцией. Например, когда копируете сгенерированные файлы в каталог /etc/openvpn, нужно заменить имена на корректные. Позже вы должны будете также модифицировать файл /etc/openvpn/server.conf чтобы указать правильные файлы .crt и .key. Итак, переменные будут иметь значения по умолчанию, основанные на аргументах, которые мы только что передали (server), и содержимом полученного нами файла vars. Принимайте значения по умолчанию, нажимая ENTER. Не вводите пароль для этой установки. Ближе к концу вы должны будете ответить 'y' на два вопроса, чтобы подписать и подтвердить сертификат.
Примерный вывод:
. . .

Certificate is to be certified until May  1 17:51:16 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Далее мы сгенерируем несколько дополнительных элементов. Мы можем сгенерировать стойкие ключи Диффи-Хеллмана, чтобы использовать во время обмена ключами, набрав:
$ ./build-dh
Это может занять несколько минут. После мы можем сгенерировать подпись HMAC, чтобы усилить возможности проверки целостности TLS сервера:
$ openvpn --genkey --secret keys/ta.key
6. Генерация пары клиентского сертификата и ключа. Далее мы можем сгенерировать пару клиентского сертификата и ключа. Хотя это можно сделать на клиентской машине и затем подписать сервером/CA из соображений безопасности, в этом руководстве для простоты мы сгенерируем подписанный ключ на сервере. Cгенерируем единичный клиентский ключ/сертификат для этого руководства, но если у вас более одного клиента, вы можете повторить этот процесс столько раз, сколько потребуется. Передайте скрипту уникальное значение для каждого клиента. Потому как вы можете вернуться к этому шагу позже, мы перевыпустим файл vars. В этом руководстве мы будем использовать client1 как значение для нашей первой пары сертификат/ключ. Для создания полномочий без пароля, для автоматических соединений, используйте команду сборки ключа:
$ cd ~/openvpn-ca
$ source vars
$ ./build-key client1
И наоборот, если вы желаете создать защищенные паролем данные доступа, используйте команду build-key-pass:
$ cd ~/openvpn-ca
$ source vars
$ ./build-key-pass client1
Настройки по умолчанию снова должны быть установлены, поэтому вы можете просто нажать ENTER для продолжения. Оставьте запрос пароля пустым и нажмите ENTER на подсказку "y", когда попросит подписать и запомнить сертификат. 7. Настройка сервиса OpenVPN Далее мы можем начать настройку сервиса OpenVPN, используя данные доступа и сгенерированные нами файлы. Для начала мы должны скопировать файлы, которые нам нужны в каталог настройки /etc/oopenvpn. Мы можем начать с тех файлов, которые мы только что сгенерировали. При создании они были помещены в каталог
~/openvpn-ca/keys
. Нам нужно переместить наш CA, сертификат и ключ, сертификат сервера и ключ, подпись HMAC и файл Диффи-Хеллмана:
$ cd ~/openvpn-ca/keys
$ sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
Далее нам нужно скопировать и разархивировать примерный файл конфигурации OpenVPN в каталог настройки, который мы сможем использовать как основу для нашей установки:
# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
Перейдем к отладке конфигурации OpenVPN. Наши файлы готовы, и мы можем изменять файл конфигурации сервера:
$ sudo nano /etc/openvpn/server.conf
Во-первых, найдем секцию HMAC с помощью поиска директивы tls-auth. Удалим ";" чтобы раскомментировать строку tls-auth. Под ней добавим параметр key-direction и установим его значение "0":
/etc/openvpn/server.conf:
tls-auth ta.key 0 # This file is secret
key-direction 0
Далее, найдите секцию криптографического шифра c помощью поиска закомментированной строки шифра. AES-128-CBC является высоким уровнем шифрования и хорошо поддерживается. Удалите ";", чтобы раскомментировать строку шифра AES-128-CBC:
/etc/openvpn/server.conf:
cipher AES-128-CBC
Ниже добавьте аутентификационную строку для выбора алогоритма сообщений HMAC. SHA256 - хороший выбор для этого.
/etc/openvpn/server.conf:
auth SHA256
И наконец, найдите настройки пользователя и группы и удалите ";" в начале, чтобы раскомментировать эти строки.
/etc/openvpn/server.conf:
user nobody
group nogroup
(Опционально) Возможна также передача настроек DNS, чтобы перенаправить весь трафик через VPN. Настройки выше создадут соединение VPN между двумя машинами, но не перенаправят все соединения в туннели. Если вы желаете использовать VPN для маршрутизации всего вашего трафика, вы, вероятно, захотите передать настройки DNS клиентскому компьютеру. Вы можете это сделать, раскомментировав некоторые директивы, которые сконфигурируют клиентскую машину, чтобы перенаправить весь веб-трафик через VPN. Найдите раздел redirect-gateway и удалите точку с запятой в начале строки, чтобы раскомментировать её:
/etc/openvpn/server.conf:
push "redirect-gateway def1 bypass-dhcp"
Прямо под ней найдите секцию dhcp-option. Снова удалите ";" в начале обоих строк, чтобы раскомментировать их:
/etc/openvpn/server.conf:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Это должно помочь клиентам перенастроить их установки DNS, чтобы использовать VPN-туннель как шлюз по умолчанию. (Опционально) Дополнительно можно настроить порт и протокол. По умолчанию, сервер OpenVPN использует порт 1194 и протокол UDP для приема клиентских соединений. Если вам нужно использовать другой порт из-за сетевых ограничений, в которых могут находиться ваши клиенты, вы можете изменить опцию port. Если вы не размещаете веб-контент на вашем OpenVPN-сервере, порт 443 - это популярное решение, потому как обычно является разрешенным для доступа фаерволом.
/etc/openvpn/server.conf:
# Optional!
port 443
Зачастую, доступ к этому порту по протоколу запрещён. Если это так, измените протокол с UDP на TCP:
/etc/openvpn/server.conf:
# Optional!
proto tcp
Если вам не нужно использовать другой порт, лучше оставить эти две настройки по умолчанию. (Опционально) Установка данных доступа не по умолчанию. Если вы ранее выбрали другое имя во время выполнения команды ./build-key-server, измените строки cert и key чтобы указать подходящие файлы .crt и .key. Если вы использовали сервер по умолчанию, это должно уже быть установлено правильно:
/etc/openvpn/server.conf:
cert server.crt
key server.key
После окончания сохраните и закройте файл. 8. Настройка сетевой конфигурации сервера Далее нам нужно настроить некоторые аспекты сетевой конфигурации сервера, так чтобы OpenVPN мог правильно маршрутизировать трафик. Разрешим IP Forwarding (передача пакетов между интерфейсами). Во-первых, нам нужно разрешить серверу пересылку трафика между интерфейсами. Это довольно существенно для желаемой функциональности нашего VPN сервера. Мы можем настроить это, изменив файл /etc/sysctl.conf
# sudo nano /etc/sysctl.conf
В нем найдем строку, которая устанавливает net.ipv4.ip_forward. Удалим символ "#" в начале строки, чтобы раскомментировать эту настройку:
/etc/sysctl.conf:
net.ipv4.ip_forward=1
Когда закончите, сохраните и закройте файл. Чтобы открыть файл и применить значения в текущем сеансе наберите:
# sudo sysctl -p
Теперь нам нужно установить iptables и настроить правила фаервола:
# apt install iptables
Для настройки правил выполните следующее:
# iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT
# iptables -A INPUT -i tun+ -j ACCEPT
# iptables -A FORWARD -i tun+ -j ACCEPT
# iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# iptables -A OUTPUT -o tun+ -j ACCEPT
Также, пожалуйста, выполните это действие, чтобы исправить файл службы systemd для openvpn:
$ sudo sed -i 's/LimitNPROC=10 /#LimitNPROC=10 /' /lib/systemd/system/openvpn@.service
9. Нам нужно запустить сервер OpenVPN указанием имени нашего конфигурационного файла как переменной экземпляра после имени файла systemd. Наш конфигурационный файл для нашего сервера называется /etc/openvpn/server.conf, так что мы добавим @server в конец unit файла при его вызове:
$ sudo systemctl start openvpn@server
Если всё прошло правильно, ваш вывод должен выглядеть приблизительно так:
openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
  Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta
 Main PID: 5856 (openvpn)
    Tasks: 1 (limit: 512)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
           └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

May 03 15:30:05 openvpn2 ovpn-server[5856]: /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server[5856]: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
May 03 15:30:05 openvpn2 ovpn-server[5856]: GID set to nogroup
May 03 15:30:05 openvpn2 ovpn-server[5856]: UID set to nobody
May 03 15:30:05 openvpn2 ovpn-server[5856]: UDPv4 link local (bound): [undef]
May 03 15:30:05 openvpn2 ovpn-server[5856]: UDPv4 link remote: [undef]
May 03 15:30:05 openvpn2 ovpn-server[5856]: MULTI: multi_init called, r=256 v=256
May 03 15:30:05 openvpn2 ovpn-server[5856]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
May 03 15:30:05 openvpn2 ovpn-server[5856]: IFCONFIG POOL LIST
May 03 15:30:05 openvpn2 ovpn-server[5856]: Initialization Sequence Completed
Также вы можете проверить, доступен ли интерфейс OpenVPN tun0, набрав команду:
$ ip addr show tun0
Вы должны увидеть отлаженый интерфейс:
4: tun0: POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
10. Создание инфраструктуры клиентской конфигурации. Далее нам нужно установить систему которая позволит нам легко создать файлы клиентской конфигурации. Создайте структуру каталогов в вашем домашнем каталоге, чтобы сохранить файлы:
$ mkdir -p ~/client-configs/files
Как только клиентские ключи будут встроены в наши файлы конфигурации, необходимо заблокировать к ним доступ во внутреннем каталоге:
$ chmod 700 ~/client-configs/files
Для создания базовой конфигурации скопируем пример клиентской конфигурации в наш каталог, чтобы использовать его как базовый:
$ 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 на выбранный:
~/client-configs/base.conf:
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote server_IP_address 1194
. . .
Удостоверьтесь, что протокол совпадает со значением, которое используется в серверной конфигурации:
~/client-configs/base.conf:
proto udp
Далее, удалением ";" раскомментируйте директивы user и group:
~/client-configs/base.conf:
# Downgrade privileges after initialization 
user nobody
group nogroup
Найдите директивы, устанавливающие центр сертификации, сертификат и ключ. Раскомментируйте эти директивы, поскольку мы будем добавлять сертификаты и ключи в сам файл:
~/client-configs/base.conf:
# 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
Отразите настройки cipher и auth, установленные нами в файле /etc/openvpn/server.conf:
~/client-configs/base.conf:
cipher AES-128-CBC
auth SHA256
Далее добавьте директиву key-direction где-нибудь в файле. Она должна быть установлена в значение "1" для работы с сервером:
~/client-configs/base.conf:
key-direction 1
И наконец, добавьте несколько раскомментированных строк. Мы используем их в каждом конфиге, но включать их следует только для Linux-клиентов с файлом /etc/openvpn/update-resolv-conf:
~/client-configs/base.conf:
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Если ваш клиент запущен в Linux и использует файл /etc/openvpn/update-resolv-conf, то вы должны раскомментировать эти строки из сгенерированного клиентского конфигурационного файла OpenVPN. Сохраните файл, когда закончите. Далее мы создадим простой скрипт, для компиляции нашей базовой конфигурации с соответствующими файлами сертификата, ключа и шифрования. Он поместит сгенерированную конфигурацию в каталог ~/client-configs/files. Создайте и откройте файл, названный как make_config.sh в каталоге ~/client-configs:
$ nano ~/client-configs/make_config.sh
Внутри вставьте следующий скрипт:
~/client-configs/make_config.sh:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '\n') \
    ${KEY_DIR}/ta.key \
    <(echo -e '') \
    > ${OUTPUT_DIR}/${1}.ovpn
Сохраните и закройте файл, когда закончите. Пометьте файл как исполняемый, набрав:
$ chmod 700 ~/client-configs/make_config.sh
Создание клиентских настроек происходит таким образом. Если вы следовали этому руководству, вы содали сертификат и ключ клиента, названные client1.crt and client1.key благодаря запуску команды ./build-key client1. Мы можем сгенерировать конфиг для этих учетных данных перемещением в наш каталог ~/client-configs и использованием созданного скрипта:
$ cd ~/client-configs
$ ./make_config.sh client1
Если действия были выполнены правильно, то в каталоге ~/client-configs/files должен появиться файл client1.ovpn:
$ ls ~/client-configs/files
Вывод:
client1.ovpn
Также нам нужно передать файл клиентской конфигурации на соответствующее устройство. Например, это может быть ваш локальный компьютер или мобильное устройство. Хотя выбор конкретного приложения, которое будет спользоваться для передачи, будет зависеть от вашего выбора и операционной системы устройства, желательно, чтобы приложение использовало протокол SFTP (SSH FTP) или SCP (Secure Copy). Это передаст файлы вашей клиентской VPN аутентификации через зашифрованное соединение. Вот пример использования команды SFTP с использованием нашего файла client1.ovpn. Эта команда может быть выполнена с вашего локального компьютера (на OS X или Linux). Она помещает файл .ovpn в ваш домашний каталог:
$ scp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/
Для безопасной передачи файлов с сервера на локальный компьютер, можно использовать, например, WinSCP, Filezilla. Файл OVPN может быть использован OpenVPN клиентом на Windows или Mac OS. В Linux имеется графический Network Manager, который может работать с файлами .ovpn.