OpenVPN — это полнофункциональное открытое средство VPN SSL, которое поддерживает широкий диапазон конфигураций. В этом мануале вы научитесь настраивать сервер OpenVPN на вашем выделенном сервере Debian 10. 

Для начала нам необходимо установить сам OpenVPN сервер. Выполняем следующую команду и вводим пароль суперпользователя:

su -

Устанавливаем пакеты openvpn и easy-rsa. Выполняем следующую команду:

apt install openvpn easy-rsa

Для упрощения процедуры создания необходимых ключей и сертификатов традиционно используется утилита Easy-RSA, которая позволяет легко управлять локальным центром сертификации (CA) инфраструктуры открытых ключей (PKI).

Пакет успешно установлен.

Выходим из суперпользователя. Выполняем следующую команду:

exit

Копируем файлы easy-rsa в домашний каталог. Выполняем следующую команду:

cp -r /usr/share/easy-rsa

Переходим в каталог easy-rsa. Выполняем следующую команду:

cd easy-rsa

Выполняем инициализацию PKI. В каталоге EasyRSA есть скрипт easyrsa, который вызывается для выполнения задач, связанных с созданием и управлением CA. Запустите этот скрипт с параметром init-pki, чтобы инициировать инфраструктуру открытого ключа на сервере CA. Выполняем следующую команду:

./easyrsa init-pki

Генерируем сертификат корневого центра сертификации (CA). Выполняем следующую команду:

./easyrsa build-ca nopass

Вводим имя корневого центра сертификации, нажимаем enter чтобы продолжить.

Создаем сертификат для сервера OpenVPN. Выполняем следующую команду, где вместо <hostname> указываем доменное имя или IP-адрес вашего OpenVPN сервера, у меня 172.16.16.1:

./easyrsa build-server-full <hostname> nopass

Создаем сертификат для клиента OpenVPN. Выполняем следующую команду, где вместо <username> указываем произвольное имя для вашего клиента, у меня john:

./easyrsa build-client-full <username> nopass

Так же генерируем список отозванных сертификатов. Выполняем следующую команду:

./easyrsa gen-crl

Генерируем ключ DH.

Протокол Ди́ффи — Хе́ллмана (англ. Diffie–Hellman, DH) — криптографический протокол, позволяющий двум и более сторонам получить общий секретный ключ, используя незащищенный от прослушивания канал связи. Полученный ключ используется для шифрования дальнейшего обмена с помощью алгоритмов симметричного шифрования.

Выполняем следующую команду:

./easyrsa gen-dh
(Это замёт некоторое время, ждите окончания генерации)

После генерируем OpenVPN ta.key - подпись HMAC, чтобы усилить функции проверки целостности TLS.

Выполняем следующую команду:

/usr/sbin/openvpn --genkey --secret ta.key

Переходим в суперпользователя. Выполняем следующую команду и вводим пар:

su -

Создаем каталог для хранения ключевой информации OpenVPN сервера. Выполняем следующую команду:

mkdir /etc/openvpn/certs

Копируем сертификат корневого центра сертификации. Выполняем следующую команду:

cp /home/user/easy-rsa/pki/ca.crt /etc/openvpn/certs

Копируем сертификат OpenVPN сервера. Выполняем следующую команду:

cp /home/user/easy-rsa/pki/issued/172.16.16.1.crt /etc/openvpn/certs

Копируем закрытый ключ сертификата OpenVPN сервера. Выполняем следующую команду:

cp /home/user/easy-rsa/pki/private/172.16.16.1.key /etc/openvpn/certs

Копируем ключ DH. Выполняем следующую команду:

cp /home/user/easy-rsa/pki/dh.pem /etc/openvpn/certs

Копируем ключ ta. Выполняем следующую команду:

cp /home/user/easy-rsa/ta.key /etc/openvpn/certs

Копируем список отозванных сертификатов. Выполняем следующую команду:

cp /home/user/easy-rsa/pki/crl.pem /etc/openvpn/certs

Создаем файл конфигурации OpenVPN сервера. Выполняем следующую команду:

touch /etc/openvpn/server/server.conf

Открываем конфигурационный файл OpenVPN сервера любым редактором, например nano. Выполняем следующую команду:

nano -w /etc/openvpn/server/server.conf

Приводим конфигурационный файл к следующему виду. Вместо 172.16.16.1 необходимо вписать свое доменное имя или IP адрес если вы указывали иное при генерации сертификата. Так же можете поменять порт или пул выдаваемых адресов, если хотите.

Запускаем OpenVPN сервер. Выполняем следующую команду:

systemctl start openvpn-server@server

Проверяем работоспособность. Выполняем следующую команду:

systemctl status openvpn-server@server

Можно добавить в автозагрузку. Выполняем следующую команду:

systemctl enable openvpn-server@server

Переходим к настройке клиентской части, на другой машине. Выполняем команду:

su -

Устанавливаем OpenVPN. Выполняем следующую команду:

apt install openvpn

Создаем каталог для хранения ключевой информации OpenVPN клиента. Выполняем следующую команду:

mkdir /etc/openvpn/certs

Далее нам необходимо перенести ключевую информацию, я использую scp (у меня сконфигурирован ssh). А именно файлы: ta.key, john.key, john.crt, ca.crt

Вместо сертификатов на клиента c CN john и его закрытого ключа может быть любой ваш, который вы генерировали (но не сертификат сервера)

Далее переношу ключевую информацию в каталог /etc/openvpn/certs, используя команду mv.

Создаем конфигурационный файл OpenVPN клиента. Выполняя следующую команду:

touch /etc/openvpn/client/client.conf

Открываем конфигурационный фал OpenVPN клиента любым редактором, например nano. Выполняя следующую команду:

nano -w /etc/openvpn/client/client.conf

Приводим конфигурационный файл OpenVPN клиента к следующему виду. Если вы изменяли какие-либо параметры их надо изменить и на клиенте

Вместо 172.16.16.1 ваш IP адрес или доменное имя которые вы указывали и порт вместо 1194 если указывали, так же путь к клиентскому сертификату если файл называется по другому

Запускаем OpenVPN клиент. Используем следующую команду:

systemctl start openvpn-client@client

Проверим состояние OpenVPN клиента. Используем следующую команду:

systemctl status openvpn-client@client

Как видим подключение прошло успешно

Проверим связность внутри туннеля выполнив пинг

Так же клиент можно добавить в автозагрузку. Выполнив команду

systemctl enable openvpn-client@client

Настройка доступа к интернету через OpenVPN туннель

Открываем файл /etc/sysctl.conf любым редактором и документируем строчку содержащую:

net.ipv4.ip_forward=1

Выходим из редактора и применяем параметры используя команду:

sysctl -p

Настраиваем NAT

Выполняем следующую команду, где enp2s0 это имя вашего интерфейса смотрящего в сеть:

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

Сохраняем правила фаервола. Выполняем команду:

iptables-save > ~/ipt.save

Открываем файл /etc/network/interfaces любым редактором например nano, и добавляете:

pre-up iptables-restore < /root/ipt.save

Что означает автоматическое восстановление правил фаервола. Либо можно сделать через системд сервис который будет запускать скрипт до старта таргета сети

Редактируем конфиг OpenVPN сервера любым редактором, добавляя туда параметры:

push “redirect-gateway def1 bypass-dhcp”

push “dhcp-option DNS 1.1.1.1”

Первый параметр означает то что при старте OpenVPN клиента будет создаваться дефолтный маршрут через туннель. Второй опцией мы можем назначить DNS сервер.

Так же мы можем использовать опцию push для анонсирования маршрутов:

push “route 192.168.88.0 255.255.255.0”

Анонсирует маршрут 192.168.88.0 через туннель.

Отзыв сертификатов

Необходимая вещь для того чтобы отобрать у клиента вашего впн сервера доступ к нем. Выполняем команду:

./easyrsa revoke john

где john это CN сертификата, т. е. имя клиента которые вы указали

Сертификат отозвался.

Генерируем список отозванных сертификатов. Выполняя команду:

./easyrsa gen-crl

Переходим в суперпользователя

Копируем список отозванных сертификатов в каталог с ключевой информацией OpenVPN сервера и перезагружаем его.

Видим что клиент не подключается, т.к его сертификат отозван

Связности тоже нет

Спасибо за прочтение данной статьи. Подписывайтесь на YouTube канал, здесь мы на стримах настраиваем Linux, Windows, Cisco. Отдельное Спасибо Роману Заиике за помощь .

Комментарии (11)


  1. sirmax123
    28.05.2023 14:18
    +12

    Картинками? Это серьезно?


    1. 0mogol0
      28.05.2023 14:18
      +1

      я бы даже сказал скриншотами... Когда две строчки текста (комманда и вывод) и три четверти пустого экрана


    1. First_samurai Автор
      28.05.2023 14:18
      -1

      Здравствуйте. Статья писалась для студентов. Им нужно расписать очень подробно и текст там есть


      1. AntoineLarine
        28.05.2023 14:18

        Что за студенты пошли, которые OpenVPN не могут освоить без 100500 скриншотов?


  1. maledog
    28.05.2023 14:18
    +7

    Статья номер 100500 как установить openvpn, и ничего про то как его в дальнейшем эксплуатировать. Вы хоть в курсе, что список отозванных сертификатов имеет срок годности и может "протухнуть"? По-умолчанию через год; и вы столкнетесь с тем что клиенты по этой причине не коннектятся, а дальше отправитесь на stackoverflow. Т. е. список нужно генерировать не только при отзыве, но и просто периодически, чтобы сервер не решил, что вы "забили".


    1. AntoineLarine
      28.05.2023 14:18

      "о сколько нам открытий чудных готовит просвещенья дух"


  1. druidus
    28.05.2023 14:18
    +4

    Пока вы писали эту статью вышел релиз Debian 12 :)


    1. t3n3t
      28.05.2023 14:18

      Ну, технически, еще не вышел. Дата релиза - 10 июня.

      Впрочем, 11 точно вышел )



  1. n_bogdanov
    28.05.2023 14:18

    Стоит использовать пакет iptables-persistent или переходить на nftables, а не /etc/network/interfaces. Да и с interfaces пора уходить на systemd.


  1. Lazhu
    28.05.2023 14:18

    Hidden text
    #!/bin/sh
    PREFIX="/usr/local"
    USERADD="pw useradd"
    NETNAME="whatever"
    HOSTNAME=`hostname`
    WORKDIR="${PREFIX}/etc/openvpn/${NETNAME}"
    DIRS="ccd certs crl keys private req ready"
    SED=`which sed`
    SSL=`which openssl`
    VPN=`which openvpn`
    ${USERADD} openvpn
    for dir in ${DIRS}; do
        mkdir -p ${WORKDIR}/${dir}
    done
    cp openssl.cnf openvpn.conf ${WORKDIR}
    touch ${WORKDIR}/index.txt ${WORKDIR}/serial
    cp openvpn.ovpn ${WORKDIR}/ready
    chown -R root:openvpn ${WORKDIR}
    chmod -R g+w ${WORKDIR}
    cp keygen.sh ${PREFIX}/bin/keygen_${NETNAME}.sh
    cp revoke.sh ${PREFIX}/bin/revoke_${NETNAME}.sh
    rehash
    cd ${WORKDIR}
    chmod 700 keys private
    echo "01" > serial
    export KEY_NAME=${HOSTNAME}
    ${SSL} req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650
    ${SSL} req -new -nodes -keyout keys/server.pem -out req/server.pem
    ${SSL} ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem
    ${SSL} dhparam -out dh2048.pem 2048
    ${SSL} ca -config openssl.cnf -gencrl -out crl/crl.pem
    ${VPN} --genkey --secret ta.key

    и никаких костылей в виде easy-rsa