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



Автор:

Статья опубликована: 2018-02-22 17:36:07
Последние правки: 2019-05-30 12:59:35

Настраиваем собственный VPN для выхода через него в интернет.

  • Исходные данные
    ~# cat /etc/os-release
    ...
    Ubuntu 16.04.3 LTS
    ...
    

  • Установка.
    # apt-get install easy-rsa
    # apt-get install openvpn
    

  • Создание центра сертификации.
    Создаем шаблонную директорию easy-rsa в директории /etc/openvpn с помощью команды make-cadir:
    # make-cadir /etc/openvpn/easy-rsa
    
    Необходимо зайти в эту директорию:
    # cd /etc/openvpn/easy-rsa
    
    Все дальнейшие команды запускаем в этой директории.
    Редактируем файл /etc/openvpn/easy-rsa/vars. Ищем поля, на основании которых генерируются клиентские сертификаты и меняем значения на свои:
    export KEY_COUNTRY="US"
    export KEY_PROVINCE="CA"
    export KEY_CITY="SanFrancisco"
    export KEY_ORG="Fort-Funston"
    export KEY_EMAIL="me@myhost.mydomain"
    export KEY_OU="MyOrganizationalUnit"
    
    Затем, задаем KEY-NAME:
    export KEY_NAME="server"
    
    Далее, создаем центр сертификации:
    # source vars 
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
    # ./clean-all
    # ./build-ca
    

  • Создание сертификата, ключа и файлов шифрования для сервера.
    # ./build-key-server server
    
    Внимание! Во время создания ключей, не задавайте challenge password!
    Генерируем сильные ключи протокола Диффи-Хеллмана, используемые при обмене ключами:
    # ./build-dh
    
    Генерируем подпись HMAC для дополнительной проверки сервером целостности TSL:
    # openvpn --genkey --secret keys/ta.key
    

  • Настройка openvpn сервера.
    Копируем файлы ca.crt ca.key server.crt server.key ta.key dh2048.pem из /etc/openvpn/easy-rsa в /etc/openvpn
    Распаковываем файл конфигурации из директории с примерами:
    # cd /etc/openvpn
    # cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz ./
    # gunzip server.conf.gz
    
    В итоге получаем файл /etc/openvpn/server.conf
    Редактируем этот файл.
    Ищем в файле строчку с tls-auth. Раскомментируем её (убрать ; в начале строки). Ниже добавляем строчку key-direction 0:
    tls-auth ta.key 0 # This file is secret
    key-direction 0
    
    Далее, ищем строки с cipher. Раскомментируем cipher AES-128-CBC, остальные должны остаться закомментрованными. Ниже добавляем строку auth SHA512.
    cipher AES-128-CBC
    auth SHA512
    
    Ищем user и group и раскомментируем:
    user nobody
    group nogroup
    
    Задаем директорию для клиентских файлов:
    client-config-dir /etc/openvpn/ccd
    
    Опционально, можно поменять порт и протокол:
    port 1194
    proto TCP
    

  • Настройка сервера для перенаправления трафика.
    Редактируем /etc/sysctl.conf
    net.ipv4.ip_forward=1
    
    Применяем настройки:
    # sysctl -p
    
    Если нужен выход в интернет для клиентов, то необходимо настроить NAT.
    iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
    
    Правила для iptables:
    -A INPUT -i tun0 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
    
    -A FORWARD -i tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A FORWARD -i tun0 -o eth0 -j ACCEPT
    
    # disable from external to vpn clients
    #-A FORWARD -i eth0 -o tun0 -j REJECT --reject-with icmp-host-prohibited
    
    Здесь приведена не полная настройка iptables, а лишь необходимые для работы openvpn правила.


  • Запуск сервера
    # systemctl start openvpn@server
    
    Проверяем:
    # systemctl status openvpn@server
    # netstat -tuwpan
    

  • Создание клиентского сертификата и пары ключей.
    Данная операция производится каждый раз, когда необходимо завести клиента.
    В данном примере в качестве имени клиента используем client1.
    # cd /etc/openvpn/easy-rsa
    # source vars
    # ./build-key client1
    
    Не забывайте, что challenge password задавать НЕ НУЖНО!


  • Отзыв клиентского сертификата.
    Для прекращения доступа клиента к openvpn серверу, необходимо отозвать его сертификат.
    # cd /etc/openvpn/easy-rsa
    # source vars
    # ./revoke-full client1
    
    Выполнение этой команды будет заканчиваться ошибкой 23 и созданием файла /etc/openvpn/easy-rsa/keys/crl.pem. Копируем этот файл в директорию сервера:
    # cp /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn/crl.pem
    
    После этого в конец /etc/openvpn/server.conf добавляем строку, чтобы сервер проверял отозванные сертификаты:
    crl-verify crl.pem
    
    И перезапускам openvpn сервер:
    # systemctl restart openvpn@server
    
    Для отзыва сертификатов других клиентов (например, client2), необходимо повторить все операции, за исключением добавления строки в server.conf:
    # cd /etc/openvpn/easy-rsa
    # source vars
    # ./revoke-full client2
    # cp /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn/crl.pem
    # systemctl restart openvpn@server
    
    Список всех выпущенных клиентских сертификатов, в том числе отозванных, можно посмотреть в файле /etc/openvpn/easy-rsa/keys/index.txt. Для отозванных сертификатов в начале строки стоит буква R.


  • Создаем скрипты для создания клиентского файла с настройками
    Для облегчения жизни системного администратора, напишем скрипт, который будет создавать файл с настройками для клиентов.
    # mkdir -p /etc/openvpn/client-configs/files
    # chmod 700 /etc/openvpn/client-configs/files
    # cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/base.conf
    
    Редактируем файл /etc/openvpn/client-configs/base.conf
    # задаем ip и порт как у сервера
    remote IP 1194
    # протокол как у сервера (/etc/openvpn/server.conf)
    proto TCP
    # директивы ниже должны быть закомментированы или удалены
    ;ca ca.crt
    ;cert client.crt
    ;key client.key
    # настройки cipher и auth как в /etc/openvpn/server.conf
    cipher AES-128-CBC
    auth SHA512
    # у сервера этот параметр = 0, у клиента = 1 !
    key-direction 1
    
    В итоге должно получиться следующее:
    client
    dev tun
    proto tcp
    remote XXX.XXX.XXX.XXX 1194
    nobind
    user nobody
    group nogroup
    persist-key
    persist-tun
    key-direction 1
    cipher AES-128-CBC
    auth SHA512
    comp-lzo
    verb 1
    
    Далее, создаем файл /etc/openvpn/client-configs/make_config.sh и пишем туда следующее:
    #!/bin/bash
    # First argument: Client identifier
    
    KEY_DIR=/etc/openvpn/easy-rsa/keys
    OUTPUT_DIR=/etc/openvpn/client-config/files
    BASE_CONFIG=/etc/openvpn/client-config/base.conf
    
    cat ${BASE_CONFIG} \
        <(echo -e '<ca>') \
        ${KEY_DIR}/ca.crt \
        <(echo -e '</ca>\n<cert>') \
        ${KEY_DIR}/${1}.crt \
        <(echo -e '</cert>\n<key>') \
        ${KEY_DIR}/${1}.key \
        <(echo -e '</key>\n<tls-auth>') \
        ${KEY_DIR}/ta.key \
        <(echo -e '</tls-auth>') \
        > ${OUTPUT_DIR}/${1}.ovpn
    
    Файл запускать только после создания ключей клиента, в качестве параметра передается имя клиента:
    /etc/openvpn/client-config/make_config.sh client1
    
    На выходе получится файл /etc/openvpn/client-config/files/client1.ovpn внутри которого будут настройки, а также клиентский сертификат и все необходимые ключи. Этот файл нужно отдать клиенту.


  • Постоянные ip для клиентов.
    Бывает необходимость в выдаче одних и тех же ip одним и тем же клиентам. Это делается очень просто: в файл клиента (например, /etc/openvpn/ccd/client1) записывается директива:
    ifconfig-push 10.0.11.253 10.0.11.254
    
    Первый ip (10.0.11.253) - это адрес клиента, второй ip (10.0.11.254) адрес шлюза для клиента.
    После добавления адресов необходимо перезагрузить openvpn server:
    # systemctl restart openvpn@server
    
    В openvpn адреса разбиты на подсети из 4-х адресов (network, IP, gateway, broadcast) и поэтому выделяются не абы как. Вот таблица для удобства. В каждом блоке по два ip, первый - сам адрес, второй - адрес шлюза.
    [  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
    [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
    [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
    [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
    [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
    [101,102] [105,106] [109,110] [113,114] [117,118]
    [121,122] [125,126] [129,130] [133,134] [137,138]
    [141,142] [145,146] [149,150] [153,154] [157,158]
    [161,162] [165,166] [169,170] [173,174] [177,178]
    [181,182] [185,186] [189,190] [193,194] [197,198]
    [201,202] [205,206] [209,210] [213,214] [217,218]
    [221,222] [225,226] [229,230] [233,234] [237,238]
    [241,242] [245,246] [249,250] [253,254]
    

  • Клиенты openvpn для network manager в Ubuntu
    KDE
    # apt-get install network-manager-openvpn-kde
    
    Gnome
    # apt-get install network-manager-openvpn-gnome