OpenVPN на Ubuntu 16.04: настройка

1 комментарий
OpenVPN на Ubuntu 16.04

В статье «OpenVPN на Ubuntu 16.04: установка» было рассказано о том, как установить OpenVPN и создать другие необходимые элементы на вашем сервере. В этой статье я расскажу о следующих шагах – правильной настройке OpenVPN на Ubuntu 16.04.

1. Настройка OpenVPN

Начните с копирования файлов в директорию OpenVPN. Скопировать нужно будет все файлы, которые позже понадобятся в конфигурационной директории /etc/openvpn.

Начать лучше с тех файлов, которые были созданы ранее (о них можно прочитать в предыдущей статье): они были помещены в директорию ~/openvpn-ca/keys. Конкретные файлы, которые нужно будет переместить: сертификат и ключ центра сертификации, сертификат сервера и ключ, а также подпись 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

Базовая конфигурация

Вам нужно найти директиву tls-auth для того, чтобы, в свою очередь, найти секцию HMAC. Удалите знак точки с запятой (;) для того, чтобы раскомментировать строку tls-auth. А ниже добавьте параметр key-direction со значением 0:

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

Следующая задача – найти секцию с криптографическим шифром, и для этого вам нужно найти закомментированные строки cipher. Шифр AES-128-CBC имеет хороший уровень защиты и отличную поддержку разными продуктами. Удалите точку с запятой для того, чтобы раскомментировать строку cipher AES-128-CBC:

cipher AES-128-CBC

Ниже добавьте строку auth для того, чтобы указать алгоритм хеширования HMAC. SHA256 прекрасно подойдет, т.к. в этом случае допускается использование ключей любого размера, а длина хеш-последовательности будет составлять 256 бит.

auth SHA256

Наконец, найдите настройки user и group и все так же удалите точку с запятой для того, чтобы раскомментировать их:

user nobody
group nogroup

Как использовать VPN для всего трафика

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

Надо раскомментировать несколько директив для того, чтобы клиентские машины по умолчанию перенаправляли весь трафик через VPN. Найдите секцию 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 протокол для того, чтобы принимать клиентские соединения. Возможно, вам надо будет изменить порт, если вы столкнетесь с какими-нибудь ограничениями.

Сделать это можно в строке port в файле /etc/openvpn/server.conf. Например, вы можете изменить порт на 443, так как обычно он разрешен для использования большинством фаерволов.

# Optional!
port 443

Если протокол, который вы используете, имеет ограничения по номеру порта, то в строке proto вам нужно изменить UDP на TCP:

# Optional!
proto tcp

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

2. Сетевая конфигурация сервера

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

Отправка IP

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

Изменения необходимо вносить в файл /etc/sysctl.conf, поэтому сначала нужно открыть его:

$ sudo nano /etc/sysctl.conf

Теперь найдите строку с net.ipv4.ip_forward. Раскомментируйте ее, удалив знак решетки в начале:

net.ipv4.ip_forward=1

Затем сохраните и закройте файл.

Для того, чтобы применить изменения к вашему сеансу, наберите:

$ sudo sysctl -p

Настройка UFW правил для сокрытия клиентских соединений

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

$ ip route | grep default

Название вашего публичного интерфейса будет иди сразу после слова “dev’. В примере ниже интерфейс называется wlp22s0:

default via 203.0.113.1 dev wlp22s0 proto static metric 600

Увидели и запомнили название интерфейса? Тогда идем дальше. Откройте файл /etc/ufw/before.rules для того, чтобы добавить нужную конфигурацию:

$ sudo nano /etc/ufw/before.rules

В этом файле содержатся настройки, которые следует внести до того, как будут применены правила UFW. Ближе к началу файла добавьте строки, написанные ниже (вставить их можно после закомментированного блока rules.before):

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

Обратите внимание, что в строчке -A POSTROUTING нужно вставить то название интерфейса, которое вы выяснили ранее.

Внесенное изменение позволяет установить правила. которые по умолчанию будут применяться к цепочке POSTROUTING (именно эта цепочка отвечает за маскарадинг) в таблице nat, и весь трафик, который идет от VPN, будет скрыт.

После внесенного изменения сохраните и закройте файл.

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

$ sudo nano /etc/default/ufw

И в нем найдите директиву DEFAULT_FORWARD_POLICY. Ее значение с DROP нужно изменить на ACCEPT.

DEFAULT_FORWARD_POLICY="ACCEPT"

Затем сохраните и закройте файл.

Открытие порта OpenVPN и применение изменений

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

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

Также нужно будет добавить SSH-порт (если ранее вы этого не сделали):

$ sudo ufw allow 1194/udp
$ sudo ufw allow OpenSSH

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

$ sudo ufw disable
$ sudo ufw enable

Теперь сервер настроен правильно для того, чтобы работать с OpenVPN трафиком.

3. Запуск OpenVPN

Наконец все готово для того, чтобы запустить OpenVPN на вашем сервере. Для этого нужно использовать команду systemd.

Для запуска сервера OpenVPN нужно обязательно указать название конфигурационного файла в качестве образца переменной после названия файла systemd. Конфигурационный файл в данном случае имеет название /etc/openvpn/server.conf, а значит, в конце юнит-файла надо написать @server.

Команда будет выглядеть так:

$ sudo systemctl start openvpn@server

Проверьте, что все запустилось корректно:

$ sudo systemctl status openvpn@server

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

Output
● 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

В выводе вы увидите конфигурацию интерфейса:

Output
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

4. Клиентская инфраструктура

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

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

Создайте структуру директорий внутри вашей домашней директории – это место будет использоваться для хранения файлов:

$ 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. Она указывает клиенту, какой IP-адрес имеет сервер OpenVPN. Этот адрес обязательно должен быть публичным. Если ранее вы изменили порт для сервера OpenVPN, то измените его в этом файле тоже:

. . .
# 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
. . .

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

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

А настройки cipher и auth скопируйте из файла /etc/openvpn/server.conf:

cipher AES-128-CBC
auth SHA256

И еще куда-нибудь в файл вам нужно добавить директиву key-direction, задав ей обязательно значение 1:

key-direction 1

Наконец, добавьте и несколько закомментированных строк, которые будут использоваться только для клиентов Linux, использующих файл /etc/openvpn/update-resolv-conf.

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

Поэтому если клиент использует Linux, и у него есть файл /etc/openvpn/update-resolv-conf, нужно раскомментировать эти строки в сгенерированном клиентском конфигурационном файле OpenVPN.

После всех этих изменений сохраните файл.

5. Скрипт генерации конфигурационных файлов

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

Сгенерированные конфигурации будут находиться в директории ~/client-configs/files.

Создайте и откройте файл под названием make_config.sh в директории ~/client-configs:

$ 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

6. Генерация клиентских конфигураций

Теперь вы можете легко генерировать клиентские конфигурационные файлы.

Если вы выполняли действия из статьи «OpenVPN на Ubuntu 16.04: установка», то у вас уже есть клиентский сертификат и ключ client1.и client1.key. Созданный выше скрипт можно использовать для того, чтобы создать конфигурацию для этих файлов (но перед этим нужно перейти в соответствующую директорию):

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

Если все было выполнено правильно, у вас должен появиться файл client1.ovpn в директории ~/client-configs/files. Проверьте:

$ ls ~/client-configs/files

Вывод на экране:

client1.ovpn

Передача конфигурации клиентским машинам

После создания клиентского конфигурационного файла необходимо его передать на соответствующее устройство (к примеру, компьютер или смартфон).

То, как вы будете передавать файл, напрямую зависит от того, какую операционную систему использует ваш компьютер, и вашего личного желания. Однако лучше все-таки использовать SFTP (протокол для безопасного копирования файлов) либо SCP на бэкенде. Таким образом файлы будут переданы по защищенному соединению.

Например, если вы хотите использовать SFTP для передачи client1.ovpn с компьютера на Linux или Mac OS, то используйте такую команду:

$ sftp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/

Файл будет перемещен в домашнюю директорию.

7. Установка клиентской конфигурации

Теперь нужно поговорить о том, как установить клиентский VPN профиль на разных устройствах. В этой статье я расскажу о том, как это сделать на компьютерах на Windows и Linux.

Соединение OpenVPN имеет такое же название, как и файл .ovpn. Например, в данном случае мы работаем с файлом client1.ovpn, который был создан для первого клиента.

Windows

Установка

Клиентское приложение OpenVPN для Windows вы можете найти на странице загрузок OpenVPN.

Выбирайте в зависимости от вашей версии Windows. Обратите внимание, что для установки вы должны обладать административными правами.

После установки OpenVPN скопируйте файл .ovpn в следующую папку: C:\Program Files\OpenVPN\config
После запуска OpenVPN программа автоматически увидит профиль и сделает его доступным.

OpenVPN надо всегда запускать от имени администратора, даже в тех случаях, когда вы уже зашли под административным аккаунтом. Для этого надо нажать правой кнопкой мыши на значке программы и выбрать «Запуск от имени администратора». А значит, обычным пользователям для запуска OpenVPN придется вводить административный пароль.

Для того, чтобы OpenVPN всегда запускался от имени администратора, вам нужно щелкнуть правой кнопкой мыши на иконке и зайти в «Свойства». Во вкладке «Совместимость» нажмите кнопку «Изменить параметры для всех пользователей», а в следующем окне – «Запуск программы от имени администратора».

Соединение

При запуске OpenVPN Windows будет всегда спрашивать, можно ли программе вносить изменения в ваш компьютер, и вам нужно нажимать «Да». Запуск клиента OpenVPN не устанавливает соединение автоматически, а помещает программу в область уведомлений (системный трей) для того, чтобы вы могли включать и выключать использование VPN.

После того, как вы запустили OpenVPN, вам нужно установить соединение. Сделать это можно следующим образом: нажмите правой кнопкой на иконке OpenVPN в области уведомлений, в контекстном меню выберите client1 и нажмите «Соединиться» (Connect).

Пока будет работать соединение, вы будете видеть его лог в окне статуса.

Отсоединиться от VPN можно таким же способом: нажав правую кнопку мыши на иконке OpenVPN в трее, вам нужно выбрать клиентский профиль и нажать «Отсоединиться» (Disconnet).

Linux

Установка

Если вы используете Linux, то есть несколько возможных инструментов, которые вы можете использовать (в зависимости от конкретной системы, которую вы используете).

Если это Ubuntu или Debian, то для установки используйте такие команды:

$ sudo apt-get update
$ sudo apt-get install openvpn

Для CentOS надо сначала установить EPEL репозитории и затем установить OpenVPN

$ sudo yum install epel-release
$ sudo yum install openvpn

Настройка

Проверьте, есть ли в вашем дистрибутиве скрипт /etc/openvpn/update-resolv-conf:

$ ls /etc/openvpn

Вывод:

update-resolve-conf

Дальше откройте клиентский конфигурационный файл OpenVPN, который вы передали ранее:

$ nano client1.ovpn

Раскомментируйте три строчки, которые добавляли ранее в DNS настройках:

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

В случае с CentOS поменяйте group c nogroup на nobody:

group nobody

Затем сохраните и закройте файл.

Теперь вы можете использовать VPN при помощи команды openvpn:

$ sudo openvpn --config client1.ovpn

После этого вы подключитесь к серверу.

Timeweb

Комментарии

Пора обновлять инструкцию:
1. После обновления версии не работает скрипт выбора сертификата, надо добавлять правило
2. cipher AES-128-CBC выдает ошибку, теперь по умолчанию минимальный cipher AES-256-CBC
3. Теперь не работает настройка ufw, просто падает и все.
Соответственно OpenVPN не работает