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

установка openvpn сервера на centos 7 Системное администрирование

В настоящее время, многие пользователи используют VPN-подключение для доступа к сети Интернет как в личных, так и в рабочих целях. Использование VPN не только предоставляет анонимность в сети, но так же и защиту данных, так как весь трафик шифруется. Это является важной составляющей для защиты информации в незащищенных сетях (публичные wifi сети, домашний интернет и т.д.), в которых данные могут быть перехвачены, однако приватный OpenVPN сервер на CentOS 7 решит данную проблему.

Вступление

VPN (Virtual Private Network  или же «виртуальная частная сеть») – это обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети.

Следует выделить ряд преимуществ OpenVPN перед другими VPN-технологиями:

  • Эффективное сжатие трафика, позволяющее компенсировать потери трафика. В некоторых случаях позволяет ускорить скорость соединения интернета;
  • Повышенная безопасность за счет использования различных протоколов шифрования (MD5-HMAC, RSA) и 2048-битного ключа безопасности, обеспечивающие повышенную защиту данных;
  • Поддержка большого количества операционных систем, среди которых Windows, MacOS и Linux, а так же мобильные iOS и Android.

В сети достаточно много материалов на данную тему, однако, проверив большинство мануалов из поисковой выдачи Google, так и не удалось запустить приватный OpenVPN сервер на CentOS 7: часть из них предназначена для других дистрибутивов Linux, часть – с неправильными настройками сети и firewall, поэтому мы попытались сделать максимально понятное и “работающее” руководство. И так, приступим…

Подготовка сервера к установке OpenVPN

Сама по себе установка OpenVPN на CentOS 7 не является сложной, хотя достаточна утомительная. Для этого нам понадобится “чистый” сервер (подойдёт VPS минимальной конфигурации) с предустановленной системой CentOS 7 minimal.

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

Так как мы будем активно пользоваться средствами 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 7

Выполняем непосредственно установку 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 7 завершена. У нас появился приватный защищённый VPN-сервер.

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

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