Настройка openvpn сервера в Linux
Общие сведения
vpn - защищенные виртуальные каналы
OpenVPN создает виртуальные каналы ( туннели ) внутри незащищенной сети интернета
Шифврование в vpn осуществляется с помощью библиотеки vpn и протоколом транспортного уровня TLS
TLS - усовершенствованный протокол защищенной передачи данных защищенных сокетов Secure Socket Layers (SSL)
В openssl может использоваться симметричная и ассиметричная криптография
Симметричная криптография - перед передачей данных на все узлы необходимо поместить одинаковый секретный ключ
Ассиметричная криптография - на каждом узле есть два ключа, публичный (шифрование) и приватный (расшифрование)
Приватный ключ остается на узле, публичный ключ передается между узлами при передаче данных для аутентификации
Шифрование данных увеличивает трафик и замедляет обмен данными
В качестве openvpn сервера можно использовать арендованные vds, однако необходимо убедиться, что такой сервер будет поддерживать драйвер TUN/TAP
Удостоверяющий центр CA
Удостоверяющий центр выдает сертификаты узлам по запросу и предоставляет узлам свой собственный сертификат для проверки удостоверяющей стороны
Чтобы избежать подделки открытого ключа, третья сторона должна его заверить, в результате проверки создается сертфикат проверки открытого ключа
Сертификат должна заверить организация ( Certification authority, CA ) которой можно доверять
Данная организация предоставляет свой открытый ключ доступный всем
Для сети vpn можно создавать свой удостоверяющий центр, который будет выпускать самоподписанные сертификаты, которые могут использоваться только для узлов частной сети
Самоподписанные сертфикаты будут играть роль публичных ключей. Параллельно созданные приватные ключи будут использоваться для расшифрования данных
Сертификаты создаются в соответствии со стандартом x.509.
x.509
x.509 - это публичный ключ, который содержит такие данные, как владелец сертфиката, имя узла, период действия, алгоритм
Данный сертификат должен быть подписан приватным ключем удостоверяющего цента ( CA )
Когда один из узлов подключается к серверу используя TLS, сервер в ответ отправляет сертфикат x.509.
На узле хранится публичный ключ удостоверяющего центра CA, который подписал этот сертфикат, данный ключ используется для проверки подписи
Таким образом проверяется удаленный сервер на подлинность
Список отзывов сертификатов
Список отзывов содержит список сертфикатов узлов утративших доверие
Список отзывов сертификато (Сertificate Revocation List, CRL) - используется для блокировки узлов, которые больше не должны иметь доступ к vpn
Список отзывов создается в удостоверяющем центре CA и потом копируется на сервер OpenVPN
После измения данного списка в удостоверяющем центре, его необходимо повторно скопировать на сервер OpenVPN
Файл Диффи-Хелмана
Файл Диффи-Хелмана (Diffie-Hellman) реализует протокол позволяющий использовать небезопасный канал для получения общего секретного ключа. Данный ключ будет использоваться для защищенного обмена с помощью алгоритмов симметричного шифрования
В OpenVPN данный ключ создается для защиты трафика от расшифровки, если ключи были потеряны или похищены
Статический ключ HMAC
Статический ключ (хэш-код) аутентификации сообщений (Hash-based Message Authentication Code, HMAC) проверяет подлинность информации передоваемой между узлами
Данный ключ используется для дополнительной защиты от флуда и dos-атак
Файл запроса
Файл запроса создается на узле и отправляется в удостоверяющий центр где подписывается и отправляется обратно на узел
Приватный и публичный ключ
Приватный и публичный ключ создаются одновременно вместе с файлом запроса
Реализация vpn
Можно использовать сервер OpenVPN в качестве удостоверяющего центра, однако не рекомендуется так как данный вариант открывает некоторые уязвимости
Согласно официальной документации OpenVPN, необходимо использовать отдельный сервер для для центра сертификации
Клиент, сервер и CA могут находиться в одной сети. На практике хост CA можно отсоединить от сети и осуществлять обмен ключами и сертфикатами с помощью usb накопителя
Перед созданием OpenVPN сервера необходимо обновить пакеты в ОС, установить пакет zip для распаковки архива утилиты Easy-RSA.
Утилита Easy-RSA будет использоваться для создания ключей и сертфикатов
На всех узлах необходимо синхронизировать время с помощью сервера ntp
Создание удостоверяющего центра CA
CA предназначен для подписи сертификатов для сервера OpenVPN и клиентов
Сервер OpenVPN или клиент создает приватный ключ и файл запроса. Файл запроса отправляется на CA ( удостоверяющий центр ) где подписывается и передается обратно клиенту или серверу. Файл запроса может передаваться с помощью usb-накопителя и с помощью usb-флешки может обратно передаваться на запрашиваемый узел
Все сертификаты и ключи можно создавать с помощью утилиты openssl, однако проще будет использовать утилиту Easy-RSA в составе пакета OpenVPN
#Создать неприлегированного пользователя
adduser ca
su ca
cd
#Загрузить Easy-rsa
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
#Распаковать
unzip master.zip
#Исполняемые файлы находятся в каталоге ~/easy-rsa-master/easyrsa3
#Справка по командам
./easyrsa
./easyrsa help build-ca
Создание инфраструктуры закрытых ключей
#Для создания инфраструктуры закрытых ключей (Public Key Infrastructure, PKI)
cd /home/ca/easy-rsa-master/easyrsa3
./easyrsa init-pki
Созданные ключи находятся в каталоге /home/ca/easy-rsa-master/easyrsa3/pki
Создание удостоверяющего центра
#Создать CA
./easyrsa build-ca
#Без ввода пароля
./easyrsa build-ca nopass
В ответ будет предложено ввести кодовую фразу ( пароль ) и имя common name
Пароль будет защищать приватный ключ CA и потребуется для подписи сертификатов серверов и клиентов OpenVPN
Команда build-ca создаст два файла:
/home/ca/easy-rsa-master/easyrsa3/pki/private/ca.key
/home/ca/easy-rsa-master/easyrsa3/pki/ca.crt
ca.key - это приватный ключ CA
ca.ctr - это открытый ключ и нужно будет расположить его на клиентах и сервере
#Копируем публичный сертифика CA в openvpn
cp /home/ca/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/
Создание списка отзыва сертификатов
В процессе создания будет запрошен пароль приватного ключа CA.
Список отзывов будет находиться в директории: /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem
Данный ключ необходимо скопировать на сервер OpenVPN
#Копируем список отзыва в openvpn
cp /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/
cd /home/ca/easy-rsa-master/easyrsa3
./easyrsa gen-crl
Если нужно заблокировать выданный ранее сертификат клиента
./easyrsa revoke sotrudnik1
После выполнения команды выше, необходимо снова скопировать ключ /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem на сервере OpenVPN
Структура каталогов pki
~/easy-rsa-master/easyrsa3$ ls /home/ca/easy-rsa-master/easyrsa3/pki/
ca.crt certs_by_serial crl.pem index.txt index.txt.attr inline issued private reqs revoked serial vars.example
ca.crt - публичный сертификат удостоверяющего центра
crl.pem - список отзыва сертификатов ( CRL )
issued - каталог с публичными сертификатами созданные CA
private - каталог с секретными приватными ключами
Reqs - каталог с запросами на сертификаты
Подготовка сервера openvpn
#Установка OpenVPN
apt install openvpn
Файлы конфигурации, сертификаты и ключи нужно поместить в каталог /etc/openvpn, который будет создан автоматически
Необходимо создать файлы конфигурации openssl.cnf который определяет конфигурацию openssl и server.conf который определяет конфигурацию openvpn
Пример конфигурационного файла openssl находится в файле /home/ca/easy-rsa-master/easyrsa3/openssl-easyrsa.cnf
В данном файле указан абсолютный путь к каталогу с ключами и сертификатами
#Создать каталог для логов openvpn
mkdir /var/log/openvpn/
#Каталог для конфигураций клиентов
mkdir /etc/openvpn/ccd
#Конфигурация openssl
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/openvpn
crl_dir = $dir
database = $dir/index.txt
new_certs_dir = $dir
certificate = $dir/ca.crt
serial = $dir
crl = $dir/crl.pem
private_key = $dir/server.key
RANDFILE = $dir/.rand
default_days = 3650
default_crl_days = 365
default_md = md5
unique_subject = yes
policy = policy_any
x509_extensions = user_extensions
[ policy_any ]
organizationName = match
organizationalUnitName = optional
commonName = supplied
[ req ]
default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = CA_extensions
[ req_distinguished_name ]
organizationName = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName = Location Name
commonName = Common User or Org Name
commonName_max = 64
[ user_extensions ]
basicConstraints = CA:FALSE
[ CA_extensions ]
basicConstraints = CA:TRUE
default_days = 3650
[ server ]
basicConstraints = CA:FALSE
nsCertType = server
#Конфигурация openvpn
port 1194
proto udp
dev tun
user openvpn
group openvpn
cd /etc/openvpn
persist-key
persist-tun
tls-server
tls-timeout 120
dh /etc/openvpn/dh.pem
ca /etc/openvpn/ca.crt
cert /etc/openvpn/vpn.netbash.ru.crt
key /etc/openvpn/server.key
crl-verify /etc/openvpn/crl.pem
tls-auth /etc/openvpn/ta.key 0
server 10.15.0.0 255.255.255.0
client-config-dir /etc/openvpn/ccd
client-to-client
topology subnet
max-clients 5
push "dhcp-option DNS 10.15.0.1"
route 10.15.0.0 255.255.255.0
comp-lzo
keepalive 10 120
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 3
mute 20
Файлы для сервера openvpn
dh.pem - Файл Диффи-Хелмана для защиты трафика от расшифровки
ca.crt - сертификат удостоверяющего центра
server.crt - сертификат сервера openvpn
server.key - приватный ключ сервера openpvn
crl.pem - список отзыва сертификатов
ta.key - ключ HMAC для доп. защиты
#Создать пользователя vpnuser
adduser vpnuser
#Установка Easy-RSA и запуск инициализации инфраструктуры pki
su - vpnuser
cd /home/vpnuser/
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cd /home/vpnuser/easy-rsa-master/easyrsa3
./easyrsa init-pki
#Создать запрос на сертификат и приватный ключ
./easyrsa gen-req server
....
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/vpnuser/easy-rsa-master/easyrsa3/pki/reqs/server.req
* key: /home/vpnuser/easy-rsa-master/easyrsa3/pki/private/server.key
В процессе создания будет запрошен пароль и имя сервера OpenVPN
Данный запрос будет отправлен на CA
#Переключиться на сервер CA под ранее созданным пользователем
su - ca
cd easy-rsa-master/easyrsa3/
#Добавить права на подготовленный файл запроса
sudo chown ca:ca /home/ca/server.req
#Импорт файла на сервер CA
./easyrsa import-req /home/ca/server.req vpn.netbash.ru
Notice
------
Request successfully imported with short-name: vpn.netbash.ru
This request is now ready to be signed.
#Подпись запроса на получение
./easyrsa sign-req server vpn.netbash.ru
...
Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at:
* /home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn.netbash.ru.crt
В результате будет создан сертификат, который необходимо переместить обратно на OpenVPN сервер
Полученный ключ необходимо переместить в каталог конфигурации openvpn
#В моем случае все находится на одном сервере
sudo cp /home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn.netbash.ru.crt /etc/openvpn/
#Далее скопировать приватный ключ OpenVPN в каталог конфигурации openvpn
sudo cp /home/vpnuser/easy-rsa-master/easyrsa3/pki/private/server.key /etc/openvpn/
Генерация файла Диффи-Хелмана на сервер openvpn
cd /home/vpnuser/easy-rsa-master/easyrsa3
./easyrsa gen-dh
..+....................................................+..........................................+...............................................++*++*++*++*
DH parameters appear to be ok.
Notice
------
DH parameters of size 2048 created at:
* /home/vpnuser/easy-rsa-master/easyrsa3/pki/dh.pem
#Скопируем данный ключ в каталог конфигурации openvpn
sudo cp /home/vpnuser/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/
Создание статического ключа HMAC на сервере openvpn
cd /etc/openvpn
sudo openvpn --genkey --secret ta.key
Добавление пользователя openvpn
#Добавление неприлегированного пользователя от имени которого будет работать openvpn сервер
adduser --system --no-create-home --home /nonexistent --disabled-login --group openvpn
#Включить фаервол и Добавить службу в автозагрузку
sudo ufw enable
#Открыть порт openvpn для клиентов
sudo ufw allow 1194
Возможные проблемы
1. После перезапуска openvpn, интерфейс tun может не появиться. Чтобы избавиться от проблемы, необходимо создать файл /etc/modprobe.d/dist.conf и добавить в него строку: alias netdev-tun tun. После внесения изменений необходимо перезапустить сервер.
2. Нет подключения со стороны клиента. Необходимо убедиться, что порт сервера openvpn доступен для клиента
Подготовка клиента openvpn
Файлы конфигурации, ключи и сертификаты также как и в случае с сервером должны находится в каталоге /etc/openvpn
Файл openssl.cnf точно такой же как и на сервере openvpn
apt install openvpn
#Содержимое файла server.conf для клиента OpenVPN
dev tun
proto udp
remote 46.253.143.112 1194
client
resolv-retry infinite
ca "/etc/openvpn/ca.crt"
cert "/etc/openvpn/netbash.crt"
key "/etc/openvpn/client.key"
tls-auth "/etc/openvpn/ta.key" 1
remote-cert-tls server
persist-key
persist-tun
comp-lzo
verb 3
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-client.log
Создание инфраструктуры публичных ключей PKI для клиента openvpn
cd /home/chich
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
#Запуск инициализации pki
cd /home/chich/easy-rsa-master/easyrsa3
./easyrsa init-pki
#Запрос на сертификат и приватный ключ
./easyrsa gen-req client nopass
В процессе создания потребуется ввести имя клиента
-----
Common Name (eg: your user, host, or server name) [client]:admin-vpn
Notice
------
Private-Key and Public-Certificate-Request files created.
Your files are:
* req: /home/chich/easy-rsa-master/easyrsa3/pki/reqs/client.req
* key: /home/chich/easy-rsa-master/easyrsa3/pki/private/client.key
#Копируем приватный ключ в openvpn
sudo cp /home/chich/easy-rsa-master/easyrsa3/pki/private/client.key /etc/openvpn
Далее необходимо сделать иморт файла запроса на сервер CA
#Перенос файла запроса клиента на сервер CA
rsync -Pavr -e 'ssh -p 2222' /home/chich/easy-rsa-master/easyrsa3/pki/reqs/client.req ca@46.253.143.112:/home/ca/
#Импорт файла запроса на сервере CA
su - ca
cd /home/ca/easy-rsa-master/easyrsa3
./easyrsa import-req /home/ca/client.req admin-vpn
Notice
------
Request successfully imported with short-name: admin-vpn
This request is now ready to be signed.
#Подписываем сертификат клиента
Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at:
* /home/ca/easy-rsa-master/easyrsa3/pki/issued/admin-vpn.crt
#Создадим каталог для клиента
cd
mkdir certs
#Копируем в созданный каталог подписанный сертификат клиента
/home/ca/easy-rsa-master/easyrsa3/pki/issued/admin-vpn.crt
#А также публичный сертификат CA и созданный на сервере openvpn ta.key
sudo cp /etc/openvpn/ca.crt /etc/openvpn/ta.key certs/
#Добавить права
sudo chown -R ca:ca certs
#Синхронизируем созданный каталог с подписанным ключем клиента на пк клиента
rsync -Pavr -e 'ssh -p 2222' ca@46.253.143.112:/home/ca/certs /home/chich/
#Переносим файлы в директорию /etc/openvpn/ клиента
sudo cp certs/* /etc/openvpn/
#Перезапускаем сервер openvpn на клиенте
/etc/init.d/openvpn restart
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
*************************************************************************************************************
Установка прокси сервера squid3
У нас есть сеть vpn, теперь необходимо организовать доступ к ресурсу на сервере OpenVPN
#Установка прокси сервера
apt install squid3
#Редактирование конфигурационного файла /etc/squid/squid.conf
#Перед строкой http_access deny all добавить
acl allowed_hosts src 10.15.0.0/24
http_access allow allowed_hosts
http_access deny manager
#Перезапуск конфигурации
/etc/init.d/squid restart
#Проверка
http://10.15.0.1:3128
Источники
Связанные темы
Конфигурация vsftpd в ОС Linux Ubuntu
Установка и конфигурация samba в Linux
Конфигурация openvpn сервера в Linux Alpine
Использование iptables в linux
Базовые понятие о настройках и безопасности в сети
Использование ifconfig в Linux
Саздание сертификатов SSL (TLS) для сайта
Полезные сетевые утилиты Linux
Конфигурация сети в Alpine Linux
Преодоление разрыва соединения