Поднимаем OpenVPN на Linux

Возникла вот намедни задача обеспечить более-менее безопасное подключение удалённого узла под Windows к корпоративной сети. На ум пришло несколько вариантов:

  1. Поднять SSH-туннель до шлюза, в нём уже пропускать трафик. Это я уже прошёл. Захотелось чего-то новенького.
  2. Использовать VPN технологии. Этот вариант показался наиболее привлекательным, поскольку я пока ещё не налаживал полноценного взрослого VPN. Об этом и будет статья.

Так, с методом разобрались. Теперь определяемся с протоколом. Выбирал я из нескольких вариантов. Главное требование было – OpenSource или что-то доступное. Клиент желательно встроенный в Windows или несложный в установке. Ну и уровень безопасности тоже нужен на высоте, что-то современное, криптостойкое.

  • PPTP – первый кандидат. Простой в настройке. Можно аутентифицироваться на RADIUS. Клиент встроен в Windows, бери да настраивай! Но вот безопасность оставляет желать лучшего. Беглый просмотр веба дал понять, что его взломали давно и даже MS от него уже отказались. Вычёркиваем.
  • L2TP – второй кандидат. Вообще без шифрования, нужно прикручивать насадку. Например IPSec. Такая связка мне показалась не очень, поэтому я её тоже отмёл.
  • ViPNet – коммерческий и достаточно дорогой. Вычёркиваем.
  • OpenVPN – опенсорс, использует современные алгоритмы, работает по принципу PKI, что мне не слишком нравилось. Но разобраться в теме хотелось, поэтому я выбрал его!

Итак, исходные данные: сервером будет выступать не особо мощная виртуалка, на базе CentOS 6.11. Количество клиентов будет порядка 8-15. Посмотрим, как попрёт.

Установка и настройка сервера

  1. # yum update -y && yum install epel-release -y && yum install -y nano tcpdump wget openvpn easy-rsa
    Обновляем установленные пакеты, ставим EPEL-репозиторий и устанавливаем всё необходимое.
  2. # chkconfig openvpn on
    Помещаем сервис в автозагрузку
  3. # cp /usr/share/doc/openvp-2.4.7/sample/sample-config-files/server.conf /etc/openvpn
    Копируем заготовку конфига в каталог сервиса
  4. # nano /etc/openvpn/server.conf
    Приводим содержимое файла в соответствие с нашими требованиями:
    # IP-адрес, который слушает сервис, порт и протокол
    local 192.168.1.XXX
    port 1194
    proto udp
    #Тип создаваемого устройства. Используем L3 - tun. Можно было сделать L2, это будет tap...
    dev tun
    # ключи и сертификаты
    ca "/etc/openvpn/easy-rsa/pki/ca.crt"
    cert "/etc/openvpn/easy-rsa/pki/issued/vpn-server.crt"
    key "/etc/openvpn/easy-rsa/pki/private/vpn-server.key"
    dh "/etc/openvpn/easy-rsa/keys/dh.pem"
    tls-auth "/etc/openvpn/easy-rsa/keys/ta.key 0
    askpass "/etc/openvpn/passw"
    # Диапазон выделяемых адресов
    server 10.10.10.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    keepalive 10 120
    #Алгоритм шифрования
    cipher AES-256-CBC
    user nobody
    group nobody
    persist-key
    persist-tun
    status /var/log/openvpn-status.log
    log /var/log/openvpn.log
    verb 4
    explicit-exit-notify 1
  5. Создаём каталог для ключей:
    # mkdir -p /etc/openvpn/easy-rsa/keys
  6. Копируем заготовки для ключей в рабочий каталог:
    # cp -r /usr/share/easy-rsa/3.0.6/* /etc/openvpn/easy-rsa/
  7. Создаём файл-шаблон с информацией для генерации сертификатов:
    # nano /etc/openvpn/easy-rsa/vars
    export KEY_COUNTRY="RU"
    export KEY_PROVINCE="XX"
    export KEY_CITY="Gorod"
    export KEY_ORG="MyORG"
    export KEY_EMAIL="admin@MyORG.ru"
    export KEY_OU="VPN"
    export KEY_NAME="EasyRSA"
  8. Перечитываем файл-шаблон для инициализации констант и переходим в каталог для удобства:
    # source /etc/openvpn/easy-rsa/vars
    # cd /etc/openvpn/easy-rsa
  9. Инициализируем систему PKI:
    # ./easyrsa init-pki
  10. Создаём корневой сертификат:
    # ./easyrsa build-ca
    На этом этапе потребуется ввести пароль для защиты ключа.
  11. Создаём сертификат для сервера:
    # ./easyrsa build-server-full vpn-server
    где vpn-server – Cannonical Name. Кстати, при генерации всех остальных сертификатов будет выдаваться запрос на ввод пароля, заданного на шаге 10. Ну и для защиты каждого из сертификатов нужен будет пароль. Пароль от сервера можем записать в файл /etc/openvpn/passw.
  12. Генерируем ключи Диффи-Хелмана (DH), процесс занимает минуты две:
    # ./easyrsa gen-dh
  13. Создаём ключи для каждого клиента:
    # ./easyrsa build-client-full client1
    где client1 – Cannonacal Name.Также потребуется ввести и задать пароль защиты.
  14. Создаём ключи TLS-TA:
    # openvpn --genkey --secret keys/ta.key
  15. Разрешаем маршрутизацию трафика между интерфейсами:
    # nano /etc/sysctl.conf
    net.ipv4.ip_forward = 1
  16. Разрешаем трафик на Netfilter:
    iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
    iptables -I OUTPUT 1 -p udp --sport 1194 -j ACCEPT
    iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT
    iptables -I FORWARD -i tun0 -o eth0 -j ACCEPT
  17. Качаем клиента с оф.сайта.
  18. Каждому клиенту поставляем комплект: установщик, ca.crt, client1.crt, client1.key, ta.key и файл конфигурации (я именую все файлы по CA клиента) client1.ovpn следующего содержания:
    remote <внешний IP сервера> 1194
    proto udp
    resolv-retry infinite
    cipher AES-256-CBC
    persist-key
    persist-tun
    client
    dev tun
    key client1.key
    cert client1.crt
    ca ca.crt
    tls-auth ta.key 1
  19. После установки клиента, пользователь копирует папку с конфигурацией в каталог %userprofile%\openvpn\config и запускает приложение. Должно подхватиться автоматически.
  20. Осталось настроить маршрутизацию и всё, доступ в корпоративную сеть готов!
  21. P.S. Если адресация перед NAT удалённого хоста совпадает с адресацией корпоративной сети, то придётся помучиться. Мне здорово помогла статейка https://habr.com/ru/post/117320/
Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Leave a Reply