В даний час багато користувачів використовують VPN-з’єднання для доступу до Інтернету як для особистих, так і для робочих потреб. Використання VPN не лише забезпечує анонімність в мережі, але й захист даних, оскільки весь трафік шифрується. Це є важливою складовою захисту інформації в незахищених мережах (публічні Wi-Fi мережі, домашній інтернет тощо), в яких дані можуть бути перехоплені, однак приватний OpenVPN сервер на CentOS 8 вирішить цю проблему.
Вступ
VPN (Virtual Private Network або «віртуальна приватна мережа») — це загальна назва технологій, що дозволяють забезпечити одне або декілька мережевих з’єднань (логічну мережу) поверх іншої мережі.
Слід виділити низку переваг OpenVPN перед іншими VPN-технологіями:
- Ефективне стиснення трафіку, що дозволяє компенсувати втрати трафіку. У деяких випадках дозволяє прискорити швидкість з’єднання з інтернетом;
- Підвищена безпека завдяки використанню різних протоколів шифрування (MD5-HMAC, RSA) та 2048-бітного ключа безпеки, що забезпечують підвищений захист даних;
- Підтримка великої кількості операційних систем, серед яких Windows, MacOS та Linux, а також мобільних iOS і Android.
В мережі досить багато матеріалів на цю тему, проте, перевіривши більшість мануалів із пошукової видачі Google, так і не вдалося запустити приватний OpenVPN сервер на CentOS 8: частина з них призначена для інших дистрибутивів Linux, частина — з неправильними налаштуваннями мережі та firewall, тому ми спробували зробити максимально зрозумілий та «робочий» посібник. Отже, приступаємо…
Підготовка сервера до налаштування OpenVPN
Саме налаштування OpenVPN на CentOS 8 не є складним, хоч і досить виснажливим. Для цього нам знадобиться «чистий» сервер (підходитиме VPS мінімальної конфігурації) з попередньо встановленою системою CentOS 8 minimal.
З міркувань безпеки налаштовуємо авторизацію на сервері за допомогою ключа безпеки. Детальну інструкцію ми вже публікували в попередніх матеріалах: SSH авторизація за ключем безпеки в CentOS 8
Оскільки ми будемо активно використовувати засоби iptables для маршрутизації трафіку, слід відключити багатьом неулюблений firewalld:
systemctl stop firewalld systemctl disable firewalld systemctl mask --now firewalld
І встановити необхідний нам iptables:
yum install iptables-services -y
Запускаємо iptables та додаємо його до автозапуску:
systemctl start iptables systemctl start ip6tables systemctl enable iptables systemctl enable ip6tables
Увімкнуємо підтримку маршрутизації трафіку між мережевими інтерфейсами. Для цього відкриваємо у редакторі файл:
vi /etc/sysctl.conf
І додаємо в кінець рядок:
net.ipv4.ip_forward = 1
Застосовуємо налаштування, виконавши команду:
sysctl -p
Також нам знадобиться репозиторій Epel (з нього буде встановлено OpenVPN), пакет net-tools та GitHub для встановлення Easy-RSA, тому відразу ж встановимо їх:
yum install epel-release git gcc net-tools -y
На цьому підготовка сервера до встановлення OpenVPN завершена.
ВАЖЛИВО! Багато хто одразу відключає SELINUX, проте поки що його не чіпаємо — швидше за все, нам не доведеться його відключати взагалі, тим більше вбудований фаєрвол в ядрі системи явно не буде зайвим.
Налаштування OpenVPN сервера на CentOS 8
Виконуємо безпосередньо встановлення OpenVPN:
yum install openvpn -y
Одним із найважливіших критеріїв при виборі OpenVPN як VPN сервера є безпека передачі даних, забезпечена їх надійним шифруванням. За створення сертифікатів безпеки відповідає утиліта Easy-RSA, яка генерує їх за допомогою OpenSSL.
Встановимо Easy-RSA з GitHub:
cd /etc/openvpn git clone https://github.com/OpenVPN/easy-rsa.git
І створимо директорію, в якій будемо зберігати сертифікати сервера:
mkdir /etc/openvpn/keys
Створення сертифікатів безпеки
Тепер приступаємо до створення сертифікатів безпеки для сервера та клієнтів за допомогою Easy-RSA. Створюємо структуру публічних PKI-ключів:
cd /etc/openvpn/easy-rsa/easyrsa3 mv vars.example vars ./easyrsa init-pki
Створіть центр сертифікації CA:
./easyrsa build-ca
При генерації сертифікату центру сертифікації вам слід вказати ім’я хоста OpenVPN сервера та його пароль (пункт Verifying – Enter PEM pass phrase:). Цей пароль знадобиться надалі при створенні користувацьких сертифікатів, тому не забудьте його!
Ми отримали 2 ключі:
- /etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key
- /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt
Перший ключ секретний, а другий — публічний, який ми будемо передавати користувачам для авторизації на сервері.
Тепер створюємо сертифікат для OpenVPN сервера:
./easyrsa gen-req server nopass
І підписуємо його в нашому центрі сертифікації (при підписанні сертифікату слід використовувати пароль, вказаний раніше при генерації CA):
./easyrsa sign-req server server
Генеруємо ключ Диффи–Хелмана:
./easyrsa gen-dh
Копіюємо отримані ключі до директорії /etc/openvpn/keys/:
cp pki/ca.crt /etc/openvpn/keys/ca.crt cp pki/dh.pem /etc/openvpn/keys/dh.pem cp pki/issued/server.crt /etc/openvpn/keys/server.crt cp pki/private/server.key /etc/openvpn/keys/server.key
Тепер створюємо ключі для клієнта OpenVPN сервера. У нашому випадку ім’ям клієнта буде notebook:
./easyrsa gen-req notebook nopass ./easyrsa sign-req client notebook
Як і при генерації ключів сервера, слід використовувати пароль, вказаний при створенні центру сертифікації CA.
У результаті отримуємо підписаний клієнтський сертифікат:
- /etc/openvpn/easy-rsa/easyrsa3/pki/issued/notebook.crt
- /etc/openvpn/easy-rsa/easyrsa3/pki/private/notebook.key
Для зручності створюємо директорію для сертифікатів клієнта notebook та копіюємо до неї всі необхідні ключі:
mkdir /etc/openvpn/keys/notebook/ cp pki/ca.crt /etc/openvpn/keys/notebook/ca.crt cp pki/issued/notebook.crt /etc/openvpn/keys/notebook/notebook.crt cp pki/private/notebook.key /etc/openvpn/keys/notebook/notebook.key
Завантажуємо на свій комп’ютер вміст директорії /etc/openvpn/keys/notebook/. Для цього найкраще скористатися SFTP клієнтом WinSCP.
Конфігурація OpenVPN сервера
Створюємо файл конфігурації OpenVPN сервера з наступним вмістом. Для цього скористаємося редактором vi:
/etc/openvpn/server.conf
port 1194 proto udp dev tun ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" keepalive 10 120 user nobody group nobody persist-key persist-tun status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log verb 3 explicit-exit-notify 1 auth SHA256
Створюємо директорію для log-файлів OpenVPN:
mkdir /var/log/openvpn
Додаємо OpenVPN сервер до автозапуску та запускаємо його:
systemctl enable openvpn@server systemctl start openvpn@server
Перевіряємо роботу OpenVPN сервера:
netstat -tulnp | grep 1194
Якщо сервер запустився коректно, отримуємо повідомлення приблизно наступного вмісту:
udp 0 0 0.0.0.0:1194 0.0.0.0:* 2248/openvpn
Якщо цього повідомлення немає, перевіряємо log-файл /var/log/openvpn/openvpn.log на наявність наступної помилки:
TCP/UDP: Socket bind failed on local address [undef]: Permission denied
Якщо вона присутня, нам слід відключити SELINUX:
vi /etc/sysconfig/selinux
І змінюємо значення SELINUX=enforcing на SELINUX=disabled
Застосовуємо нові налаштування без перезавантаження сервера:
setenforce 0
Налаштування firewall
Створюємо bash-скрипт з налаштуваннями iptables наступного вмісту:
vi /etc/iptables.sh
#!/bin/sh IF_EXT="eth0" IF_OVPN="tun0" OVPN_PORT="1194" IPT="/sbin/iptables" IPT6="/sbin/ip6tables" # flush $IPT --flush $IPT -t nat --flush $IPT -t mangle --flush $IPT -X $IPT6 --flush # loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # default $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP $IPT6 -P INPUT DROP $IPT6 -P OUTPUT DROP $IPT6 -P FORWARD DROP # allow forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # NAT # ######################################### # SNAT - local users to out internet $IPT -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE # INPUT chain # ######################################### $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ssh $IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT $IPT -A INPUT -i $IF_OVPN -p icmp -s 10.8.0.0/24 -j ACCEPT $IPT -A INPUT -i $IF_OVPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT # openvpn $IPT -A INPUT -i $IF_EXT -p udp --dport $OVPN_PORT -j ACCEPT # FORWARD chain # ######################################### $IPT -A FORWARD -i $IF_OVPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_OVPN -m state --state ESTABLISHED,RELATED -j ACCEPT # OUTPUT chain # ######################################### $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT /sbin/iptables-save > /etc/sysconfig/iptables
Виконуємо створений скрипт для застосування налаштувань iptables:
sh /etc/iptables.sh
Готово! Встановлення OpenVPN сервера на CentOS 8 завершено. У нас з’явився приватний захищений VPN-сервер.
У наступній статті ми розглянемо налаштування OpenVPN клієнта для підключення до сервера Windows та Linux.