10 шагов навстречу собственному безлимитному VPN

С рунетом что-то не так: сначала Роскомнадзор и блокировки, теперь «суверенный» интернет. Пора поднимать собственный VPN!

10 шагов навстречу собственному безлимитному VPN

И вот почему:

  • Скорость: в вашем распоряжении окажется VPN-сервер, которым пользуетесь только вы.
  • Контроль: вы можете создавать и удалять учётные записи, обновлять конфигурацию, менять пароль доступа и многое другое.
  • Стоимость: аренда VPS стоит начиная от 2,5-5$/мес. Для сравнения: ExpressVPN – 12.95$/мес., NordVPN – 11.95$/мес.
  • Обучение: да, собственный VPS – это хорошая практика серверного администрирования.

1. Выберите VPS-провайдера

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

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

Provider Storage CPU Memory Traffic Price
Veesp 25GB 1 vCore 1GB Unlimited $5/mo
DigitalOcean 25GB 1 vCore 1GB 1 TB $5/mo
Vultr 25GB 1 vCore 1GB 1 TB $5/mo

 

Очевидно, что Veesp выигрывает благодаря безлимитному трафику.

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

После регистрации вам предстоит оформить заказ и выбрать желаемый дистрибутив Linux. Имейте в виду, что для разных дистрибутивов настройка VPN может отличаться. Выбирайте то, что вам ближе или Debian 9 «Stretch», чтобы успешно воспользоваться дальнейшими инструкциями.

Когда вы закончите, зайдите в панель управления сервером, чтобы узнать IP-адрес и рут-пароль, либо проверьте почту – туда также придёт письмо с данными для доступа к серверу:

Не показывайте никому!

2. Установите OpenVPN и EasyRSA

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

ssh root@IP_вашего_сервера

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

Установите OpenVPN:

sudo apt update
sudo apt install openvpn

OpenVPN работает по TLS/SSL – использует сертификаты для шифрования трафика между клиентом и сервером. Сертификаты выдаёт центр сертификации (ЦС) – отдельный сервер.

Из соображений безопасности ЦС-сервер отделён от VPN-сервера. С помощью EasyRSA вы поднимите свой ЦС и построите на нём инфраструктуру открытых ключей (ИОК).

Чтобы начать, скачайте последнюю версию EasyRSA на обе машины  ЦС и сервер OpenVPN:

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz

Распакуйте архив:

cd ~
tar xvf EasyRSA-unix-v3.0.6.tgz

Отлично! У вас есть всё необходимое: OpenVPN на VPS и EasyRSA на ЦС.

3. Поднимите центр сертификации

На ЦС перейдите в директорию EasyRSA:

cd ~/EasyRSA-v3.0.6/

Скопируйте файл vars.example под именем vars:

cp vars.example vars

Откройте файл в текстовом редакторе:

nano vars

Найдите настройки сертификатов:

. . .

#set_var EASYRSA_REQ_COUNTRY    "US"
#set_var EASYRSA_REQ_PROVINCE   "California"
#set_var EASYRSA_REQ_CITY       "San Francisco"
#set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL      "me@example.net"
#set_var EASYRSA_REQ_OU         "My Organizational Unit"

. . .

Раскомментируйте и отредактируйте по вкусу. Не оставляйте строки пустыми:

. . .

set_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "Proglib"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "Community"

. . .

Сохраните и закройте файл, когда закончите.

Внутри директории EasyRSA лежит скрипт easyrsa. Он используется для управления ЦС. Запустите скрипт с опцией init-pki, чтобы инициализировать инфраструктуру открытых ключей:

./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/proglib/EasyRSA-v3.0.6/pki

Постройте ЦС и создайте ключи SSL-сертификата. Используйте nopass, чтобы не подтверждать пароль каждый раз при взаимодействии с ЦС:

./easyrsa build-ca nopass

Вывод попросит подтвердить общее имя для ЦС – просто жмите ENTER:

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

Теперь у вас есть ЦС, готовый подписывать запросы сертификатов.

4. Создайте сертификат сервера, ключ и файлы шифрования

10 шагов навстречу собственному безлимитному VPN

Теперь вы можете сгенерировать ключи и запрос сертификата от вашего сервера. Вы отправите запрос на ЦС для подписи.

Начните с перехода в директорию EasyRSA на сервере OpenVPN:

cd ~/EasyRSA-v3.0.6/

Запустите оттуда уже знакомую команду easyrsa с опцией init-pki:

./easyrsa init-pki

Затем запустите скрипт easyrsa с опцией gen-req и с любым именем машины. Не забудьте опцию nopass – без неё файл запроса окажется на пароле, что может вызвать проблемы с доступом в дальнейшем:

./easyrsa gen-req server nopass

Команда создаст закрытый ключ и файл запроса сертификата server.req. Скопируйте ключ в /etc/openvpn/:

sudo cp ~/EasyRSA-v3.0.6/pki/private/server.key /etc/openvpn/

Передайте server.req на ЦС безопасным способом:

scp ~/EasyRSA-v3.0.6/pki/reqs/server.req proglib@IP_вашего_ЦС:/tmp

Далее, на машине ЦС перейдите в директорию EasyRSA:

cd EasyRSA-v3.0.6/

Импортируйте файл server.req с помощью скрипта easyrsa, указав общее имя:

./easyrsa import-req /tmp/server.req server

Подпишите запрос, используя скрипт easyrsa с опцией sign-req, указав тип запроса и общее имя. Тип запроса может быть client или server. Для сервера OpenVPN, очевидно, server:

./easyrsa sign-req server server

Вывод проверит источник исходящего запроса. Введите yes, затем ENTER для подтверждения:

You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 3650 days:

subject=
    commonName                = server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Передайте подписанный сертификат на VPN-сервер:

scp pki/issued/server.crt proglib@IP_вашего_сервера:/tmp

Прежде чем выйти из ЦС, передайте на сервер файл ca.crt:

scp pki/ca.crt proglib@IP_вашего_сервера:/tmp

Далее зайдите на сервер OpenVPN и скопируйте файлы server.crt и ca.crt в директорию /etc/openvpn/:

sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

Затем перейдите в директорию EasyRSA:

cd EasyRSA-v3.0.6/

Создайте там ключ Диффи-Хеллмана для использования во время обмена:

./easyrsa gen-dh

Сгенерируйте подпись HMAC для усиления возможностей проверки целостности TLS сервера:

sudo openvpn --genkey --secret ta.key

Скопируйте новые файлы в директорию /etc/openvpn/:

sudo cp ~/EasyRSA-v3.0.6/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-v3.0.6/pki/dh.pem /etc/openvpn/

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

5. Создайте сертификат и ключевую пару клиента

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

Вам нужно передать скрипту уникальное имя клиента (proglib).

Для начала создайте структуру директорий в домашнем каталоге для хранения сертификатов и ключей:

mkdir -p ~/client-configs/keys

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

chmod -R 700 ~/client-configs

Далее возвращайтесь в директорию EasyRSA и запускайте скрипт easyrsa с опциями gen-reqnopass и именем клиента:

cd EasyRSA-v3.0.6/
./easyrsa gen-req proglib nopass

Жмите ENTER, чтобы подтвердить и скопируйте файл proglib.key в созданную ранее директорию /client-configs/keys/:

cp pki/private/proglib.key ~/client-configs/keys/

Передайте файл proglib.req вашему ЦС:

scp pki/reqs/proglib.req proglib@IP_вашего_ЦС:/tmp

Зайдите на ЦС, перейдите в директорию EasyRSA, чтобы импортировать запрос сертификата:

ssh proglib@IP_вашего_ЦС
cd EasyRSA-v3.0.6/
./easyrsa import-req /tmp/proglib.req proglib

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

./easyrsa sign-req client proglib

На выводе нажмите yes, чтобы подтвердить источник сертификата:

Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes

Команда создаёт файл proglib.crt. Отправьте его обратно на сервер:

scp pki/issued/proglib.crt proglib@IP_вашего_сервера:/tmp

Зайдите на сервер OpenVPN и скопируйте сертификат клиента в директорию /client-configs/keys/:

cp /tmp/proglib.crt ~/client-configs/keys/

А также скопируйте файлы ca.crt и ca.crt в директорию /client-configs/keys/:

sudo cp ~/EasyRSA-v3.0.6/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

Отличная работа! Вы создали и собрали ключи с сертификатами в нужном месте на сервере. Пора приступать к настройке OpenVPN.

6. Настройте службу OpenVPN

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

Используйте копию шаблона конфигурации OpenVPN:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

Откройте файл настроек сервера в текстовом редакторе:

sudo nano /etc/openvpn/server.conf

Раскомментируйте директиву tls-auth в секции HMAC и добавьте параметр key-direction в 0:

tls-auth ta.key 0 # This file is secret
key-direction 0

Затем раскомментируйте cipher:

cipher AES-256-CBC

Ниже добавьте директиву auth:

auth SHA256

После найдите строчку с директивой dh, которая описывает параметры Диффи-Хеллмана. При необходимости удалите из имени 2048, чтобы оно совпадало с ключом, сгенерированным на предыдущем шаге.

dh dh.pem

Наконец, расскоментируйте user и group:

user nobody
group nogroup

Готово! Эти изменения достаточны для функционирования OpenVPN. Осталось несколько небольших, но важных деталей.

Перенаправьте весь трафик через VPN

Чтобы направить трафик в туннель, нужно «продвинуть» свои настройки маршрутов и DNS на клиентские машины.

В файле server.conf расскоментируйте redirect-gateway:

push "redirect-gateway def1 bypass-dhcp"

И dhcp-option:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Это поменяет настройки DNS на клиенте и заставит использовать VPN туннель в качестве маршрута по умолчанию.

Поменяйте порт и протокол

По умолчанию OpenVPN принимает клиентов на 1194 порте по протоколу UDP. Поменяйте порт и протокол, если предстоит подключаться к VPN из сетей с ограничениями. Порт 443 не фильтруется файерволами.

port 443

Измените протокол на TCP, если фильтруется UDP:

proto tcp

При этом отключите директиву explicit-exit-notify – она нужна только для UDP. Иначе служба OpenVPN не запустится с указанными протоколом TCP:

explicit-exit-notify 0

Если вам необязательно менять протокол и порт, не трогайте эти настройки.

7. Настройте маршрутизацию на сервере

Чтобы трафик шёл в OpenVPN, нужно разрешить маршрутизацию пакетов в файле /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Раскомментируйте строчку net.ipv4.ip_forward:

net.ipv4.ip_forward=1

Сохраните, закройте и примените:

sudo sysctl -p
net.ipv4.ip_forward = 1

Настройте межсетевой экран

Установите ufw:

sudo apt update
sudo apt install ufw

Узнайте публичный сетевой интерфейс:

ip route | grep default

Он будет указан после слова «dev» (eth0):

default via 203.0.113.1 dev eth0 onlink

Откройте файл /etc/ufw/before.rules для настройки:

sudo nano /etc/ufw/before.rules

В верхнюю часть файла добавьте приведённые ниже строки. Не забудьте заменить на ваш интерфейс:

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] 
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Сохраните и закройте файл.

Теперь разрешите UFW обрабатывать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw:

sudo nano /etc/default/ufw

Там, в директиве DEFAULT_FORWARD_POLICY, укажите ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Сохраните и закройте файл, когда закончите.

Далее разрешите файерволу трафик OpenVPN. Если вы не меняли порт и протокол в файле /etc/openvpn/server.conf, нужно разрешит трафик UDP на порте 1194. Если вы меняли порт и протокол, замените на значения, которые выбрали.

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

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

После добавления правил перезапустите UFW:

sudo ufw disable
sudo ufw enable

Теперь ваш сервер настроен на правильную обработку трафика OpenVPN.

8. Запустите и включите службу OpenVPN

Наконец-то вы можете запустить службу OpenVPN на вашем сервере с помощью утилиты systemd systemctl.

Запустите сервер OpenVPN, указав имя файла конфигурации в качестве экземпляра переменной после имени unit-файла systemd. Файл конфигурации вашего сервера называется /etc/openvpn/server.conf, так что добавьте @server в конце unit-файла при вызове:

sudo systemctl start openvpn@server

Убедитесь, что сервер успешно запустился:

sudo systemctl status openvpn@server

Если всё хорошо, вы получите что-то похожее:

● openvpn@server.service - OpenVPN connection to server
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-04-17 16: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

Можете проверить наличие интерфейса tun0 для OpenVPN:

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

После запуска службы включите автозапуск при загрузке:

sudo systemctl enable openvpn@server

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

9. Разверните инфраструктуру конфигурации клиента

10 шагов навстречу собственному безлимитному VPN

Создайте директории внутри каталога client-configs. Там будут храниться файлы конфигурации клиента:

mkdir -p ~/client-configs/files

Скопируйте пример конфигурации клиента в директорию client-configs:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Откройте новый файл в текстовом редакторе:

nano ~/client-configs/base.conf

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

. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote IP_вашего_сервера 1194
. . .

Убедитесь, что протокол соответствует значению в настройках сервера:

proto udp

Далее, раскомментируйте директивы user и group:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

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

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
#ca ca.crt
#cert client.crt
#key client.key

И директиву tls-auth – вы добавите ta.key напрямую в файл конфигурации клиента:

# If a tls-auth key is used on the server
# then every client must also have the key.
#tls-auth ta.key 1

Укажите настройки cipher и auth согласно указанным вами в файле /etc/openvpn/server.conf:

cipher AES-256-CBC
auth SHA256

Добавьте директиву key-direction в любое место файла. Вы должны установить её в «1» для правильной работы VPN на клиенте:

key-direction 1

Наконец добавьте несколько закомментированных строк. Они нужны только для Linux-клиентов, которые настраиваются DNS утилитой resolvconf.

pt-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Закройте и сохраните, когда закончите.

Создайте простой скрипт, который скомпилирует вашу конфигурацию с соответствующим сертификатом, ключом и файлом шифрования. Положите сгенерированную конфигурацию в директорию ~/client-configs/files. Откройте новый файл make_config.sh в директории ~/client-configs:

nano ~/client-configs/make_config.sh

Добавьте туда следующее содержимое, заменив proglib именем вашего пользователя:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=/home/proglib/client-configs/keys
OUTPUT_DIR=/home/proglib/client-configs/files
BASE_CONFIG=/home/proglib/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-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Сохраните и закройте.

Сделайте файл исполняемым:

chmod 700 ~/client-configs/make_config.sh

Этот скрипт создаёт копию сделанного вами файла base.conf, собирает все файлы сертификатов и ключей, которые вы создали для клиента, извлекает их содержимое, добавляет их в копию файла базовой конфигурации и экспортирует всё это в конфиг нового клиента.

Пора проверить его в действии!

10. Сгенерируйте конфигурацию клиента

Если помните, вы создали сертификат и ключ proglib.crt и proglib.key. Создайте конфиг для этих реквизитов, перейдя в директорию ~/client-configs и запустив созданный ранее скрипт:

cd ~/client-configs
sudo ./make_config.sh proglib

Команда создаст файл proglib.ovpn в директории ~/client-configs/files:

ls ~/client-configs/files
proglib.ovpn

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

А в завершение нужно просто проверить скорость и убедиться, что всё работает так, как надо.

10 шагов навстречу собственному безлимитному VPN

Комментарии

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ