С рунетом что-то не так: сначала Роскомнадзор и блокировки, теперь «суверенный» интернет. Пора поднимать собственный VPN!
И вот почему:
- Скорость: в вашем распоряжении окажется VPN-сервер, которым пользуетесь только вы.
- Контроль: вы можете создавать и удалять учётные записи, обновлять конфигурацию, менять пароль доступа и многое другое.
- Стоимость: аренда VPS стоит начиная от 2,5-5$/мес. Для сравнения: ExpressVPN – 12.95$/мес., NordVPN – 11.95$/мес.
- Обучение: да, собственный VPS – это хорошая практика серверного администрирования.
1. Выберите VPS-провайдера
Для начала вам нужен VPS, он же виртуальный выделенный сервер. На него вы установите VPN, к которому будете подключаться.
Если вы не знаете, по каким критериям выбирать VPS, можете руководствоваться таблицей ниже:
Очевидно, что 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. Создайте сертификат сервера, ключ и файлы шифрования
Теперь вы можете сгенерировать ключи и запрос сертификата от вашего сервера. Вы отправите запрос на ЦС для подписи.
Начните с перехода в директорию 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-req
, nopass
и именем клиента:
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. Разверните инфраструктуру конфигурации клиента
Создайте директории внутри каталога 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. Это может быть домашний компьютер или смартфон.
А в завершение нужно просто проверить скорость и убедиться, что всё работает так, как надо.
Комментарии