Как работает OpenVPN #
OpenVPN — это программная реализация технологии VPN (Virtual Private Network), которая позволяет создать защищённое соединение между клиентом и сервером через Интернет. OpenVPN создаёт зашифрованный туннель, внутри которого передаются все сетевые данные пользователя.
Когда клиент подключается к серверу OpenVPN, происходит несколько этапов:
-
Аутентификация
Клиент и сервер проверяют друг друга. Чаще всего используется инфраструктура сертификатов (CA, серверный и клиентские сертификаты), но также может применяться логин и пароль или предварительно согласованный ключ. -
Установление защищённого канала
После успешной аутентификации создаётся защищённое соединение на базе TLS/SSL. Все передаваемые данные шифруются (например, с использованием AES-256). -
Создание виртуального сетевого интерфейса
На стороне клиента создаётся виртуальный интерфейс (tunилиtap). Через него операционная система отправляет сетевой трафик в VPN-туннель. -
Передача трафика через туннель
Трафик клиента инкапсулируется, шифруется и отправляется на 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