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

Когда-то для создания безопасного канала передачи данных компаниям приходилось прокладывать кабели и защищать их от физического доступа, теперь с помощью VPN можно создавать защищенные виртуальные каналы, работающие через каналы Интернет, создавая безопасный «туннель». Но если к защите данных предъявляются повышенные требования, необходимо применять специальные сертифицированные средства защиты канала связи.

Уровень защиты, обеспечиваемый OpenVPN, позволяет использовать технологию VPN (Virtual Private Network) для многих коммерческих приложений.

OpenVPN создает соединение с помощью протоколов UDP или TCP с применением драйвера TUN/TAP. Протокол UDP и драйвер TUN позволяет подключаться к серверу OpenVPN клиентам, расположенным за NAT. OpenVPN позволяет выбрать произвольный порт для соединения, что делает возможным подключение клинетов из разных сетей имеющих определенные ограничения по подключению (обычно в публичных сетях закрыты определенные порты).

В OpenVPN безопасность и шифрование обеспечиваются OpenSSL (симметричная и ассиметричная криптография) и протоколом TLS (Transport Layer Security).
Для организации шифрованного канала связи необходимы сертификаты, которыми заверяются ключи шифрования: публичный (открытый) и приватный (секретный). Публичный ключ используется для зашифрования данных, а приватный — для расшифрования.

Любой выданный сертификат должна быть заверен организацией, которой доверяют. Эта организация играет роль удостоверяющего центра (Certification authority, CA). Это может быть как коммерческая организация с правом удостоверяющего центра сертификации, так и самоподписанный сертификат. Доверие к коммерческим сертификатам будет выходить за рамки самостоятельно организованного CA, но такие сертификаты стоят денег.

Установка OpenVPN на Linux CentOS 7

Ставим редактор nano (можно и не ставить, мне удобно когда установлен):

yum install nano

Автоматическое подключение сетевых адаптеров:

nano /etc/sysconfig/network-scripts/ifcfg-eth* (название сетевого интерфейса)

ONBOOT=yes

Отключаем Selinux:

setenforce 0

nano /etc/selinux/config
SELINUX=disabled

Настроим файрвол на нужный порт для OpenVPN, стандартный порт для OpenVPN 1194, но в публичных сетях данный порт может быть закрыт. Как правило открывают 80, 443 порты, поэтому можно использован порт 443. OpenVPN может быть настроен как на TCP, так и на UDP протокол. В зависимости от этого настраиваем:

firewall-cmd --permanent --add-port=1194/udp
или
firewall-cmd --permanent --add-port=1194/tcp

Применяем правило:

firewall-cmd --reload

Подключаем репозиторий:

yum install epel-release -y

Устанавливаем openvpn и easy-rsa:

yum install openvpn easy-rsa -y

В качестве сертификатов будем использовать самоподписанные сертификаты, а в качестве CA (центра сертификации) используем easy-rsa 3. Доверие к таким сертификатам не будет выходить за рамки компании, но они будут вполне достаточны, и самоподписанные сертификаты бесплатны.

С точки зрения безопасности недопустимо использования сервера CA в качестве других сервисов, поскольку на нем хранятся приватные ключи серверов, клиентов и самого CA. Получив доступ к ним CA будет скомпрометирован. Хорошим примером будет создание файлов запроса на создание сертификатов на сервере OpenVPN и передачи на носителе (не используя сети передачи данных) на сервер CA и создании в рамках CA сертификатов и обратной передаче на носителе на сервер OpenVPN. Но в данном примере я пропускаю вопрос безопасности, это решает каждый сам в рамках требований компании и собственного понимания безопасности.

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

ls  /usr/share/easy-rsa/
cd /usr/share/easy-rsa/3

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

nano vars

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="Company Name"
export KEY_EMAIL="mail@domain.com"
export KEY_CN="Company"
export KEY_OU="IT"
export KEY_NAME="openvpn-server.domain.com"
export KEY_ALTNAMES="openvpn-server"
export EASYRSA_KEY_SIZE=2048
export EASYRSA_ALGO=rsa
export EASYRSA_CA_EXPIRE=3650
export EASYRSA_CERT_EXPIRE=3650

Запускаем файл на исполнение:

. ./vars

Инициализируем PKI — инфраструктуру публичных ключей (Public Key Infrastructure):

./easyrsa init-pki

Получаем что-то похожее:

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/share/easy-rsa/pki

Генерируем корневой сертификат, создаем удостоверяющий центр CA:

./easyrsa build-ca

build-ca создаст два файла: ca.key и ca.crt. ca.key это приватный ключ центра CA, он секретный, его нельзя переносить на другие узлы сети, а ca.crt открытый, его и будем передавать на узлы серверов и клиентов OpenVPN.

Задаем пароль и вводим имя (Common Name). Заданый пароль защищает приватный ключ удостоверяющего центра, и потребуется каждый раз, когда новые создаваемые сертификаты будут подписываться в СА для серверов и клиентов.

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

./easyrsa build-ca nopass

Создаем ключ Диффи-Хеллмана, позволяет использовать небезопасный канал для получения общего секретного ключа. В случае похищения ключей исключает расшифрование трафика, записанного еще до этого похищения. Если CA и сервер OpenVPN разные сервера, то ключ DH создается на сервере OpenVPN:

./easyrsa gen-dh

Статический ключ (хэш-код) аутентификации сообщений HMAC (Hash-based Message Authentication Code) обеспечивает проверку подлинности информации, передаваемой между сторонами и является дополнительной защиты от DoS-атак и флуда. Этот ключ создается на сервере OpenVPN.

Для создания ta ключа используем команду:

openvpn --genkey --secret pki/ta.key

Для создания сертификата сервера необходимо сначала создать файл запроса (vpn-server.req):

./easyrsa gen-req vpn-server nopass

на Common Name вводим Enter, чтобы использовать настройку из файла vars. На его основе запрашиваем (подписываем) сертификат:

./easyrsa sign-req server vpn-server

После ввода команды подтверждаем правильность данных, введя yes:

  Confirm request details: yes

и вводим пароль, который указывали при создании корневого сертификата CA.

Если сотрудник уволился или сертификат скомпрометирован, необходимо заблокировать его. Специально для этой цели в OpenVPN предусмотрен список отзыва сертификатов CRL. В CA сгенерируем список отозванных сертификатов:

./easyrsa gen-crl

будет запрошен пароль доступа к приватному ключу ca.key удостоверяющего центра. Список отзыва сертификатов будет создан в файле easyrsa3/pki/crl.pem.

Заблокировать выданный ранее сертификат (clinet2):

./easyrsa revoke client2

Далее нужно скопировать новый файл CRL на сервер OpenVPN и перезапустить сервер OpenVPN.

Сертификаты сервера готовы и находятся в каталоге pki.

Дополнительно: https://github.com/OpenVPN/easy-rsa/blob/master/README.quickstart.md

Настройки OpenVPN сервера:

Создаем каталог в /etc/openvpn, в котором будут храниться необходимые сертификаты полученные от CA:

mkdir /etc/openvpn/keys

Копируем в него содержимое каталога pki:

cp pki/issued/vpn-server.crt pki/private/vpn-server.key pki/dh.pem pki/ca.crt pki/ta.key pki/crl.pem /etc/openvpn/keys/

Создаем конфигурационный файл:

nano /etc/openvpn/server.conf

# OpenVPN Server Config
# Указываем какой порт будет слушать наш сервер, по умолчанию 1194
port 1194

# Указываем протокол tcp или udp, у меня используется протокол tcp
proto tcp-server
#proto udp

# На каком устройстве будет работать OpenVPN сервер, tun0 - устройство создается автоматически
dev tun

# Сертификат удостоверяющего центра
ca /etc/openvpn/keys/ca.crt

# Сертификат и ключ сервера
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key

# Ключ Диффи-Хельмана используется для защиты передаваемых ключей по открытому каналу
dh /etc/openvpn/keys/dh.pem

# Список отозванных сертификатов
crl-verify /etc/openvpn/keys/crl.pem

# Секретный TLS ключ
tls-auth /etc/openvpn/keys/ta.key 0

# Тип шифрования AES 256 bit
cipher AES-256-CBC

# Подсеть в которой будут работать клиенты VPN сервера
server 172.16.16.0 255.255.255.0

# Файл куда будут записываться IP адреса выданные клиентам
ifconfig-pool-persist ipp.txt

# Выдаем пользователям необходимые маршруты (192.168.1.0 - локальная сеть)
push "route 192.168.1.201 255.255.255.0"

# Выдаем клиентам IP адрес DNS сервера (тут сервер внутри локальной сети для определения DNS имен)
push "dhcp-option DNS 192.168.1.1"

# Выдаем клиентам DNS суффикс нашей локальной сети
#push "dhcp-option DOMAIN domain.ru"

# Разрешаем подключенным клиентам OpenVPN сервера соединяться друг с другом
client-to-client

# Включаем возможность указания индивидуальных настроек для клиентов OpenVPN сервера
client-config-dir ccd

# Если необходимо разрешить нескольким пользователям подключаться по одному ключу (необходимо снять комментарий)
#duplicate-cn

# Проверяем состояние клиента, отправляем пакеты каждые 10 сек. если в течении 120 сек. клиент не ответил, то он считаться отключенным
keepalive 10 120

# Используем сжатие трафика (если не нужно то можно закомментировать)
comp-lzo

# Максимальное количество подключенных клиентов
max-clients 10

persist-key
persist-tun

# Записи о состоянии подключенных клиентов и т.п. (лог файл)
status /var/log/openvpn/openvpn-status.log

# Уровень логирования: 0 в лог попадают только записи о критических ошибках сервера, принимает значение от 0 до 11.
verb 0
# Количество записей после которых будет производиться запись в лог
mute 20

# режим работы сервера
mode server

# работа в режиме демона
daemon

Создаем каталог для логов сервера:

mkdir /var/log/openvpn

Папка индивидуальных настроек для клиентов OpenVPN сервера

mkdir /etc/openvpn/ccd

Разрешаем автоматический старт сервиса OpenVPN:

systemctl enable openvpn-server@server

И запускаем его:

systemctl start openvpn-server@server

Проверка состояния OpenVPN сервера:

systemctl status openvpn-server@server

Проверка наличия туннельного адаптера tun0:

ifconfig 
или 
ip a

После проверки наличия интерфейса tun0, убедимся что OpenVPN занял порт 1194 (или выбранный другой порт):

netstat -ltupn | grep 1194
или если нет netstat
ss -ltupn | grep 1194 

Настройка роутинга внутри сервера и маршрутизация:

nano /etc/sysctl.conf

добавляем в него следующую строку:
net.ipv4.ip_forward=1

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

sysctl -p /etc/sysctl.conf

Правила файрвола Firewalld

Включаем маскарадинг для зоны:

firewall-cmd --permanent --zone=public --add-masquerade

где public — активная зона, где находится сетевой интерфейс, который принимает запросы на подключение к OpenVPN.

Сохраним и применим правила:

firewall-cmd --complete-reload

Правила для клиента OpenVPN

Если необходимо присваивать определенных клиентам статические адреса, то прописываем правила (vpn-clinet-1 — клиент с сертификатом vpn-clinet-1 ):

nano /etc/openvpn/ccd/vpn-client-1

ifconfig-push 172.16.16.10 172.16.16.9
push "redirect-gateway"

Перезапустим сервер:

systemctl restart openvpn-server@server

Информация: критерии выбора адреса и шлюза клиента Windows драйвера TAP можно посмотреть командой openvpn —show-valid-subnets.

Настройка OpenVPN-клиента

Для настройки клиента необходимо на сервере сгенерировать сертификаты, а на клиентском компьютере установить программу openvpn и настроить ее.

На сервере CA генерируем сертификаты для клиента.

cd /usr/share/easy-rsa/3

Запускаем еще раз vars:

. ./vars

Создаем запрос и сам сертификат:

./easyrsa gen-req vpn-client-1 nopass
./easyrsa sign-req client vpn-client-1

Подтверждаем правильность данных и вводим пароль корневого сертификата. В данном примере мы создадим сертификат для vpn-client-1.

Копируем ключи во временную директорию для дальнейшей передачи клиенту и задаем права на файлы:

mkdir /tmp/keys

cp pki/issued/vpn-client-1.crt pki/private/vpn-client-1.key pki/dh.pem pki/ca.crt pki/ta.key /tmp/keys

chmod -R a+r /tmp/keys

Из каталог /tmp/keys переносим файлы на клиентский компьютер.

На клиенте:

Заходим на официальную страницу загрузки OpenVPN и скачиваем клиента для Windows.

Копируем в C:\Program Files\OpenVPN\config файлы ca.crt, client.crt, client.key, dh.pem, ta.key из каталога /tmp/keys на сервере.

В C:\Program Files\OpenVPN\config создаем файл config.ovpn с содержанием:

# OpenVPN Client Config
# Тип подключения - клиент
client

# Через какое устройство подключаемся
dev tun0

# Через какой протокол работаем, такой же как на сервере
proto tcp

# Адрес OpenVPN сервера и его порт (можно указать IP или URL)
remote 111.111.111.111 1194

# Тип шифрования, как на OpenVPN сервере
cipher AES-256-CBC

# Сертификат удостоверяющего центра
ca ca.crt

# Сертификат и ключ клиента
cert vpn-client-1.crt
key vpn-client-1.key

# Клиент поддерживает шифрование
tls-client

# Указываем путь к ключу TLS
tls-auth ta.key 1

# защита от mitm-атак, путем проверки серверных сертификатов
remote-cert-tls server

# Не кэшировать пароли в памяти
auth-nocache

# Включаем компрессию данных
comp-lzo

persist-key
persist-tun

# Для клиентов с нестабильным доступом, например Wi-Fi
resolv-retry infinite

# Не использовать специфический порт для работы
nobind

keepalive 10 120

# Уровень логирования 0 в лог попадают только записи о критических ошибках, принимает значение от 0 до 11
verb 0

# Количество записей после которых будет производиться запись в лог
mute 20

После необходимо удалить сертификаты клиента с сервера /tmp/keys

rm -R /tmp/keys

Осталось на клиенте создать подключение к серверу OpenVPN.

Top