Приватний OpenVPN сервер на CentOS 8

В даний час багато користувачів використовують 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.

Оцініть статтю