В настоящее время, многие пользователи используют 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.