• Home
  • Notes
  • LINUX
  • OpenVPN
  • Настройка сервера OpenVPN на Centos7

Настройка сервера OpenVPN на Centos7

Кому самоизоляция это хорошо, а кому скучно. Шла 2-я неделя карантина из-за коронавируса COVID-19, и мне стало скучно просто так сидеть дома. Решил вспомнить навыки настройки сервиса OpenVPN на Linux. В интернетах куча статей по настройке данного сервиса, но они как обычно все разные и под конкретные задачи. Моей целью является настройка VPN сервера на Centos 7. 

План действий:

  1. Подготовка
  2. Что необходимо сделать?
  3. Шаг 1 - Установка OpenVPN и EasyRSA 3
  4. Шаг 2 - Настройка переменных EasyRSA 3
  5. Шаг 3 - Создание сертификатов OpenVPN
  6. Шаг 4 - Настройка сервера OpenVPN
  7. Шаг 5 - Настройка сетевого экрана и Port Forwarding

Подготовка


Для реализации задуманного нам необходим удаленный сервер (на котором мы будем настраивать OpenVPN) и права root на нем. В данном примере будет рассмотрен сервер под управлением Centos 7.8 и внешним ip-адресом 5.123.6.124

Что необходимо сделать?


  • Установить OpenVPN и Easy-RSA
  • Настроить переменные VARS в Easy-RSA 3
  • Создать сертификаты OpenVPN
  • Настроить сервер OpenVPN
  • Настроить сетевой экран (firewalld) и Port Forwarding
  • Настроить клиенты
  • Протестировать

Шаг 1 - Установка OpenVPN и EasyRSA 3


Установим необходимые пакеты:

yum -y install wget
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Установим openvpn:

yum -y install openvpn

Раздобудем Easy RSA 3:

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6/ easy-rsa/; rm -f EasyRSA-unix-v3.0.6.tgz

Шаг 2 - Настройка переменных EasyRSA 3


На данном этапе нам необходимо создать файл vars для упрощения генерирования сертификатов в нашем будущем центре сертификации. Для этого переходим в директорию /etc/openvpn/easy-rsa/ и создаем новый скрипт vars используя текстовый редактор vi

cd /etc/openvpn/easy-rsa/
vi vars

Допустим наш сервер OpenVPN расположен в Финляндии в городе Хельсинки, тогда файл vars может выглядить следующем образом:

set_var EASYRSA                 "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "FI"
set_var EASYRSA_REQ_PROVINCE "Helsinki"
set_var EASYRSA_REQ_CITY "Helsinki"
set_var EASYRSA_REQ_ORG "HELSINKY VPN CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL "This email address is being protected from spambots. You need JavaScript enabled to view it."
set_var EASYRSA_REQ_OU "HELSINKI-LABS EASY CA"
set_var EASYRSA_KEY_SIZE 4096
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "HELSINKI-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-easyrsa.cnf"
set_var EASYRSA_DIGEST "sha256"

Обратите внимания на параметры:

  • EASYRSA_KEY_SIZE - длина ключа
  • EASYRSA_CA_EXPIRE - срок на который выпускается CA - сертификат (в днях)
  • EASYRSA_CERT_EXPIRE - срок на который выпускаются сертификаты (в днях)

Сделаем файл vars исполняемым:

chmod +x vars

Шаг 3 - Создание сертификатов OpenVPN


На данном этапе мы создадим ключи OpenVPN на основе подготовленного файла vars. Создадим ключ CA, ключи сервера и клиента, файл DH и CRL PEM. Для этого перейдем в каталог /etc/openvpn/easy-rsa/

cd /etc/openvpn/easy-rsa/
Инициализация каталога PKI и создание сертификата CA

Первым делом перед созданием ключа сервера нам необходимо инициализировать каталог PKI (Public Key Infrastructure) и создать ключ CA.

./easyrsa init-pki
./easyrsa build-ca

Теперь введем пароль для своего ключа CA (парольдолжен быть сложным!). В итоге в каталоге pki мы должн ыувидеть два файла "ca.crt" и "ca.key"

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

Теперь нам надо создать сертификат и ключ нашего сервера. Пусть имя нашего сервера будет openvpn-srv.

./easyrsa init-pki
./easyrsa build-ca

Подпишем ключ сервера "openvpn-srv", используя наш корневой сертификат CA

./easyrsa sign-req server openvpn-srv

Будет предложено ввести пароль от "CA", введите его и нажмите Enter. Созданный сертификат можно найти в папке "pki/issued/"

Проверить сертификат на ошибки используя OpenSSL можно используя команду

openssl verify -CAfile pki/ca.crt pki/issued/openvpn-srv.crt
Создание сертификата клиента

Теперь создадим ключ и сертификат для клинта с именем "vpn_user01"

./easyrsa gen-req vpn_user01 nopass

Подпишем ключ клиента "vpn_user01", используя наш корневой сертификат CA

./easyrsa sign-req client vpn_user01

Введите "yes", чтобы подтвердить запрос сертификата клиента, a затем введите пароль CA.

Проверить сертификат на ошибки используя OpenSSL можно используя команду

openssl verify -CAfile pki/ca.crt pki/issued/vpn_user01.crt
Создание ключа Диффи-Хеллмана

Для создания ключа Диффи-Хеллмана необходимо выполнить команду

./easyrsa gen-dh

Созданный ключ DH, можно найти в каталоге "pki".

Создание ключа CRL

Ключ CRL (список отзыва сертификатов) будет использоваться для отзыва ключа клиента. Если у вас есть несколько клиентских сертификатов на вашем сервере vpn, и вы хотите отозвать какой-то ключ, вам просто нужно выполнить команду easy-rsa.

Если вы хотите отозвать какой-либо ключ, выполните команду, как показано ниже.

./easyrsa revoke keyname

А затем сгенерируйте ключ CRL

./easyrsa gen-crl

Файл crl.pem можно найти в каталоге "pki"

Копирование файлов сертификатов

На данном этапе мы уже создали все необходимые сертификаты для успешной работы сервера и клиента. Для удобства использования скопирует сертификаты и ключи в соответствующие папки

Для сервера

cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/openvpn-srv.crt /etc/openvpn/server/
cp pki/private/openvpn-srv.key /etc/openvpn/server/

Для клиента

cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/vpn_user01.crt /etc/openvpn/client/
cp pki/private/vpn_user01.key /etc/openvpn/client/

Копирование DH и CRL ключей

cp pki/dh.pem /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/

Шаг 4 - Настройка сервера OpenVPN


Перейдем в каталог "/etc/openvpn" и создадим новый файл конфигурации сервера "server.conf" при помощи текстового редактора vi.

cd /etc/openvpn/
vim server.conf

Вставим следующие настройки

port 8943
proto tcp
dev tun

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/openvpn-srv.crt
key /etc/openvpn/server/openvpn-srv.key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA1
auth-nocache
client-to-client
client-config-dir ccd
keepalive 20 60
persist-key
persist-tun
comp-lzo yes
comp-noadapt
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

Теперь давайте разбираться, чего мы тут написали

port 8943
proto tcp
dev tun

Строки указанные выше указывают на то, что наш сервер OpenVPN будет работать по протоколу tcp на порту 8943. В процессе строительства туннеля будет задействоывн сетевой драйвер TUN, который позволяет работать на сетевом уровне модели OSI, что позволит нам использовать IP-маршрутизацию. Если вам необходимо строить туннель на канальном уровне, тогда используйте сетевой драйвер TAP. TAP в своей работе оперирует кадрами Ethernet и используется в основном для создания сетевых мостов.

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/openvpn-srv.crt
key /etc/openvpn/server/openvpn-srv.key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem

Тут происходит указания расположения сертификатов: сертификата Центра Сертификации (CA), сертификата сервера (openvpn-srv.crt), закрытого ключа от сертификата сервера (openvpn-srv.key), ключа Диффи-Хеллмана (dh) и списка отзыва сертификатов (CRL)

server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"

В этой части конфигурационного файла происходит описание сетевых настроек. Клиенты при подключении будут получать адреса из сети "10.8.0.0/24", а так же настройки ДНС с адресами "84.200.69.80" и "84.200.70.40" (это публичные днс сервера сервиса DNSWatch). При подключении к vpn в качестве шлюза по умолчанию будет использован шлюз OpenVPN сервера, на что указывает строка "push "redirect-gateway def1".

duplicate-cn

Эта строка разрешает множественные подключения с одного и того же клиентского сертификата.

cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA1
auth-nocache

Строки выше отвечают за алгоритмы шифрования, которые будут использованы при создании туннеля. Если страдаете паранойей то можете указать "auth SHA512"

client-to-client

Тут мы разрешаем клиентам нашего сервера видеть друг друга.

client-config-dir ccd

Данная строка задает директорию с персональными настройками для клиентов. Например мы может назначить клиенту статический ip-адрес или прописать персональные маршруты.

Шаг 5 - Настройка сетевого экрана и Port Forwarding


На этом шаге мы включим модуль ядра Port-Forwarding и настроим маршрутизацию средствами Firewalld для нашего сервера.

Для включиния модуля ядра переадресации портов, необходимо выполнить следующие команды.

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

Для настройки Firewalld выполним следующие команды

firewall-cmd --permanent --add-port=8943/tcp
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --permanent --zone=trusted --add-masquerade

Включим NAT для нашего диапазона адресов "10.8.0.0/24" через внешний адрес сервера.

SERVERIP=$(ip route get 84.200.69.80 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $SERVERIP -j MASQUERADE

Перезагрузим службу Firewalld

firewall-cmd --reload

Не забудем создать папку с персональными настройками пользователей

mkdir /etc/openvpn/ccd

Настройки переадресации портов и маршрутизации Firewalld завершены, теперь пришло время запустить службу OpenVPN.

systemctl enable --now openvpn@server

Проверим статус работы службы OpenVPN выполнив команду

systemctl status openvpn@server

---


Статья написана не до конца и постоянно обновляется....

 
Thursday, 09 April 2020 Posted in OpenVPN