Востаннє змінено 17/03/2022
Враховуючи повсюдне поширення сервісів VPN, думаю, буде зайвим пояснювати для чого вони взагалі потрібні. Також не буду пояснювати, чому досить небезпечно користуватись безкоштовними VPN, та й до платних потрібно скептично приглядатись. Основне, що у цій статті докладно розкажу – як налаштувати власний безпечний VPN сервер на будь-якому віртуальному сервері (VPS).
Розглянемо на прикладі двох лінукс-дистрибутивів – Arch Linux та Ubuntu. Налаштовувати будемо досить просте, але захищене безкоштовне ПЗ OpenVPN. Клієнтські програми наявні для усіх масових ОС, а конфігурація клієнта потребує всього одного файлу із сертифікатами. До всього є підтримка IPv6. І попри те, що проект open-source, є хороша підтримка спільноти. Просто ідеально для персонального використання.
Тут і далі важливі практичні навички роботи з терміналом. Якщо Ви ніколи не працювати з лінукс-системами – це не для вас.
VPS
VPS (Virtual Private Server) – повноцінний віртуальний сервер, який можна орендувати/придбати у провайдерів з усього світу. Оскільки сервер віртуальний, Ви отримуєте певну частку ресурсів і потужностей фізичного сервера. Такі потужності зазвичай досить обмежені і недостатні для запуску складного ПЗ, проте більш як достатні для хостингу кількох веб-додатків, власного поштового серверу, VPN-серверу або іншого, що неможливо на класичному веб-хостингу. І саме завдяки віртуальному обмеженні ресурсів, ціна на VPS суттєво менша за оренду виділеного сервера (VDS).
Отож, спершу потрібно придбати VPS. Можу рекомендувати OVHcloud – ціна починається із 6 доларів на місяць (на момент написання статті). За цю вартість надається одне віртуальне ядро CPU, 2 Гб оперативної пам’яті та 40 Гб дискового простору на SSD. Для VPN серверу власного користування до 10 клієнтів – більш як достатньо.
На вибір операційних систем надаються безкоштовні дистрибутиви лінукс або платна ОС Windows Server. Також є на вибір один із восьми дата-центрів, потужності фізичних серверів яких будуть використовуватись. Зазначу, це не обмежить “локацію” нашого VPN – пізніше можна докупити IP-адреси інших дата-центрів і приєднати до вже купленого VPS, отримавши пожливість “роботи” із тих інших локацій теж.
Після покупки, операційна система зазвичай встановлюється автоматично, якщо інше не передбачено провайдером.
Налаштування VPN сервера
Спершу встановлюємо необхідне програмне забезпечення. Тут і далі команди розділені для Arch Linux та для Ubuntu.
Arch Linux:
# pacman -S openvpn
# pacman -S easy-rsa
Ubuntu:
# apt install openvpn easy-rsa
Сертифікати і ключі будемо створювати із Easy-RSA. Найкращою практикою є використання окремої системи для Центру сертифікації (Certificate Authority, CA), але за умови персонального користування, умовно безпечно всі сертифікати створювати і підписувати на одній і тій же машині.
Переходимо в папку Easy-RSA (важливо виконувати команди саме у ній!) і створюємо CA.
Arch Linux:
# cd /etc/easy-rsa
# export EASYRSA=$(pwd)
# easyrsa init-pki
# easyrsa build-ca
Ubuntu:
# mkdir /etc/easy-rsa
# cd /etc/easy-rsa
# cp -r /usr/share/easy-rsa/* ./
# ./easyrsa init-pki
# ./easyrsa build-ca
Програма попросить Вас ввести пароль, важливо використати надійний. Далі дублюємо CA в папку OpenVPN.
Arch Linux/Ubuntu:
# cp /etc/easy-rsa/pki/ca.crt /etc/openvpn/server/ca.crt
Створюємо сертифікати для сервера, підписуємо його, переміщаємо у папку налаштувань сервера OpenVPN. Назву сервера servername можна замінити на свою власну, за бажанням.
Arch Linux:
# easyrsa gen-req servername nopass
# easyrsa sign-req server servername
# cp /etc/easy-rsa/pki/private/servername.key /etc/openvpn/server/
# cp /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/
Ubuntu:
# ./easyrsa gen-req servername nopass
# ./easyrsa sign-req server servername
# cp /etc/easy-rsa/pki/private/servername.key /etc/openvpn/server/
# cp /etc/easy-rsa/pki/issued/servername.crt /etc/openvpn/server/
Створюємо додаткові необхідні сертифікати.
Arch Linux/Ubuntu:
# openssl dhparam -out /etc/openvpn/server/dh.pem 2048
# openvpn --genkey --secret /etc/openvpn/server/ta.key
Створюємо і підписуємо сертифікати для клієнта. Назву клієнта client1 можна замінити на свою власну, за бажанням.
Arch Linux:
# easyrsa gen-req client1 nopass
# easyrsa sign-req client client1
Ubuntu:
# ./easyrsa gen-req client1 nopass
# ./easyrsa sign-req client client1
Генеруємо список анульованих сертифікатів.
Arch Linux:
# easyrsa gen-crl
# cp /etc/easy-rsa/pki/crl.pem /etc/openvpn/server/
Ubuntu:
# ./easyrsa gen-crl
# cp /etc/easy-rsa/pki/crl.pem /etc/openvpn/server/
Створюємо файл налаштувань для OpenVPN сервера.
Arch Linux/Ubuntu:
# nano /etc/openvpn/server/server.conf
Показана нище конфігурація використовує IPv6 та згенеровані вище сертифікати, визначає порт (доброю практикою буде використати свій унікальний), а також повідомляє клієнтів сервера, що весь трафік буде проходити виключно через нього. Окремо вказується DNS сервер, у цьому випадку це сервер від Google.
Arch Linux:
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/servername.crt
key /etc/openvpn/server/servername.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/server/ta.key 0
crl-verify /etc/openvpn/server/crl.pem
user nobody
group nobody
cipher AES-256-GCM
auth SHA512
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
port 1194 # Порт, бажано змінити на свій власний
proto udp6
server 10.8.0.0 255.255.255.0
server-ipv6 2001:db8:0:123::/64
status openvpn-status.log
ifconfig-pool-persist ipp.txt
push "redirect-gateway ipv6 def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 2001:4860:4860::8888"
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
explicit-exit-notify 1
Ubuntu:
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/servername.crt
key /etc/openvpn/server/servername.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/server/ta.key 0
crl-verify /etc/openvpn/server/crl.pem
user nobody
group nogroup
cipher AES-256-GCM
auth SHA512
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA
port 1194 # Порт, бажано змінити на свій власний
proto udp6
server 10.8.0.0 255.255.255.0
server-ipv6 2001:db8:0:123::/64
status openvpn-status.log
ifconfig-pool-persist ipp.txt
push "redirect-gateway ipv6 def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 2001:4860:4860::8888"
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
explicit-exit-notify 1
Далі необхідно дозволити операційній системі перенаправляти трафік від VPN сервера у зовнішню мережу провайдера і назад, отож створюємо або редагуємо файл налаштувань, записуючи в нього два рядки, для IPv4 та IPv6 відповідно.
Arch Linux/Ubuntu:
# nano /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding=1
Передостаннім кроком необхідно задати правильного власника для файлів налаштувань та сертифікатів.
Arch Linux:
# chown openvpn.network /etc/openvpn/server/*
Ubuntu:
# chown root.root /etc/openvpn/server/*
Далі створюємо сервіс systemd, активовуємо його.
Arch Linux/Ubuntu:
# systemctl enable openvpn-server@server
# systemctl start openvpn-server@server
І все – процес налаштування сервера завершено.
Налаштування для клієнта
Щоб створити файл конфігурації для клієнтів, рекомендую користуватись утилітою ovpngen. Згенерований файл зручний тим, що містить усі налаштування і сертифікати та без проблем імпортується в Network Manager (на лінукс системах) та OpenVPN Connect (Android, iOS, Windows).
Спершу встановлюємо ovpngen на сервер.
Arch Linux:
$ sudo pacman -S base-devel wget
$ mkdir ~/.aur
$ cd ~/.aur
$ wget https://aur.archlinux.org/cgit/aur.git/snapshot/ovpngen.tar.gz
$ tar xvf ovpngen.tar.gz
$ cd ovpngen
$ makepkg -i
Ubuntu:
$ cd /opt
$ git clone https://github.com/graysky2/ovpngen.git
$ cd ovpngen
$ chmod +x ovpngen
Далі власне створюємо файл налаштувань.
Замість server.domain потрібно ввести доменне ім’я або IP адресу сервера. За умови використання власного порту, потібно ввести його замість 1194. Назву клієнта client1 також потрібно замінити на ту, яка використовувалась раніше. Для нових клієнтів використовується назва тих нових клієнтів відповідно.
Arch Linux:
# cd ~
# ovpngen server.domain /etc/openvpn/server/ca.crt /etc/easy-rsa/pki/issued/client1.crt /etc/easy-rsa/pki/private/client1.key /etc/openvpn/server/ta.key 1194 udp > client1.ovpn
Ubuntu:
# cd ~
# /opt/ovpngen server.domain /etc/openvpn/server/ca.crt /etc/easy-rsa/pki/issued/client1.crt /etc/easy-rsa/pki/private/client1.key /etc/openvpn/server/ta.key 1194 udp > client1.ovpn
Створений файл переносимо на комп’ютер та відкриваємо у текстовому редакторі, щоб змінити наступні рядки…
#cipher AES-256-CBC
#auth SHA512
…на такі:
cipher AES-256-GCM
auth SHA512
comp-lzo
Зберігаємо. Тепер цей файл без проблем можна використати на клієнтських пристроях. Важливо пам’ятати, що тільки один пристрій в один момент часу може використовувати один файл налаштування. Тому для кількох пристроїв потрібно кілька різних налаштувань, тобто кілька різних користувачів.
Додати нового користувача
Щоб додати нового користувача, потрібно повторити створення і підписання сертифікату.
Arch Linux:
# cd /etc/easy-rsa/
# easyrsa gen-req client2 nopass
# easyrsa sign-req client client2
Ubuntu:
# cd /etc/easy-rsa/
# ./easyrsa gen-req client2 nopass
# ./easyrsa sign-req client client2
Після цього потрібно перевантажити OpenVPN сервер:
Arch Linux/Ubuntu:
# systemctl restart openvpn-server@server
Тоді потрібно створити новий файл налаштувань утилітою ovpngen для цього новоствореного клієнта і використати той файл на потрібному пристрої.