Собственный VPN-сервер

5 Февраля 2018

Персональный VPN сервер пригодится всем, независимо от того, где вы предпочитаете работать — дома, в офисе или в дороге. Если вы работаете дома или в офисе, то собственный VPN нужен, если необходимо скрыть свой IP-адрес или же получить доступ к заблокированным вашим провайдером ресурсам (есть вероятность, что через VPN к ним можно будет достучаться). Если же вы привыкли работать в дороге, то использование незащищенных Wi-Fi-сетей (отель, кафе, аэропорт) довольно опасно — ваши данные могут быть украдены, в том числе и финансовая информация, если вы совершаете покупки онлайн. При использовании VPN сервера весь ваш трафик будет проходить через него в зашифрованном виде, что исключает его перехват по крайней мере на отрезке «провайдер -> VPN».

Почему бы не оплатить какой-то VPN сервис или не использовать бесплатный VPN? Если VPN нужен только для смены IP-адреса и безопасность не нужна (то есть вас не беспокоит, что ваши данные могут быть украдены), то можно использовать бесплатные VPN-сервисы. Если же вас беспокоит безопасность ваших данных, то лучше доплатить немного денег и получить свой VPN сервер, который будет подконтролен только вам, и вы точно будете знать, что он не сохраняет передаваемую вами информацию и не направляет ее третьим лицам. Все элементарно: можно быть уверенным только в том, что мы сами контролируем. 

Стоимость VPN-сервера

Любой человек, кто хоть раз задумывался о том, как создать собственный VPN сервер, пытался найти информацию о расходах на эту процедуру. Ясно, что отдельный виртуальный сервер будет стоить дороже, чем оплата безлимитного сервиса (без ограничения трафика), но все равно цена будет доступной. Учитывая, если клиентов будет немного (например, вы и еще несколько человек), то хватит минимальной конфигурации (2 ядра, 3 Гб оперативной памяти, SAS-диск на 20 Гб), которая на платформе xelent.cloud обойдется всего в 1265 рублей в месяц. Для предприятия — это вообще ничего. Для отдельно взятого человека, который будет платить свои кровные, тоже немного, учитывая, что, если сервером будут пользоваться несколько человек и эта сумма будет разделена поровну. 

Не нужно заказывать для собственного VPN сервера огромный диск (при желании всегда объем диска можно увеличить), не нужны большие объемы оперативки и т. д. При небольшом количестве клиентов вполне хватит конфигурации, изображенной на рис. 1. Такая конфигурация обойдется как раз в 1265 рублей. 

Минимальная конфигурация сервера для VPN

Рис. 1. Минимальная конфигурация сервера для VPN 

Установка необходимого программного обеспечения 

Перед тем, как создать собственный VPN сервер, вам надо будет выбрать ОС и установить нужные для этого процесса программы. Далее описана настройка виртуальной частой сети на базе Ubuntu 16.04, поэтому при заказе серверного компьютера на xelent.cloud нужно выбрать именно эту операционную систему. Создание VPN-сервиса вручную — задача хоть и не очень сложная, но требует определенного времени, так что запасайтесь терпением.

Первым делом нужно установить необходимое программное обеспечение:

sudo apt-get install openvpn easy-rsa

Мы устанавливаем два пакета. Первый — это сам OpenVPN, а второй — easy-rsa — пакет, позволяющий построить собственный сервер сертификации. 

Настройка центра сертификации

OpenVPN использует TLS/SSL, поэтому нам нужны сертификаты для шифрования трафика между серверным компьютером и клиентом. Чтобы не покупать сертификаты, мы создадим собственный центр сертификации.

Скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir:

make-cadir ~/openvpn-ca
cd ~/openvpn-ca 

Откройте файл vars (файловый менеджер уже установлен по умолчанию, если вы используете виртуальные машины от xelent.cloud):

mcedit vars

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

export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="Albany"
export KEY_ORG="My Company"
export KEY_EMAIL="admin@company.com"
export KEY_OU="MyWorkgroup" 

Также найдите и отредактируйте переменную KEY_NAME: 

export KEY_NAME="server" 

Для простоты можно использовать просто «server» (или любую другую строку, но запомните, какую именно). Если вы будете использовать название, отличное от «server», тогда вам придется изменить некоторые команды, в которых встречается это название. Теперь можно приступить к созданию центра сертификации: 

cd ~/openvpn-ca 
source vars 

Вывод будет примерно таким: 

NOTE: If you run./clean-all, I will be doing a rm -rf on /home/den/openvpn-ca/keys 

После этого введите команды: 

./clean-all
./build-ca 

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

Создание сертификата и ключа для сервера 

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

./build-key-server 

Процесс создания ключей очень прост — нажимайте Enter в ответ на предлагаемые значения. Значение challenge password задавать не нужно. В конце процесса нужно два раза ввести y — для подписи и для подтверждения создания сертификата: 

Certificate is to be certified until Jan 22 19:24:16 2028 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
openvpn -genkey -secret keys/ta.key 

Первая команда создает ключи протокола Диффи-Халлмана, вторая — генерирует подпись HMAC. В зависимости от расторопности вашего сервера, эти команды могут работать несколько минут каждая. 

Если облака для вас
не просто теория
Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям
Конфигурация VPS и бесплатный тест уже через 2 минуты
Организация вашей IT-инфраструктуры на основе мультиклауд-решения

Создание сертификата и ключей для клиента 

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

Мы создадим ключ и сертификат только для одного клиента. Если клиентов несколько, вы можете повторять этот процесс до бесконечности — пока не сгенерируете сертификаты и ключи для каждого клиента.

Команда build-key используется для создания файлов без пароля для облегчения автоматических соединений: 

cd ~/openvpn-ca
source vars
./build-key client1 

Если нужны файлы, защищенные паролем, используйте команду build-key-pass

cd ~/openvpn-ca
source vars
./build-key-pass client1 

Настройка OpenVPN 

Вот только теперь можно приступить к процессу настройки персонального VPN. В самом начале процесса нужно скопировать сгенерированные ранее файлы из каталога openvpn-ca/keys в /etc/openvpn: 

cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn 

Пример файла конфигурации можно взять из файла /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz. Его нужно распаковать в /etc/openvpn/server.conf. 

После того, как распакуете шаблон файла конфигурации можно приступить к его редактированию. Откройте /etc/openvpn/server.conf в любимом текстовом редакторе. 

Далее приведен фрагмент этого файла. Внимательно читайте комментарии:

# Раскомментируйте эту строку
tls-auth ta.key 0 # This file is secret
# Установите key-direction в 0
key-direction 0
# Расскомментируйте эту строку
cipher AES-128-CBC
# Сразу после строки с cipher добавьте следующую строку:
auth SHA256
# Укажите имя пользователя и группы, от имени которых будет запускаться сервер%
user nobody
group nogroup
# Чтобы VPN-соединение использовалось для всего трафика, нужно "протолкнуть"
# настройки DNS на машины клиентов. Для этого раскомментируйте следующую строку:
push "redirect-gateway def1 bypass-dhcp"
# Также добавьте DNS-серверы (используем Google Public DNS):
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# При необходимости измените порт и протокол:
port 443
proto tcp
# Если при вызове build-key-server вы указали значение, отличное от
# "server", измените имена файлов сертификата и ключа
cert server.crt
key server.key

Теперь нужно немного настроить сам сервер. Первым делом разрешить пересылать трафик, если вы этого еще не сделали. Откройте файл sysctl.conf: 

sudo mcedit /etc/sysctl.conf 

Раскомментируйте строчку: 

net.ipv4.ip_forward=1 

Чтобы изменения вступили в силу, введите команду:

sudo sysctl -p

Осталось только настроить брандмауэр и можно запускать свой VPN-сервер. Будем считать, что используется брандмауэр UFW (в современных дистрибутивах используется вместо iptables). Вы должны знать имя публичного интерфейса, пусть это будет ens33 — для примера, в вашем случае имя публичного интерфейса будет отличаться. Выяснить чего можно командой: 

ip route | grep default 

Данное название нужно добавить в файл /etc/ufw/before.rules. В самое начало этого файла нужно добавить строки (также укажите IP-адрес и маску вашей подсети): 

# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 192.168.0.0/24 -o ens33 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Вместо ens33 нужно указать имя вашего публичного интерфейса. Теперь откройте файл nano /etc/default/ufw и найдите директиву DEFAULT_FORWARD_POLICY: 

DEFAULT_FORWARD_POLICY=«ACCEPT» 

Откроем порт для OpenVPN:

sudo ufw allow 443/tcp 

или 

sudo ufw allow 1194/udp 

Первую команду нужно вводить, если вы используете протокол TCP, вторую, если используется протокол UDP. Чтобы изменения вступили в силу, брандмауэр нужно перезапустить: 

sudo ufw disable
sudo ufw enable 

Все готово для запуска VPN-сервера. Запустим его командой: 

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 Tue
2018-01-23 19:46 0:05 EDT; 25s ago 

Если все нормально, тогда обеспечим автоматический запуск сервера: 

sudo systemctl enable openvpn@server 

Инфраструктура для клиентов 

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

mkdir -p ~/clients/files 
chmod 700 ~/clients/files 

Такие права доступа нужны, поскольку данный каталог будет содержать ключи клиентов. Далее установим базовую конфигурацию: 

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

Откройте файл ~/clients/base.conf. В нем нужно сделать несколько изменений: 

# Укажите IP-адрес сервера и порт (1193 для UDP или 443 для TCP)
remote IP-адрес порт
# Укажите протокол udp или tcp
proto протокол
# Раскомментируйте директивы
user nobody
group nogroup
# Найдите директивы ca, cert и key. Закомментируйте их
#ca ca.crt
#cert client.crt
#key client.key
# Добавьте параметры cipher и auth так, как они описаны в server.conf
cipher AES-128-CBC
auth SHA256
# Установите key-direction в 1
key-direction 1

Теперь создадим сценарий генерации файлов конфигурации (листинг 1.1): 

cd ~/clients
touch make_config
chmod +x make_config
mcedit make_config

Листинг 1.1. Файл make_config

#!/bin/bash


# First argument: Client identifier


KEY_DIR=~/openvpn-ca/keys

OUTPUT_DIR=~/clients/files

BASE_CONFIG=~/clients/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


Используя этот сценарий, вы сможете легко генерировать файлы конфигурации клиентов:

cd ~/clients
./make_config user1 

Если все прошло успешно, то в ~/clients/files вы найдете файл user1.ovpn.

Как подключиться 

После того, как создание собственного VPN сервера будет вами завершено, нужно передать файлы конфигурации клиентам. Как вы это сделаете — значения не имеет. Желательно передавать по безопасному каналу связи, например, по электронной почте с шифрованием или через sFTP. 

В Windows полученный.ovpn-файл нужно поместить в каталог C:\Program Files\OpenVPN\config, предварительно установив клиент OpenVPN для Windows. Загрузить эту программу можно с официальной странички проекта.

После запуска OpenVPN он должен автоматически увидеть ваш профиль. Щелкните на пиктограмме клиента на панели быстрого запуска правой кнопкой мыши и выберите команду Подключиться (рис. 2). 

OpenVPN для Windows

Рис. 2. OpenVPN для Windows 

В Linux первым делом установите openvpn: 

sudo apt-get install openvpn 

Откройте файл user1.ovpn, полученный с серверного компьютера. Раскомментируйте следующие строки:

script-security
up /etc/openvpn/update-resolv-conf 
down /etc/openvpn/update-resolv-conf 

Если в вашем дистрибутиве нет файла /etc/openvpn/update-resolv-conf, то делать ничего не нужно! 

Теперь подключитесь к своему VPN серверу:

sudo openvpn -config user1.ovpn

Собственно, на этом настройка сервера и клиентов окончена. Теперь вы знаете, как быстро создать собственный VPN сервер, и можете пользоваться безопасным Интернетом.

Получить консультацию специалиста
Персональный ассистент
Cloud.Xelent