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

В настоящее время, многие пользователи используют VPN-подключение для доступа к сети Интернет как в личных, так и в рабочих целях. Использование VPN не только предоставляет анонимность в сети, но так же и защиту данных, так как весь трафик шифруется. Это является важной составляющей для защиты информации в незащищенных сетях (публичные wifi сети, домашний интернет и т.д.), в которых данные могут быть перехвачены, однако приватный 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 7 не является сложной, хотя достаточна утомительная. Для этого нам понадобится «чистый» сервер (подойдёт VPS минимальной конфигурации) с предустановленной системой CentOS 8 minimal.

В целях безопасности, настраиваем авторизацию на сервере по ключу безопасности. Подробную инструкцию мы уже публиковали в предыдущих материалах: SSH авторизация по ключу безопасности в CentOS 8

Так как мы будем активно пользоваться средствами iptables для маршрутизации трафика, следует отключить многими нелюбимый firewalld:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl stop firewalld
systemctl disable firewalld
systemctl mask --now firewalld
systemctl stop firewalld systemctl disable firewalld systemctl mask --now firewalld
systemctl stop firewalld 
systemctl disable firewalld 
systemctl mask --now firewalld

И установить необходимый нам iptables:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yum install iptables-services -y
yum install iptables-services -y
yum install iptables-services -y

Запускаем iptables и добавляем его в автозапуск:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl start iptables
systemctl start ip6tables
systemctl enable iptables
systemctl enable ip6tables
systemctl start iptables systemctl start ip6tables systemctl enable iptables systemctl enable ip6tables
systemctl start iptables 
systemctl start ip6tables 
systemctl enable iptables 
systemctl enable ip6tables

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vi /etc/sysctl.conf
vi /etc/sysctl.conf
vi /etc/sysctl.conf

И добавляем в конец строку:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1
net.ipv4.ip_forward = 1

Применяем настройки, выполнив команду:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sysctl -p
sysctl -p
sysctl -p

Так же нам понадобится репозиторий Epel (из него будет произведена установка OpenVPN), пакета net-tools и GitHub для установки Easy-RSA, поэтому сразу же установим их:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yum install epel-release git gcc net-tools -y
yum install epel-release git gcc net-tools -y
yum install epel-release git gcc net-tools -y

На этом подготовка сервера к установке OpenVPN завершена.

ВАЖНО! Многие сразу же отключают SELINUX, однако мы пока его не трогаем — скорее всего нам не придётся отключать его вообще, тем более встроенный фаервол в ядро системы явно лишним не будет.

Установка OpenVPN сервера на CentOS 8

Выполняем непосредственно установку OpenVPN:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
yum install openvpn -y
yum install openvpn -y
yum install openvpn -y

Одним из наиболее важных критериев при выборе OpenVPN в качестве VPN сервера является безопасность передачи данных, обеспеченная их надёжным шифрованием. За создание сертификатов безопасности отвечает утилита Easy-RSA, которая генерирует их с помощью OpenSSL.

Установим Easy-RSA с GitHub:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd /etc/openvpn
git clone https://github.com/OpenVPN/easy-rsa.git
cd /etc/openvpn git clone https://github.com/OpenVPN/easy-rsa.git
cd /etc/openvpn 
git clone https://github.com/OpenVPN/easy-rsa.git

И создадим директорию, в которой будем хранить сертификаты сервера:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mkdir /etc/openvpn/keys
mkdir /etc/openvpn/keys
mkdir /etc/openvpn/keys

Создание сертификатов безопасности

Теперь приступаем к созданию сертификатов безопасности для сервера и клиентов с помощью Easy-RSA. Создаём структуру публичных PKI-ключей:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd /etc/openvpn/easy-rsa/easyrsa3
mv vars.example vars
./easyrsa init-pki
cd /etc/openvpn/easy-rsa/easyrsa3 mv vars.example vars ./easyrsa init-pki
cd /etc/openvpn/easy-rsa/easyrsa3 
mv vars.example vars 
./easyrsa init-pki

Создайте удостоверяющий центр CA:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./easyrsa build-ca
./easyrsa build-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 сервера:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./easyrsa gen-req server nopass
./easyrsa gen-req server nopass
./easyrsa gen-req server nopass

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./easyrsa sign-req server server
./easyrsa sign-req server server
./easyrsa sign-req server server

Генерируем ключ ДиффиХелмана:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./easyrsa gen-dh
./easyrsa gen-dh
./easyrsa gen-dh

Копируем полученные ключи в директорию /etc/openvpn/keys/:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./easyrsa gen-req notebook nopass
./easyrsa sign-req client notebook
./easyrsa gen-req notebook nopass ./easyrsa sign-req client 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 и копируем в него все необходимые ключи:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/etc/openvpn/server.conf
/etc/openvpn/server.conf
/etc/openvpn/server.conf
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mkdir /var/log/openvpn
mkdir /var/log/openvpn
mkdir /var/log/openvpn

Добавляем OpenVPN сервер в автозагрузку и запускаем его:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
systemctl enable openvpn@server
systemctl start openvpn@server
systemctl enable openvpn@server systemctl start openvpn@server
systemctl enable openvpn@server 
systemctl start openvpn@server

Проверяем работу OpenVPN сервера:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
netstat -tulnp | grep 1194
netstat -tulnp | grep 1194
netstat -tulnp | grep 1194

Если сервер запустился корректно, получаем сообщение примерно следующего содержимого:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
udp 0 0 0.0.0.0:1194 0.0.0.0:* 2248/openvpn
udp 0 0 0.0.0.0:1194 0.0.0.0:* 2248/openvpn
udp 0 0 0.0.0.0:1194 0.0.0.0:* 2248/openvpn

Если данного сообщения нет, проверяем log-файл /var/log/openvpn/openvpn.log на наличие следующей ошибки:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
TCP/UDP: Socket bind failed on local address [undef]: Permission denied
TCP/UDP: Socket bind failed on local address [undef]: Permission denied
TCP/UDP: Socket bind failed on local address [undef]: Permission denied

Если она присутствует, нам следует отключить SELINUX:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vi /etc/sysconfig/selinux
vi /etc/sysconfig/selinux
vi /etc/sysconfig/selinux

И меняем значение SELINUX=enforcing на SELINUX=disabled

Применяем новые настройки без перезагрузки сервера:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
setenforce 0
setenforce 0
setenforce 0

Настройка firewall

Создаём bash-скрипт с настройками iptables следующего содержимого:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vi /etc/iptables.sh
vi /etc/iptables.sh
vi /etc/iptables.sh
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/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
#!/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
#!/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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sh /etc/iptables.sh
sh /etc/iptables.sh
sh /etc/iptables.sh

Готово! Установка OpenVPN сервера на CentOS 8 завершена. У нас появился приватный защищённый VPN-сервер.

В следующей статье мы рассмотрим настройку OpenVPN клиента для подключения к серверу Windows и Linux.

Оцените статью