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

OpenVPN — бесплатный VPN с открытым исходным кодом, который можно быстро и легко установить на любой сервер или VPS (для OpenVZ VPS перед установкой необходимо отправить запрос на support@unihost.com).

В этой статье мы разберем, как установить сервер OpenVPN на Ubuntu Server.

Требования

  • Сервер или VPS на Ubuntu Server 16.04 c OpenSSH.
  • Аккаунт на этом сервере с правами sudo (но не root-аккаунт).
  • Установленный фаервол UFW (опционально).

Установка OpenVPN

Для создания VPN, нам понадобятся пакеты openvpn и easy-rsa. Оба доступны в стандартном репозитории Ubuntu, поэтому необходимо обновить список пакетов на сервере и установить их.

sudo apt-get update
sudo apt-get install openvpn easy-rsa

Создание центра сертификации

Для шифрования, OpenVPN использует сертификаты SSL/TLS. Для их работы нужен специальный центр выдачи сертификатов. Для обеспечения максимальной безопасности, центр выдачи должен находится на отдельном сервере, но в современных системах он может быть размещен на том же ПК, что и VPN-сервер.

Сначала создаём папку для центра сертификации, потом переходим в неё.

make-cadir ~/openvpn-ca
cd ~/openvpn-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="RU"

export KEY_PROVINCE="NA"

export KEY_CITY="Moscow City"

export KEY_ORG="Unihost"

export KEY_EMAIL="admin@example.com"

export KEY_OU="TechSupport"

Находим строку:

export KEY_NAME=

Меняем её на:

export KEY_NAME="server"

Создаем установочный скрипт для центра сертификации и корневого сертификата на основе файла vars:

cd ~/openvpn-ca
source vars

Запускаем скрипт:

./build-ca

Нажимаем ENTER на все запросы.

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

Сначала, создаем сертификат OpenVPN и RSA-ключи для сервера. RSA-ключи используются для аутентификации пользователя.

./build-key-server server

Нажимаем ENTER на все запросы.

Видим запрос:

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.

Создаём ключи Диффи-Хелмана. Эти ключи используются для шифрования содержимого пакетов. Они очень сложные, поэтому на их создание может уйти несколько минут.

./build-dh

Создаём подпись HMAC, чтобы дать серверу возможность проверять целостность пакетов.

openvpn --genkey --secret keys/ta.key

Настройка OpenVPN

Сначала, копируем ключи сервера в папку openvpn.

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

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

sudo nano /etc/openvpn/server.conf\

Заменяем его содержимое на:

port 1194

# Протокол может быть UDP или TCP.

proto udp

# Если используете протокол TCP, поменяйте следующую строку на dev tap.

dev tun

# Указываем где находятся ключи для сервера.

ca /etc/openvpn/keys/ca.crt

cert /etc/openvpn/keys/server.crt

key /etc/openvpn/keys/server.key  # This file should be kept secret

dh /etc/openvpn/keys/dh2048.pem

# Задаем IP и маску виртуальной сети. Значения произвольные, но если вы не знаете, что вы делаете — оставьте эти.

server 10.8.0.0 255.255.255.0

# Указываем, где хранятся файлы с настройками IP-адресов клиентов.

client-config-dir ccd

# Включаем запоминание динамически выданных адресов для VPN-клиентов.

ifconfig-pool-persist ipp.txt

# Указываем сети, к которым нужно подключаться через туннель. По умолчанию, в список внесены все сети вообще.

route 192.168.0.0 255.255.255.0

# Включаем TLS

tls-server

tls-auth /etc/openvpn/keys/ta.key 0

tls-timeout 120

auth SHA256

cipher AES-128-CBC

# Если нужно, чтобы компьютеры клиентов считали, что они в локальной сети и  «видели» друг друга, удаляем ; в следующей строке.

;client-to-client

keepalive 10 120

# Включаем сжатие трафика.

comp-lzo

# Определяем максимум одновременно подключенных клиентов

max-clients 10

user nobody

group nogroup

# Запрещаем перечитывать ключи, а также закрывать и переоткрывать TUN\TAP устройство после получения команд SIGUSR1 или ping-restart.

persist-key

persist-tun

# Определяем, где будет хранится журнал.

status openvpn-status.log

log /var/log/openvpn.log

# Определяем, насколько подробным будет журнал

verb 3

# Определяем число одинаковых сообщения подряд

mute 20

# Чтобы отозвать какой-либо сертификат, удалите ; в строке ниже и смените адрес на адрес сертификата.

;crl-verify /etc/openvpn/crl.pem

# Разрешаем VPN-серверу насильно переключать клиентов на VPN-соединение.

push "redirect-gateway def1 bypass-dhcp"

# Разрешаем VPN-серверу передавать адрес внутреннего DNS-сервера для переключения клиентов на VPN-соединения.

push "dhcp-option DNS 208.67.222.222"

push "dhcp-option DNS 208.67.220.220"

При необходимости, меняем настройки в соответствии с комментариями.

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

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

sudo nano /etc/sysctl.conf

Находим строку:

# net.ipv4.ip_forward

Удаляем #. Получаем:

net.ipv4.ip_forward

Сохраняем и закрываем файл. Применяем настройки командой:

sudo sysctl -p

Настройка UFW (опционально)

Файрвол UFW должен быть установлен на каждом сервере с Ubuntu Server, для защиты от недоброжелателей, взломщиков, DDoS и других нежелательных соединений. Но по умолчанию, он запрещает и те соединения, что нужны нам для VPN.

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

ip route | grep default

В выдаче, публичный интерфейс следует за dev. Например, в нашем случае этот интерфейс называется enp3s0:

default via 192.168.1.254 dev enp3s0  proto static  metric 100

Открываем файл с правилами файрвола:

sudo nano /etc/ufw/before.rules

Добавьте в начало файла:

# START OPENVPN RULES

# NAT table rules

*nat

:POSTROUTING ACCEPT [0:0] 

# Allow traffic from OpenVPN client to enp3s0

-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE

COMMIT

# END OPENVPN RULES

Сохраняем и закрываем файл.

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

sudo nano /etc/default/ufw

Находим строку:

DEFAULT_FORWARD_POLICY="DROP"

Меняем её на:

DEFAULT_FORWARD_POLICY="ACCEPT"

Сохраняем и закрываем файл.

Теперь открываем порты для OpenVPN и OpenSSH:

sudo ufw allow 1194/udp
sudo ufw allow OpenSSH

И перезапускаем файрвол:

sudo ufw disable
sudo ufw enable

Файрвол сконфигурирован.

Включение OpenVPN

Выполняем команду:

sudo systemctl start openvpn@server

Смотрим, включился ли OpenVPN-сервер:

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 2016-05-03 15:30:05 EDT; 47s ago

Docs: man:openvpn(8)

Теперь настраиваем автоматическое включение OpenVPN при загрузке сервера:

sudo systemctl enable openvpn@server

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

Клиент — это устройство, которое подключается к серверу. Для каждого клиента нужно создавать отдельный ключ.

Для первого ключа, мы будем использовать имя клиента client1.

  • Если вы хотите создать сертификаты без пароля (менее безопасны, но лучше подходят для автоматических соединений):
    cd ~/openvpn-ca
    
    source vars
    
    ./build-key client1
  • Если вы хотите создать сертификаты с паролями:
    cd ~/openvpn-ca
    
    source vars
    
    ./build-key-pass client1

Вы можете заменить client1 на другое имя ключа. Но имейте в виду, что это нужно будет сделать и во всех последующих командах, где это имя выделено зеленым.

Нажимаем ENTER на все запросы.

Видим запрос:

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.

Ключи успешно созданы.

Создание инфраструктуры настройки клиентов

Создаём папку для хранения файлов конфигурации:

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

Меняем содержимое файла на:

client

dev tun

proto udp

# Внешний IP, на или за которым находится ваш сервер OpenVPN и его порт

remote 111.222.333.444 1194

# необходимо для DynDNS

resolv-retry infinite

user nobody
group nogroup

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

#ca /etc/openvpn/keys/ca.crt

#cert /etc/openvpn/keys/client.crt

#key /etc/openvpn/keys/client.key

tls-client

tls-auth /etc/openvpn/keys/ta.key 1

auth SHA256

cipher AES-128-CBC

remote-cert-tls server

comp-lzo

persist-key

persist-tun

key-direction 1

status openvpn-status.log

log /var/log/openvpn.log

verb 3

mute 20

# Если ваши клиенты работают на Linux и используют файл /etc/openvpn/update-resolv-conf — раскомментируйте эти строки.

# script-security 2

# up /etc/openvpn/update-resolv-conf

# down /etc/openvpn/update-resolv-conf

Меняем IP, прописанный в файле (выделен красным), на IP сервера.

Сохраняем и закрываем файл.

Теперь создаём и открываем скрипт, который будет генерировать конфигурационные файлы клиентов на основании этих настроек.

nano ~/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 '<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

Создание конфигурационных файлов клиентов

Запускаем скрипт и создаём конфигурационный файл для client1.

cd ~/client-configs
./make_config.sh client1

Проверяем, успешно ли он создан:

ls ~/client-configs/files

Правильный ответ:

client1.ovpn

Перенос конфигурационного файла на клиент

Есть много способов перенести конфигурационный файл на устройство-клиент. Самые безопасные — SFTP и SCP. К счастью, у нас на сервере уже установлен OpenSSH, который поддерживает SFTP.

  • Если клиент — ПК на Linux или Mac, то выполняем команду на перенос конфигурационного файла в папку home:
sftp ИМЯ_УЧЕТНОЙ_ЗАПИСИ_НА_СЕРВЕРЕ@IP_АДРЕС_СЕРВЕРА:client-configs/files/client1.ovpn ~/
  • Если клиент — ПК на Windows, то мы рекомендуем использовать FileZilla.
    • Открываем FileZilla.
    • Находим панель Быстрое соединение вверху окна.
    • В строке Хост, вводим sftp.IP_АДРЕС_СЕРВЕРА.
    • В поле Имя пользователя, вводим имя учетной записи Ubuntu на сервере.
    • В поле Пароль, вводим пароль к учетной записи Ubuntu на сервере.
    • В поле Порт, вводим 22.
    • Нажимаем Быстрое соединение.
    • Нажимаем ОК, когда система предупредит нас, что ключ хоста ей неизвестен.
    • Переходим в папку client-configs/files/
    • Скачиваем из неё файл client1.ovpn на свой ПК.
  • Если клиент — устройство на iOS, скачиваем FTPmanager. После этого, переходим по ссылке: sftp://ИМЯ_УЧЕТНОЙ_ЗАПИСИ_НА_СЕРВЕРЕ@IP_АДРЕС_СЕРВЕРА:client-configs/files/ и скачиваем файл client1.ovpn на своё устройство.
  • Если клиент — устройство на Android, то скачиваем и устанавливаем andFTP. Переходим по ссылке: sftp://ИМЯ_УЧЕТНОЙ_ЗАПИСИ_НА_СЕРВЕРЕ@IP_АДРЕС_СЕРВЕРА:client-configs/files/ и скачиваем файл client1.ovpn на своё устройство.
Теги: