Перейти к основному содержимому

Установка OpenVPN на Ubuntu

·560 слов·3 минут
DevOps • Networks • Security • Infrastructure
Автор
DevOps • Networks • Security • Infrastructure
DevOps/Network/Infra Engineer, CyberSecurity Expert

Как работает OpenVPN
#

OpenVPN — это программная реализация технологии VPN (Virtual Private Network), которая позволяет создать защищённое соединение между клиентом и сервером через Интернет. OpenVPN создаёт зашифрованный туннель, внутри которого передаются все сетевые данные пользователя.

Когда клиент подключается к серверу OpenVPN, происходит несколько этапов:

  1. Аутентификация
    Клиент и сервер проверяют друг друга. Чаще всего используется инфраструктура сертификатов (CA, серверный и клиентские сертификаты), но также может применяться логин и пароль или предварительно согласованный ключ.

  2. Установление защищённого канала
    После успешной аутентификации создаётся защищённое соединение на базе TLS/SSL. Все передаваемые данные шифруются (например, с использованием AES-256).

  3. Создание виртуального сетевого интерфейса
    На стороне клиента создаётся виртуальный интерфейс (tun или tap). Через него операционная система отправляет сетевой трафик в VPN-туннель.

  4. Передача трафика через туннель
    Трафик клиента инкапсулируется, шифруется и отправляется на VPN-сервер. Сервер расшифровывает пакеты и передаёт их дальше — либо во внутреннюю сеть, либо в Интернет.

На каком порту работает OpenVPN
#

Порт Протокол Описание
1194 UDP Порт OpenVPN по умолчанию. Используется чаще всего, так как UDP обеспечивает лучшую производительность и меньшие задержки.
1194 TCP Альтернативный вариант работы OpenVPN через TCP. Может использоваться в сетях, где UDP ограничен или блокируется.
443 TCP Иногда OpenVPN настраивают на стандартный HTTPS-порт для обхода сетевых ограничений. В этом случае VPN-трафик выглядит как обычное HTTPS-соединение и проходит через большинство фаерволов.

Установка OpenVPN и Easy-RSA
#

apt update
apt install openvpn easy-rsa -y

# Проверяем версию
openvpn --version

Подготовка PKI (сертификаты и ключи)
#

mkdir /etc/openvpn/easy-rsa
mkdir /etc/openvpn/ccd
cd /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/* .

# Инициализируем инфраструктуру PKI ключей
mv vars.example vars
./easyrsa init-pki

# Создаем удостоверяющий центр CA
./easyrsa build-ca

# При создании CA задаем имя, например MyVPN-CA
# В итоге получаем 2 файла
# /etc/openvpn/easy-rsa/pki/private/ca.key
# /etc/openvpn/easy-rsa/pki/ca.crt

# Создаём ключ Диффи-Хеллмана
./easyrsa gen-dh

# В итоге получаем файл DH
/etc/openvpn/easy-rsa/pki/dh.pem

# Создаём ключ для шифрования TLS control channel, что повышает безопасность
openvpn --genkey secret /etc/openvpn/server/tc.key

Создание конфигурации сервера
#

# Генерация сертификата сервера сроком на 10 лет
./easyrsa gen-req server nopass
./easyrsa --days=3650 sign-req server server

# В итоге получаем подписанный УЦ сертификат сервера
# /etc/openvpn/easy-rsa/pki/issued/server.crt
# /etc/openvpn/easy-rsa/pki/private/server.key

# Копирование сертификатов и ключей в папку сервера
cp pki/ca.crt /etc/openvpn/server/ca.crt
cp pki/dh.pem /etc/openvpn/server/dh.pem
cp pki/issued/server.crt /etc/openvpn/server/server.crt
cp pki/private/server.key /etc/openvpn/server/server.key

# Создаём конфигурационный файл server.conf
nano /etc/openvpn/server/server.conf
...

# Запуск OpenVPN Server
systemctl enable openvpn@server 
systemctl start openvpn@server
systemctl status openvpn@server 

Создание конфигурации клиента
#

# Генерация сертификата клиента сроком на 10 лет
./easyrsa gen-req user1 nopass
./easyrsa --days=3650 sign-req client user1

# В результате получаем подписанный УЦ сертификат клиента
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key

# Клиенту для подключения понадобятся
ca.crt
user1.crt
user1.key
tc.key
# Можно вложить их в один конфигурационный файл

# Создаём конфигурационный файл user1.ovpn
/etc/openvpn/users-conf/user1.ovpn
...

Настройка SNAT и IP Forwarding
#

# SNAT
apt install iptables-persistent -y
iptables -t nat -A POSTROUTING -s 10.200.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -L -n -v

# Сохраняем правила добавленные в iptables
netfilter-persistent save
# или
iptables-save > /etc/iptables/rules.v4

# IP Forwarding
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Траблшутинг
#

journalctl -u openvpn-server@server
openvpn --config /etc/openvpn/server/server.conf

Дополнительно
#

# Добавляем дату и время в логи сервера
# Убираем опцию --suppress-timestamps
nano /lib/systemd/system/openvpn-server@.service 
systemctl daemon-reload
systemctl restart openvpn-server@server
tail -f /var/log/openvpn/openvpn.log

# Временно заблокировать учетную запись через ccd
nano /etc/openvpn/ccd/user1
disable
# Перезапуск не нужен — сработает при следующем подключении клиента

# Разрешаем мультиконнект для клиентов с одним сертификатом
nano /etc/openvpn/server/server.conf 
duplicate-cn

Официальная документация от Ubuntu

Related

Настройка Policy-based и Route-based VPN через strongSwan с swanctl
·834 слов·4 минут
Настройка IPSec между серверами Ubuntu (AWS) и Ubuntu (Azure)
·1519 слов·8 минут
Настройка GRE over IPSec
·1120 слов·6 минут