VPN на VPS

У цій статті ми переважно будемо використовувати Ubuntu 16.04 і команди, що в основному використовуються в дистрибутивах, що базуються на Debian.

Встановлення OpenVPN:

Виконаємо такі команди, щоб встановити OpenVPN и easy-rsa:
# apt update && apt upgrade 
# apt install easy-rsa openvpn -y

Перша команда оновлює VPS, друга - встановлює VPN сервер.

Встановіть каталог для CA-сертифікатів. OpenVPN – це VPN, який орієнтується на TLS/SSL. Це значить, що він використовує сертифікати для шифрування трафіку між сервером і клієнтом. Щоб випустити довірені сертифікати, нам буде потрібно встановити наш власний простий уентр сертифікації (СА). 1. Спочатку скопіюємо каталог з easy-rsa шаблоном у наш домашній каталог командою make-cadir:

$ make-cadir ~/openvpn-ca

2. Перейдемо у новостворений каталог, що почати налаштування CA:

$ cd ~/openvpn-ca

3. Конфігуруємо змінні 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="UA"
export KEY_PROVINCE="Kiyv"
export KEY_CITY="Kiyv"
export KEY_ORG="ABC Hosting"
export KEY_EMAIL="happyuser@zzz.com.ua"
export KEY_OU="Community"
. . .
Доки ми ще тут, потрібно змінити значення змінної KEY_NAME прямо під розділом, який заповнює поле subject. Щоб спростити задачу, у цьому гайді називатимемо його “server”:

export KEY_NAME="server"
Після закінчення збережіть і закрийте файл. Щоб зробити це у редакторі nano, використайте комбінацію ctrl+o і натисніть enter для збереження, а ctrl+x – щоб вийти. 4. Тепер ми можесо використовувати встановлені змінні та утиліти easy-rsa, щоб зібрати власний центр сертифікації. Переконайтеся, що ви знаходитеся у своєму CA-каталозі, та виконайте команду source vars (файл, який ви тільки що редагували):

$ cd ~/openvpn-ca
$ source vars
Якщо команда була виконана правильно, ви повинні побачити таке: NOTE: If you run
./clean-all
, I will be doing a
rm -rf on /home/sammy/openvpn-ca/keys
Переконайтеся, що ви працюєте у «чистому» оточені. Для цього наберіть:
$ ./clean-all
Тепер можемо зібрати кореневий CA. Виконаємо:

$ ./build-ca
Ця дія запускає процес створення ключа кореневого центра сертифікації та самого сертифіката. Оскільки раніше ми вже редагували файл vars, то усі значення мають бути проставлені автоматично. Просто натискайте ENTER протягом сеансу, щоб підтвердити необхідні значення.

Приклад результату:
Generating a 2048 bit RSA private key
..........................................................................................+++
...............................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated 
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [UA]:
State or Province Name (full name) [Kyiv]:
Locality Name (eg, city) [Kyiv]:
Organization Name (eg, company) [ABC Hosting]:
Organizational Unit Name (eg, section) [Community]:
Common Name (eg, your name or your server's hostname) [ABC Hosting CA]:
Name [server]:
Email Address [happyuser@zzz.com.ua]:
Тепер ми маємо CA, який можна використовувати для створення інших необхідних нам файлів. 5. Створимо сертифікат сервера, ключ та файли шифрування. Далі ми генеруємо пару ключа та сертифіката сервера, а також деякі додаткові файли, які будуть використовуватися у процесі шифрування. Запускаємо створення пари сертифіката і сервера і ключа. Робимо це такою командою:
$ ./build-key-server server
Увага: якщо ви наберете тут ім’я, яке відрізняється від «server», необхідно буде скоригувати деякі моменти нижче з із використанням даної інструкції. Наприклад, коли ви копіюєте хгенеровані файли в каталог /etc/openvpn, необхідно замінити імена на коректні. Пізніше необхідно буде також змінити файл /etc/openvpn/server.conf, щоб ввказати правильні файли .crt та .key. Тож, змінні будуть мати значення за замовчуванням, яке буде засноване на аргументах, які ми тільки що передали (server), і змісту отриманого нами файлу vars. Натискайте ENTER та приймайте значення за замовчуванням. Для цього не потрібно вводити пароль. Під кінець встановлення буде необхідно відповісти `y` на два питання, щоб підписати і підтвердити сертифікат.
Приблизний результат:
. . .

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
Write out database with 1 new entries
Data Base Updated
Далі ми згенеруємо кілька додаткових елементів. Ми можемо створити стійкі ключі Діффі-Хеллмана, щоб використовувати їх під час обміну ключами. Для цього наберемо:
$ ./build-dh
Це може забрати кілька хвилин. Після згенеруємо підпис HMAC, щоб посилити можливості перевірки цілісності TLS сервера:
$ openvpn --genkey --secret keys/ta.key
6. Генерація пари клієнтського сертифікату і ключа: Далі ми можемо згенерувати пару клієнтського сертифіката і ключа. Хоча це можна зробити на машині-клієнті і після цього підписати сервером/CA з міркувань безпеки, але у цій інструкції ми створимо його на сервері для простоти. Ми згенеруємо одиничний клієнтський ключ/сертифікат, але якщо ви маєте більше одного клієнта, цю процедуруможна повторити стільки разів, скільки потрібно. Надайте скрипту унікальне значення для кожного кдієнта. Оскільки ви можете повернутися до цього кроку пізніше, ми перевипустимо файл var. У цій інструкції будемо використовувати client1 як значення для нашої першої пари сертифікат/ключ. Для створення повноважеь без пароля для автоматичних з’єднань використовуйте команду зборки ключа:
$ cd ~/openvpn-ca
$ source vars
$ ./build-key client1
І навпаки, якщо хочете створювати захищені паролеми дані доступа, використовуйте команду build-key-pass:
$ cd ~/openvpn-ca
$ source vars
$ ./build-key-pass client1
Налаштування за замовчуванням знову повинні бути встановлені, тому ви можете просто натиснути ENTER для продовження. Залиште запит на пароль пустим і натисніть ENTER на підказку `y`, коли з’явиться запит на підпис і запам’ятовування сертифікату. 7. Налаштування сервісу OpenVPN Далі ми можемо почати налаштування сервісу OpenVPN з використанням даних доступу і згенерованих нами файлів. Для початку ми повинні скопіювати файли, які нам потрібні, у каталог налаштування /etc/oopenvpn. Ми можемо почати з тих файлів, які ми тільки що згенерували. При створенні вони були поміщені у каталозі
~/openvpn-ca/keys
. Нам потрібно перемістити наш CA, сертифікат і ключ, сертифікат серверу і ключа, підпис 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
По-перше, знайдемо секцію HMAC за допомогою пошуку директиви tls-auth. Видалимо ";" щоб розкоментувати рядок tls-auth. Під ним додамо параметр key-direction і встановимо його значенняи на "0":
/etc/openvpn/server.conf:
tls-auth ta.key 0 # This file is secret
key-direction 0
Далі знайдіть секцію криптографічного шифру за допомогою пошуку закоментованого рядку шифру. AES-128-CBC це високий рівень шифрування, він добре підтримується. Видаліть ";", щоб розкоментувати рядок шифру AES-128-CBC:
/etc/openvpn/server.conf:
cipher AES-128-CBC
Нижче додайте аутентифікаційний рядок для вибору алгоритму повідомлень HMAC. SHA256 – хороший вибір для цього.
/etc/openvpn/server.conf:
auth SHA256
І нарешті знайдіть налаштування користувача і групи і видаліть ";" на посатку, щоб розкоментувати ці рядки.
/etc/openvpn/server.conf:
user nobody
group nogroup
(Факультативно) Можливим є передавання налаштувань DNS, щоб перенаправити увесь трафік через VPN. Вищевказані налаштування створюють з’єднання VPN між двома машинами, але не перенаправлять усі з’єднання в тунелі. Якщо ж ви хочете використовувати VPN для маршрутизації усього вашого трафіку, ви, вірогідно, схочете передати налаштування DNS клієнтському комп’ютеру. Це можна зробити, розкоментувавши деякі директиви, які сконфігурують клієнтську машину, щоб перенаправити увесь веб-трафік через VPN. Знайдіть розділ redirect-gateway і видаліть точку з компою на початку рядка, щоб розкоментувати:
/etc/openvpn/server.conf:
push "redirect-gateway def1 bypass-dhcp"
Просто під ним знайдіть секцію dhcp-option. Знову видаліть ";" на почтаку обидвох рядків, щоб розкоментувати їх:
/etc/openvpn/server.conf:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Це має допомогти клієнтам переналаштувати їхні установки DNS, щоб використовувати VPN-тунель як шлюз за замовчуванням. (Факультативно) Додатково можна налаштувати порт і протокол. За замовчуванням сервер OpenVPN використовує порт 1194 і протокол UDP для приймання клієнтських з’єднань. Якщо вам потрібно використовувати інший порт через обмеження мережі, в яких можуть знаходитися ваші клієнти, ви можете змінити опцію port. Якщо ви не розміщуєте веб-контент на вашому OpenVPN-сервері, порт 443 – це популярне рішення, оскільки зазвичай є дозволеним для доступу через файєрвол.
/etc/openvpn/server.conf:
# Optional!
port 443
Частіше за все, доступ до цього порту за протоколом заборонений. Якщо це так, змініть протокол з UDP на TCP:
/etc/openvpn/server.conf:
# Optional!
proto tcp
Якщо вам не потрібно використовувати інший порт, краще залишити ці дві установки за замовчуванням. (Факультативно) Встановлення даних не за замовчуванням. Якщо ви раніше обрали інше ім’я піл час виконання команди ./build-key-server, змініть рядки cert і key, щоб вказати підходящі файли .crt і .key. Якщо ви використовували сервер за замовчуванням, це значення вже ма бути встановлене правильно:
/etc/openvpn/server.conf:
cert server.crt
key server.key
Після закінчення збережіть і закрийте файл. 8. Налаштування мережевої конфігурації сервера Далі нам необхідно налаштувати деякі аспекти мережевої конфігурації сервера, щоб OpenVPN міг правильно маршрутизувати трафік. Дозволимо IP Forwarding (передача пакетів між інтерфейсами передача). По-перше, нам необхідно дозволити серверу пересилання трафіку між інтерфейсами. Це доволі суттєво для бажаної функціональності нашого VPN сервера. Ми можемо це налаштувати, змінивши файл /etc/sysctl.conf
# sudo nano /etc/sysctl.conf
Там знайдемо рядок, який встановлює net.ipv4.ip_forward. Видалимо символ "#" на початку рядка , щоб розкоментувати цю установку:
/etc/sysctl.conf:
net.ipv4.ip_forward=1
Коли закінчите, збережіть і закрийте файл. Щоб відкрити його і застосувати значення у поточному сеансі, наберіть:
# sudo sysctl -p
Тепер потрібно встановити iptables і налаштувати правила файєрвола:
# apt install iptables
Для налаштування правил виконайте наступне:
# iptables -A INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT
# iptables -A INPUT -i tun+ -j ACCEPT
# iptables -A FORWARD -i tun+ -j ACCEPT
# iptables -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# iptables -A OUTPUT -o tun+ -j ACCEPT
Також, будь ласка, виконайте цю дію, щоб виправити файл служби systemd для openvpn:
$ sudo sed -i 's/LimitNPROC=10 /#LimitNPROC=10 /' /lib/systemd/system/openvpn@.service
9. Нам потрібно запустити сервер OpenVPN вказанням імені нашого файла конфігурації як змінної екземпляру після імені файлу systemd. Наш файл конфігурації для сервера називається /etc/openvpn/server.conf, тому ми додамо @server в кінець unit файлу під час його виклику:
$ sudo systemctl start 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)
           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
Ви повинні побачити налаштований інтерфейс:
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
10. Створення інфраструктури клієнтської конфігурації. Далі нам необхідно встановити систему контролю, яка дозволитьнам ленгко створювати файли клієнтської конфігурації. Створіть структуру каталогів у вашому домашньому каталозі, щоб зберегти файли:
$ 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. Вона направляє клієнта на адресу OpenVPN сервера. Это дожен быть публичный IP-адрес нашего сервера OpenVPN. Если вы изменили порт, который прослушивает OpenVPN сервер, измените 1194 на выбранный:
~/client-configs/base.conf:
. . .
# 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
. . .
Переконайтеся, що протокол співпадає зі значенням. яке використовується у серверній конфігурації:
~/client-configs/base.conf:
proto udp
Далі видаляємо ";". Розкоментуйте директиви user та group:
~/client-configs/base.conf:
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
Знайдіть директиви, які встановлюють центр сертифікації, сертифікат і ключ. Розкоментуйте ці директиви, оскільки ми будемо додавати сертифікати та ключі у сам файл:
~/client-configs/base.conf:
# 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:
~/client-configs/base.conf:
cipher AES-128-CBC
auth SHA256
Далі додайте директиву key-direction десь у файлі. Вона повинна бути виставлена у значенні "1" для роботи із сервером:
~/client-configs/base.conf:
key-direction 1
І нарешті, додайте кілька розкоментованих рядків. Ми використовуємо їх у кожному конфігу, але включати їх потрібно тільки для Linux-клієнтів з файлом /etc/openvpn/update-resolv-conf:
~/client-configs/base.conf:
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
Якщо ваш клієнт запущено в Linux, і він використовує файл /etc/openvpn/update-resolv-conf, то ви повинні розкоментувати ці рядки зі згенерованого клієнтського файла конфігурації OpenVPN. Збережіть файл, коли закінчите. Далі ми створимо простий скрипт для компіляції нашої базової конфігурації із відповідними файлами сертифікату, ключа та шифрування. Він помістить згенеровану конфігурацію у каталог ~/client-configs/files. Створіть і відкрийте файл, який має назву make_config.sh в каталоге ~/client-configs:
$ nano ~/client-configs/make_config.sh
Всередину вставте відповідний скрипт:
~/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 '') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '\n') \
    ${KEY_DIR}/ta.key \
    <(echo -e '') \
    > ${OUTPUT_DIR}/${1}.ovpn
Збережіть та закрийте файл, коли закінчите. Відмітьте його як такий, що виконується, такою командою:
$ chmod 700 ~/client-configs/make_config.sh
Створення клієнтських налагтувань виконуєтьс таким чином. Якщо ви слідували цій інструкції, ви створили сертифікат і ключ клієнта, які називаються client1.crt та client1.key запуском команди ./build-key client1. Ми можемо згенерувати конфіг для цих облікових даних, перемістивши їх у наш каталог ~/client-configs і використавши створений скрипт:
$ cd ~/client-configs
$ ./make_config.sh client1
Якщо дії було виконано правильно, то у каталозі ~/client-configs/files должен з’явиться файл client1.ovpn:
$ ls ~/client-configs/files
Результат:
client1.ovpn
Також вам потрібно передати файл клієнтської конфігурації на відповідний пристрій. Наприклад, це може бути ваш локальний комп’ютер чи мобільний пристрій. Хоча вибір конкретного додатку, який буде використовуватися для передачі, буде залежати від вашого вибору і операційної системи пристрою, бажано, щоб цей додаток використовував протокол SFTP (SSH FTP) або SCP (Secure Copy). Це передасть файли вашої клієнтської VPN аутентифікації через зашифроване. Ось приклад використання команди SFTP з використанням файлу client1.ovpn. Ця команда може бути виконана з вашого локального комп’ютера (на OS X або Linux). Вона переміщує файл .ovpn у домашній каталог:
$ scp sammy@openvpn_server_ip:client-configs/files/client1.ovpn ~/
Для безпечного передавання файлів з серверу на локальний комп’ютер можна використвувати, наприклад. WinSCP, Filezilla. Файл OVPN може використовуватися OpenVPN клієнтом на Windows чи Mac OS. У Linux наявна графічна система Network Manager, яка оже працювати з файлами .ovpn.