Я использую 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/для справочной статьи, на которой основано это решение.