Главная
Главная Руководства FreeBSD › OpenVPN сервер на FreeBSD 12



Автор:

Статья опубликована: 2020-02-25 23:02:23
Последние правки: 2020-02-26 18:25:11

В нынешние тяжелые времена, OpenVPN сервер в умелых руках не будет лишним. Как установить, настроить и эксплуатировать OpenVPN сервер на FreeBSD 12 - читайте в этой статье.

  • Исходные данные
    # uname -sr
    FreeBSD 12.1-RELEASE-p1
    # pkg info | grep openvpn
    openvpn-2.4.8_2                Secure IP/Ethernet tunnel daemon
    

  • Установка
    # cd /usr/ports/security/openvpn
    # make install clean
    
    В настройках во время установки необходимо выбрать как минимум:
    [ ] ASYNC_PUSH       Enable async-push support
    [ ] DOCS             Build and/or install documentation
    [x] EASYRSA          Install security/easy-rsa RSA helper package
    [x] EXAMPLES         Build and/or install examples
    [x] LZ4              LZ4 compression support
    [x] LZO              LZO compression support
    [ ] PKCS11           Use security/pkcs11-helper (OpenSSL only)
    [ ] SMALL            Build a smaller executable with fewer features
    [ ] TEST             Build and/or run tests
    [ ] TUNNELBLICK      Tunnelblick XOR scramble patch (READ HELP!)
    [ ] X509ALTUSERNAME  Enable --x509-username-field (OpenSSL only)
    ─────────────────────────── SSL protocol support ─────────────────────────
    (*) OPENSSL          SSL/TLS support via OpenSSL
    ( ) MBEDTLS          SSL/TLS via mbedTLS (lacks TLS v1.3)
    
    После установки, создаем директории и копируем файлы:
    # mkdir /usr/local/etc/openvpn
    # mkdir /usr/local/etc/openvpn/ccd
    # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf  /usr/local/etc/openvpn/
    # cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa
    
    # cd /usr/local/etc/openvpn/easy-rsa
    
    Далее, приступаем к генерации ключей. Заполняем необходимые поля об организации, городе и т.д. в конфигурационном файле Easy-RSA /usr/local/etc/openvpn/easy-rsa/vars. Необходимо раскомментировать и изменить строки:
    set_var EASYRSA_REQ_COUNTRY     "<СТРАНА>"
    set_var EASYRSA_REQ_PROVINCE    "<ОБЛАСТЬ>"
    set_var EASYRSA_REQ_CITY        "<ГОРОД>"
    set_var EASYRSA_REQ_ORG         "<ОРГНИЗАЦИЯ>"
    set_var EASYRSA_REQ_EMAIL       "<EMAIL>"
    set_var EASYRSA_REQ_OU          "<ОТДЕЛ>"
    
    Генерация ключей осуществляется скриптом easyrsa.real
    # ./easyrsa.real help
    # ./easyrsa help COMMAND
    # ./easyrsa help options
    
    Одноразово создаем инфраструктуру публичного ключа (Public Key Infrastructure):
    # ./easyrsa.real init-pki
    
    В результате чего будет создана структура каталогов для будущих ключей, /usr/local/etc/openvpn/easy-rsa/pki.

    Создаем Certificate Authority. Делаем это без пароля при запуске (nopass), так что будьте бдительны в плане защиты ключей:
    # ./easyrsa.real build-ca nopass
    
    Создаем Server Certificate:
    # ./easyrsa.real build-server-full openvpn-server nopass
    
    Генерируем Diffie Hellman Parameters
    # ./easyrsa.real gen-dh
    
    Создаем ключ для tls-аутентификации:
    # openvpn --genkey --secret pki/private/ta.key
    
    Собираем все нужные серверные ключи в одном месте и с нужными названиями файлов:
    # cp /usr/local/etc/openvpn/easy-rsa/pki/ca.crt /usr/local/etc/openvpn/
    # cp /usr/local/etc/openvpn/easy-rsa/pki/dh.pem /usr/local/etc/openvpn/dh2048.pem
    # cp /usr/local/etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt /usr/local/etc/openvpn/server.crt
    # cp /usr/local/etc/openvpn/easy-rsa/pki/private/openvpn-server.key /usr/local/etc/openvpn/server.key
    # cp /usr/local/etc/openvpn/easy-rsa/pki/private/ta.key /usr/local/etc/openvpn/
    
    Правим /usr/local/etc/openvpn/server.conf:
    - можно задать свой порт, отличный от 1194, который используется по умолчанию
    port 1195
    
    - TCP!
    proto tcp
    #proto udp
    
    - раскомментируем client-config-dir:
    client-config-dir ccd
    
    - ищем cipher AES-256-CBC и добавляем ниже строку auth SHA512:
    cipher AES-256-CBC
    auth SHA512
    
    - ищем и расскомментируем:
    user nobody
    group nobody
    
    compress lz4-v2
    push "compress lz4-v2"
    
    comp lzo
    
    Добавляем в /etc/rc.conf:
    openvpn_enable="YES"
    openvpn_configfile="/usr/local/etc/openvpn/server.conf"
    openvpn_dir="/usr/local/etc/openvpn"
    

    Правила для брандмауера:
    /sbin/ipfw -q add allow all from XXX.XXX.XXX.XXX 1195 to any via re0
    /sbin/ipfw -q add allow all from any to XXX.XXX.XXX.XXX 1195 via re0
    /sbin/ipfw -q add allow all from any to any via tun0
    
    Первые два правила разрешают пакеты для подключения клиентов через внешний ip сервера к OpenVPN;
    Третье правило разрешает пакеты на tun0 интерфейсе OpenVPN сервера;

    На этом настройка OpenVPN сервера на минималках закончена. Клиенты смогут соединяться с вашим OpenVPN сервером.


  • Запускаем
    # /usr/local/etc/rc.d/openvpn start
    

  • Клиенты
    Выпуск клиентского сертификата:
    # cd /usr/local/etc/openvpn/easy-rsa
    # ./easyrsa.real build-client-full <CLIENT_NAME> nopass
    

    Скрипт для генерации файла, содержащего все необходимые сертификаты, а также настройки клиента:
    # mkdir -p /usr/local/etc/openvpn/client-configs/files
    # chmod 700 /usr/local/etc/openvpn/client-configs/files
    
    Создаем файл /usr/local/etc/openvpn/client-configs/base.conf со следующим содержимым:
    client
    dev tun
    proto tcp
    remote XXX.XXX.XXX.XXX 1195
    nobind
    user nobody
    group nogroup
    persist-key
    persist-tun
    key-direction 1
    cipher AES-256-CBC
    auth SHA512
    comp-lzo
    verb 1
    


  • Если мы хотим выпускать клиентов в интернет.

    Я было начал писать про это, но на сервере надо было поднимать NAT, а в случае ядерного ната это грозит пересборкой ядра с последующей перезагрузкой сервера, что было неприемлимо (я про перезагрузку). Потому я решил обойтись доступом по VPN к серверу, а дальше использовать treeproxy. Ниже вы можете почитать заметки на эту тему, но на практике реализации не было. Допишу, как появится необходимость.

    /usr/local/etc/openvpn/server.conf:
    - найти, закомментировать или раскомментировать строчки в соответствии с теми, что написаны ниже:
    dev tap
    ;dev tun
    #server 10.8.0.0 255.255.255.0
    server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
    push "redirect-gateway def1 bypass-dhcp"
    


  • Ошибки

    - Cannot allocate TUN/TAP dev dynamically
    : Ядро собрано без поддержки tap. Пересоберите ядро или kldload if_tap