Отключение и повторное включение клиентов сервера OpenVPN

Отключение и повторное включение клиентов сервера OpenVPN

Я использую OpenVPN 2.3.2 (все еще новичок в этом) на машине Ubuntu 14.04 Server. Я хочу иметь возможность отключать/включать клиентов, которые подключаются к моему серверу OpenVPN.

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

Есть ли простой способ отключить и снова включить клиентов?

Мой файл server.conf:

# OpenVPN server configuration file
dev tun
proto udp
port 1194
server 10.8.0.0 255.255.255.0
ca /usr/share/easy-rsa/keys/ca.crt
cert /usr/share/easy-rsa/keys/vpnserver.crt
key /usr/share/easy-rsa/keys/vpnserver.key
dh /usr/share/easy-rsa/keys/dh2048.pem
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1"
comp-lzo
keepalive 10 60
persist-tun
persist-key
user panos
group panos
log-append /var/log/openvpn.log
verb 3
# crl-verify keys/crl.pem

Последняя строка относится к руководству, указанному выше.

Спасибо.

решение1

Я реализовал решение, похожее на davidgo. К сожалению, я столкнулся с ошибкой openssl, похожей наэтот баг, и мне потребовалось много времени, чтобы найти обходной путь для этой проблемы.

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

revoke.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
fileline="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $fileline | awk -F' ' '{print NF;}')"

if [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    source /usr/share/easy-rsa/vars 
    /usr/share/easy-rsa/revoke-full $1

    {
        sleep 3
        echo kill $1
        sleep 3
        echo exit
    } | telnet localhost 7505

    echo "Client certificate revoked successfully."
    exit 0;

elif [[ $columns_number -eq 6 ]] && [[ $fileline == R* ]]; then

    echo "Client certificate is already revoked."
    exit 0;

else

    echo "Error; key index file may be corrupted."
    exit 1;
fi

unerevoke.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
linenumber="$(grep -n "/CN=$1/" $keys_index_file | cut -f1 -d:)"
fileline="$(grep -n "/CN=$1/" $keys_index_file)"
line="$(grep "/CN=$1/" $keys_index_file)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number



if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file
    cd /usr/share/easy-rsa; source ./vars; openssl ca -gencrl -out "keys/crl.pem" -config "$KEY_CONFIG"

    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

Обратите внимание, что revoke.shскрипт также открываетtelnet-соединениес openVPN и выгоняет клиента для отзыва.

решение2

Ответ Panos был правильным 5 лет назад. Так что он заслуживает одобрения. Однако с тех пор произошло следующее: каталог vars был перемещен/удален, каталог /usr/share/easy-rsa, похоже, больше не присутствует, а $KEY_CONFIG, похоже, либо отсутствует, либо связан с каталогом vars, которого, как я уже сказал, больше нет, по крайней мере в Ubuntu 21.10 (апрель 2022 г.).

Я нашел этот скрипт, размещенный на github, и он показался мне хорошим. Я запустил его, и он заработал. Он восстановил мой отозванный сертификат.

#!/bin/bash
set -e

keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number

if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file

    cd /etc/openvpn/server/easy-rsa
    EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
    rm -f /etc/openvpn/server/crl.pem
    cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    # CRL is read with each client connection, when OpenVPN is dropped to nobody
    chown nobody:nogroup /etc/openvpn/server/crl.pem

    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

Чтобы запустить скрипт, вы предоставляете ему имя сертификата vpn, который вы отозвали. Это будет так, как оно указано в файле index.txt в каталоге /etc/openvpn/server/easy-rsa/pki/ в командной строке. Поэтому скопируйте и вставьте это в файл, скажем unrevoke.sh, а затем запустите:

chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>

Теперь я понимаю аргументы, почему не следует отменять отзыв сертификатов. Но это была чрезвычайная ситуация.

Позвольте мне объяснить обстоятельства:

Я разработчик, работающий в стартапе. Я не сетевой администратор и не системный администратор, поэтому я не тот человек, у которого можно спросить, но больше спросить не у кого, поэтому ответственность легла на меня.

По сути, нам нужно было переместить часть удаленного и неконтролируемого оборудования из одного vpn в другой. Несмотря на все наши испытания на новом vpn, мы (под этим я подразумеваю "я") упустили из виду тот факт, что система по умолчанию попытается отправить все через vpn. Включая потоковую передачу десятков гигабайт данных через соединение 4G.

Естественно, после переключения система полностью перестала отвечать, и мы не смогли войти ни через vpn-соединение (ни через teamviewer). Попытавшись выяснить причину, я пришел к выводу, что это было связано с тем, что она пыталась передавать данные через интернет обратно к себе, и это, вероятно, стоило бы нам тысяч в счетах.

Чтобы смягчить ситуацию, пока я думаю, как решить проблему, я отозвал сертификат VPN, так что, по крайней мере, пропускная способность, которую он пытается использовать, ограничивается только попытками подключения, а не огромными потоками данных.

Команда, которую я использовал для отзыва сертификата VPN, была следующей:

openvpn-install.sh

Он входит в комплект установки OpenVPN и позволяет отозвать указанный сертификат.

Посреди ночи я понял, что есть способ вытолкнуть из конфигурации сервера OpenVPN более конкретную информацию о маршрутизации, чтобы остановить потоковую передачу всего. Так что я это сделал и отменил отзыв отозванного сертификата OpenVPN.

Конечно же, примерно через 20–30 минут удаленное оборудование уловило изменения VPN и начало успокаиваться настолько, что я смог войти в систему и вернуть VPN к старым настройкам, прежде чем мы попытались переключить его и восстановить работу системы.

Я не собираюсь терять из-за этого работу. Но кто-то другой в другой компании может. В любом случае, я просто хотел поделиться с вами своим опытом и пониманием того, почему вам может понадобиться отменить отзыв сертификата vpn.

решение3

Желая найти способ активировать/деактивировать пользователей OpenVPN без необходимости предоставления им другого файла конфигурации *.ovpn, я нашел эту страницу.

Я попробовал ответ Owl, и он подходит для первого раунда отзыва/отмены отзыва. Но если вы хотите отозвать пользователя во второй раз, easy-rsa выдаст ошибку, потому что не сможет найти допустимые файлы *.crt, *.key и *.pem для удаления и перемещения в каталог /etc/openvpn/easy-rsa/pki/revoked.

Итак, решение заключается в том, чтобы добавить 3 строки в ответ Owl, чтобы скопировать файлы обратно в их исходные каталоги. Они следующие:

cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key

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

#!/bin/bash
set -e

keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number

if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file

    cd /etc/openvpn/server/easy-rsa
    EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
    rm -f /etc/openvpn/server/crl.pem
    cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    # CRL is read with each client connection, when OpenVPN is dropped to nobody
    chown nobody:nogroup /etc/openvpn/server/crl.pem
    cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
    mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
    mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

решение4

Игнорируя опцию iptables (которая, по моему мнению, технически лучше), вы можете отозвать и восстановить закрытые ключи, изменив файл отзыва и перезагрузив openvpn. (Если вы используете easyRSA, вы можете отредактировать easyRSA/index.txt. Найдите соответствующую строку и измените флаг «R» на флаг «V», удалите третий столбец.) Затем

  source ./vars
  openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"

Вы можете перезагрузить открывающийся сервер, чтобы новая конфигурация вступила в силу. Это выкинет ВСЕХ клиентов, но они должны автоматически переподключиться и договориться о новом сеансе.

Видетьhttp://sq4ind.eu/openvpn-revoke-unrevoke-certificates/для справочной статьи, на которой основано это решение.

Связанный контент