Настройка OpenVPN сервера в UNIX

Предисловие. OpenVPN можно настроить в двух режимах: routed (tun) или L3 инкапсуляция, и bridge (tap) или L2 инкапсуляция. В зависимости от режима, логика работы vpn сети и настройки openvpn будут отличатся. Что бы понять какой тип нужен для конкретной задачи, нужно ознакомится с этим материалом «Bridging-vs-Routing». В этой же статье мы рассмотрим конфигурации OpenVPN используя routed (tun) режим.



Конфигурация предоставляет подключение более одного клиента к локальной сети 192.168.1.0/24 за openvpn сервером, для аутентификации используються сертификаты с возможностью их отзыва (CRL)


Требования:
пакет OpenVPN на сервере и клиенте
поддержка драйвера tun устройства клиентом и сервером
центр сертификации (CA) - можно на одном хосте с openvpn
утилита easy-rsa для создания PKI
форвардинг пакетов должен быть разрешен
в фаерволе openvpn сервера должны быть разрешающие правила для прохождения трафика in/out на tun интерфейс, на клиентах должен быть маршрут к сетям 10.90.90.0/24, 192.168.1.0/24. На хостах из локальной сети 192.168.1.0/24 за openvpn сервером, должен быть маршут к сети 10.90.90.0/24 или же на openvpn сервере должен быть включен маскарадинг ip адресов vpn клиентов (nat для сети 10.90.90.0/24) в локальную сеть 192.168.1.0/24


Приступаем к настройке

  1. устанаваливам openvpn в зависимости от OS
    cd /usr/ports/security/openvpn && make && make installclean	#FreeBSD
    apt-get install openvpn						#Ubuntu,Debian
    yum install openvpn						#Centos
  2. создаем конфигурационный файл для сервера
    server.conf
    #указываем на каком ip будет слушать openvpn сервер
    local 81.82.83.84
    # Протокол
    proto udp
    # На каком порту будет работать OpenVPN
    port 1194
    # Тип устройства. tun devices encapsulate IPv4 or IPv6 (OSI Layer 3) while tap devices encapsulate Ethernet 802.3 (OSI Layer 2).
    dev tun
    # сжатие трафика
    comp-lzo
    #отключаем адаптивный режим сжатия трафика
    comp-noadapt
    #максимальный размер пакета
    #tun-mtu 1500
    #только для UDP, максимальный размер фрагмента данных
    #fragment 1460
    #ограничивает максимальный размер пакета в TCP туннеле vpn
    #mssfix
    # Автоматически присваиваем адреса всем клиентам в этом диапазоне
    server 10.90.90.0 255.255.255.0
    # Маршрут, который должен добавить каждый клиент себе в таблицу маршрутизации для доступа к LAN сети за сервером
    push "route 192.168.1.0 255.255.255.0"
    #указывает клиентам слать весь трафик через VPN
    #push "redirect-gateway def1"
    # Если будут Windows клиенты – нужно ставить subnet топологию
    topology subnet
    # Не перечитывать файлы ключей при перезапуске OpenVPN
    persist-key
    # Не перезапускать/пересоздавать tun/tap устройство и скрипты при перезапуске OpenVPN
    persist-tun
    # Каждые 10 сек пинговать удаленный хост и если через 60 сек нет ответа – перезапустить связанный туннель.
    keepalive 10 60
    # Добавить связь между OpenVPN клиентами
    client-to-client
    # Позволять подключение только тех клиентов, у которых сертификат X.509 EKU с атрибутом "TLS Web Client Authentication"
    remote-cert-tls client
    # Дополнительный уровень HMAC аутентификации против DDoS c direction=0 (в клиентов будет 1).
    tls-auth        /usr/local/etc/openvpn/certs/ta.key 0
    # Diffie Hellman параметры для временных ключей
    dh              /usr/local/etc/openvpn/certs/dh2048.pem
    # Рутовый сертификат
    ca              /usr/local/etc/openvpn/certs/ca.crt
    # Подписанный сертификат VPN сервера
    cert            /usr/local/etc/openvpn/certs/vpn-server.crt
    # Приватный ключ VPN сервера
    key             /usr/local/etc/openvpn/certs/vpn-server.key
    # CRL (certificate revocation list) для отзыва цифровых сертификатов
    crl-verify      /usr/local/etc/openvpn/certs/crl.pem
    # Юзер и група от имени которого запускать OpenVPN сервер
    user nobody
    group nobody
    # Уровень логирования
    verb 5
    # Режим запуска - демон
    daemon
    # Путь к лог файлу
    log-append /var/log/openvpn-server.log
    # Статус VPN подключений пишем каждые 3 сек
    status /var/run/openvpn.status 3


    Генерируем файл параметров Diffie-Hellma и HMAC для дополнительной защиты

    openssl dhparam -out /usr/local/etc/openvpn/certs/dh2048.pem
    openvpn --genkey --secret /usr/local/etc/openvpn/certs/ta.key


    Ставим нужные права на папку cert

    chown -R nobody:nobody /usr/local/etc/openvpn/certs
    chmod 700 /usr/local/etc/openvpn/certs
  3. Настройка обратной маршрутизации
    Эти настройки нужны, что бы пакеты от vpn клиентов к хостам в локальной сети 192.168.1.0/24 за vpn сервером ходили без проблем туда\обратно. Маршрутизация у клиентов уже настроена за счет опции push в конифге server.conf. Самый простой способ сделать обратную маршрутизацию для хостов в локальной сети за vpn сервером - это использовать маскарадинг (в таком случае для пакетов пришедших с подсети 10.90.90.0/24 будет подменятся ip на ip адрес VPN сервера, который висит на сетевом интерфейсе смотрящем в локальную сеть).
    #включаем форвардинг пакетов, подойдет как для FreeBSD так и Ubuntu,Debian,Centos
    sysctl net.inet.ip.forwarding=1 && echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf 
    #Для FreeBSD включаем NAT через ipfw + некоторые дополнительные настройки, если не включено. Этот вариант производительный так как NAT происходит в kernel space
    sysctl net.inet.ip.fw.one_pass=1 && echo "net.inet.ip.fw.one_pass=1" >> /etc/sysctl.conf
    echo "firewall_enable=YES" >> /etc/rc.conf
    echo "firewall_nat_enable=YES" >> /etc/rc.conf
    #Прописываем правила ipfw, вместо eth1 указывать имя интерйеса, смотрящего во внутреннюю сеть 192.168.1.0/24
    /sbin/ipfw add nat 1 ip from 10.90.90.0/24 to any via eth1
    /sbin/ipfw add nat 1 ip from any to 192.168.1.1 via eth1
    #если iptables включаем маскарадинг так, вместо eth1 указываем имя интерфейса vpn сервера, который смотрит в локальную сеть
    iptables -t nat -I POSTROUTING -o eth1 -s 10.90.90.0/24 -j MASQUERADE 
  4. Для FreeBSD добавляем в /etc/rc.conf следующие настройки
    echo "gateway_enable=YES" >> /etc/rc.conf
    echo "openvpn_enable=YES" >> /etc/rc.conf
    echo "openvpn_if=tun" >> /etc/rc.conf
    echo "openvpn_configfile=/usr/local/etc/openvpn/server.conf" >> /etc/rc.conf
  5. Настройки фаервола для Freebsd
    ipfw add allow all from any to any via tun0
    ipfw add allow udp from any to me 1194
    ipfw add allow udp from me 1194 to any
  6. Создаем конфиг для клиента Linux,Unix
    client.conf
    # Режим клиента
    client
    # Протокол
    proto udp
    # Порт к которому будет подключаться OpenVPN клиент
    port 1194
    # Тип устройства
    dev tun
    # Адрес OpenVPN сервера
    remote 81.82.83.84
    # сжатие трафика
    comp-lzo
    #отключаем адаптивный режим сжатия трафика
    comp-noadapt
    #применяем push options от сервера
    pull
    # Использовать динамический порт для обратной связи
    nobind
    # Позволять подключение только серверу у которого сертификат X.509 EKU с атрибутом “TLS Web Server Authentication”
    remote-cert-tls server
    # Это я уже описал в серверной части
    persist-key
    persist-tun
    tls-auth        /usr/local/etc/openvpn/certs/ta.key 1
    ca              /usr/local/etc/openvpn/certs/ca.crt
    cert            /usr/local/etc/openvpn/certs/vpn-client.crt
    key             /usr/local/etc/openvpn/certs/vpn-client.key
    user nobody
    group nobody
    verb 5
    daemon
    log-append /var/log/openvpn-client.log


    Конфиг для Windows. Для удобства, можно указать в одном файле все сертификаты и ключи,а потом просто выполнить импорт файла на windows машине

    client.ovpn
    # Режим клиента
    client
    # Протокол
    proto udp
    # Порт к которому будет подключаться OpenVPN клиент
    port 1194
    # Тип устройства
    dev tun
    # Адрес OpenVPN сервера
    remote 81.82.83.84
    # Использовать динамический порт для обратной связи
    nobind
    # сжатие трафика
    comp-lzo
    #отключаем адаптивный режим сжатия трафика
    comp-noadapt
    #применяем push options от сервера
    pull
    # Позволять подключение только серверу у которого сертификат X.509 EKU с атрибутом "TLS Web Server Authentication"
    remote-cert-tls server
    # Это я уже описал в серверной части
    persist-key
    persist-tun
    key-direction 1
    #openvpn поддерживает inline параметры, поэтому можно указывать ключи и сертификаты прямо в конфиге
    <tls-auth>
    -----BEGIN OpenVPN Static key V1-----
    [...]
    -----END OpenVPN Static key V1-----
    </tls-auth>   
    <ca>
    -----BEGIN CERTIFICATE-----
    [...]
    -----END CERTIFICATE-----
    </ca>                
    <cert>
    -----BEGIN CERTIFICATE-----
    [...]
    -----END CERTIFICATE-----
    </cert>              
    <key>
    -----BEGIN PRIVATE KEY-----
    [...]
    -----END PRIVATE KEY-----
    </key>         
    verb 5



Предоставляет возможность устанавливать vpn соединение по общему ключу, расматривается конфигурация для соединения одного клиента.


Требования:
пакет OpenVPN на сервере и клиенте
поддержка драйвера tun\tap устройства клиентом и сервером


Приступаем к настройке

  1. устанавливаем пакет в зависимости от своей OS
    cd /usr/ports/security/openvpn && make && make installclean	#FreeBSD
    apt-get install openvpn						#Ubuntu,Debian
    yum install openvpn						#Centos
  2. создаем общий ключ, этот ключ также нужно будт скопировать на клиент через безопасный каналу
    openvpn --genkey --secret /usr/local/etc/openvpn/secret.key
  3. готовим конфиг сервера
    server.conf
    #режим сетевого интерфейса (tun\tap)
    dev tun	
    #протокол (udp\tcp)
    proto udp			
    #server ip, где слушает openvpn
    local 81.82.83.84			
    #локальный порт сервера, где слушает openvpn
    lport 1500		
    #client ip, доступный в интернет
    remote 71.72.73.74	
    #удаленный порт клиента, на котором будет слушать openvpn клиента
    rport 5000				
    #путь к секретному ключу
    secret /usr/local/etc/openvpn/secret.key 0	
    #настройки сети для защищенного канала, первый ip сервера, второй - клиента
    ifconfig 10.90.90.1 10.90.90.2
    #маршрут к клиентской локальной сети
    route 192.168.3.0 255.255.255.0	
    #пользователь и группа от котого будет запущен openvpn
    user nobody 				
    group nobody 	
    #не пересоздавать tun/tap интерфейс при перезапуске openvpn
    persist-tun
    #не перечитывать ключ при перезапуске openvpn
    persist-key
    # Каждые 10 сек пинговать удаленный хост и если через 60 сек нет ответа – перезапустить связанный туннель.
    keepalive 10 60
    #позволяет перезапускать туннель, только когда указан удаленный адрес
    ping-timer-rem
    # Уровень логирования
    verb 7
    # Режим запуска - демон
    daemon
    #файл логов
    log-append /var/log/openvpn-server.log	
  4. готовим конфиг клиента
    client.conf
    #режим сетевого интерфейса (tun\tap)
    dev tun
    #протокол
    proto udp
    #client ip, смотрящий в мир, на нем будет слушать openvpn
    local 71.72.73.74
    #локальный порт клиента, на нем будет слушать openvpn
    lport 5000	
    #openvpn server ip
    remote 81.82.83.84	
    #openvpn server port
    rport 1500		
    #путь к секретному ключу
    secret /usr/local/etc/openvpn/secret.key 1	
    #настройки сети для защищенного канала, первый ip клиента, второй - сервера
    ifconfig 10.90.90.2 10.90.90.1	
    #маршрут к локальной сети сервера
    route 192.168.100.0 255.255.255.0	
    #пользователь и группа от котого будет запущен openvpn
    user nobody 				
    group nobody 	
    #не пересоздавать tun/tap интерфейс при перезапуске openvpn
    persist-tun
    #не перечитывать ключ при перезапуске openvpn
    persist-key
    # Каждые 10 сек пинговать удаленный хост и если через 60 сек нет ответа – перезапустить связанный туннель.
    keepalive 10 60
    #позволяет перезапускать туннель, только когда указан удаленный адрес
    ping-timer-rem
    #уровень логгирования
    verb 7
    #режим демона
    daemon
    #логи
    log-append /var/log/openvpn-client.log
  5. запускаем openvpn в зависимости от OS
    echo "openvpn_enable=YES" >> /etc/rc.conf && /usr/local/etc/rc.d/openvpn start		#FreeBSD
    /etc/init.d/openvpn start								#Ubuntu,Debian,Centos