20.09.2024

Установка и настройка OpenConnect VPN Server с поддержкой Let’s Encrypt

Сервер OpenConnect VPN (ocserv) — это сервер Linux SSL VPN с открытым исходным кодом, разработанный для организаций, которым требуется VPN с удаленным доступом и возможностью управления и контроля корпоративных пользователей.

Подготовка

Подготовка сервера для работы это личные предпочтения, у каждого они свои, например вот

Важна установка корректного имени сервера

hostname -f
#vpn.notdev.ru

Клиентские приложения

Установка OpenConnect VPN Server

В стандартном репозитории Debian на текущий момент, есть только версия 1.1.6, если вам нужна функция camouflage, то придется включить тестовый репозиторий и установить версию 1.2.4 и выше либо скомпилировать из исходников самостоятельно.

apt install -y ocserv certbot

Делаем резервную копию конфигурации, создаем рабочий конфиг из дефолтного без комментариев и пустых строк

cp /etc/ocserv/ocserv.conf{,.bak}
cat /etc/ocserv/ocserv.conf.bak | grep -v '^#' | sed '/^$/d' > /etc/ocserv/ocserv.conf

Выпуск SSL сертификата

Выпуск  бесплатного Let’s Encrypt SSL сертификата 

certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.notdev.ru

Не забудьте добавить задание в cron для перевыпуска сертификатов

Отредактируйте nano /etc/ocserv/ocserv.conf

Укажите SSL сертификат и приватный ключ, а так же перечень доменных имен используемых VPN сервером

server-cert = /etc/letsencrypt/live/vpn.notdev.ru/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.notdev.ru/privkey.pem
default-domain = vpn.notdev.ru

Можно использовать несколько доменных имен одновременно, default-domain = “vpn.notdev.ru ocserv.notdev.ru”, ко всем доменным именам должны быть выпущены соответствующие SSL сертификаты

Проверка авторизации пользователя

Воспользуемся базовой авторизацией PAM, создайте учетную запись user-vpn-test

ocpasswd -c /etc/ocserv/passwd user-vpn-test

Отредактируйте nano /etc/ocserv/ocserv.conf

auth = "plain[passwd=/etc/ocserv/passwd]"

Одновременно может быть указана только одна строка с аутентификацией, но в ней можно перечислить несколько источников, а так же использовать 2FA

Перезапустите OCServ

service ocserv restart
service ocserv status

Настройка завершена и в текущей конфигурации уже можно пользоваться.

Настройка сети

  • Сеть 192.169.100.0/24 (маска сети 255.255.255.0)
  • IP адрес VPN сервера 192.168.100.1
  • DNS 192.168.10.11 192.168.10.12
ipv4-network = 192.168.100.1
ipv4-netmask = 255.255.255.0
dns = 192.168.10.11
dns = 192.168.10.12

Для отправки всех DNS-запросов в VPN туннель. Это значение по умолчанию когда установлен маршрут по умолчанию

tunnel-all-dns = true

Для раздельной отправки DNS-запросов в VPN туннель, необходимо для доменов в которых следует использовать предоставленный DNS

split-dns = notdev.local

Маршруты для пересылки клиенту

route = 192.168.10.0/255.255.255.0
route = 192.168.11.0/255.255.255.0

Есть несколько вариантов

  • Default – Весь трафик идет через VPN соединение
  • Split VPN – только указанные подсети или отдельные IP адреса будут перенаправляться через VPN соединение
  • NO route – указанные подсети или отдельные IP адреса будут НЕ перенаправляться через VPN соединение
    route = default

    route = 192.168.10.11/255.255.255.254
    route = 192.168.10.12/255.255.255.254
    route = 192.168.11.0/255.255.255.0

    no-route = 192.168.1.0/255.255.255.0
    no-route = 192.168.1.1/255.255.255.254

Текущая конфигурация

Итоговый конфигурационный файл ocserv.conf должен выглядеть примерно так

auth = "plain[passwd=/etc/ocserv/passwd]"
tcp-port = 443
udp-port = 443
run-as-user = ocserv
run-as-group = ocserv
socket-file = /run/ocserv-socket
chroot-dir = /var/lib/ocserv
server-cert = /etc/letsencrypt/live/vpn.notdev.ru/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.notdev.ru/privkey.pem
isolate-workers = true
max-clients = 16
max-same-clients = 2
rate-limit-ms = 100
server-stats-reset-time = 604800
keepalive = 32400
dpd = 90
mobile-dpd = 1800
switch-to-tcp-timeout = 25
try-mtu-discovery = false
cert-user-oid = 0.9.2342.19200300.100.1.1
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3"
auth-timeout = 240
min-reauth-time = 300
max-ban-score = 80
ban-reset-time = 1200
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-occtl = true
pid-file = /run/ocserv.pid
log-level = 1
device = vpns
predictable-ips = true
default-domain = vpn.notdev.ru
ipv4-network = 192.168.100.1
ipv4-netmask = 255.255.255.0
dns = 192.168.10.11
dns = 192.168.10.12
split-dns = notdev.local
ping-leases = false
route = 192.168.10.0/255.255.255.0
route = 192.168.11.0/255.255.255.0
cisco-client-compat = true
dtls-legacy = true
client-bypass-protocol = false

Включаем возможность пересылки трафика

echo "#forwarding" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.d/99-xtune.conf

sysctl -p /etc/sysctl.d/99-xtune.conf

Дополнительные настройки для сетевого интерфейса

Выключаем IPv6 и увеличиваем пропускную способность канала передачи данных. 

BBR (Bottleneck Bandwidth and RTT) — алгоритма контроля перегрузки TCP, патчи с которым ещё в 2016 году были опубликованы компанией Google и приняты в основное ядро Linux. Применение этой технологии в некоторых конфигурациях позволяет увеличить пропускную способность канала передачи данных.

echo "#disable IPv6" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" | tee -a /etc/sysctl.d/99-xtune.conf

echo "#tune TCP" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.core.default_qdisc=fq" | tee -a /etc/sysctl.d/99-xtune.conf
echo "net.ipv4.tcp_congestion_control=bbr" | tee -a /etc/sysctl.d/99-xtune.conf

sysctl -p /etc/sysctl.d/99-xtune.conf

Настройка Firewall

iptables

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

nftables

nft add table nat
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname "eth0" masquerade

Более полный конфиг смотрите в статье о безопасности OpenConnect

Возможные проблемы

Дополнительные настройки


Дополнительная информация

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *