diff --git a/vpn_user_guest.sh b/vpn_user_guest.sh new file mode 100644 index 0000000..01c1707 --- /dev/null +++ b/vpn_user_guest.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +EASYRSA_DIR="/etc/openvpn/guest/easy-rsa" +CCD_DIR="/etc/openvpn/guest/ccd" +OUTPUT_DIR="/etc/openvpn/guest/client-configs" # куда складывать .ovpn файлы + +# Функция вывода помощи +usage() { + echo "Использовать: $0 username [ip_address]" + echo " username - Common Name для сертификата" + echo " ip_address - (optional) статический IP для клиента в ccd" + exit 1 +} + +# Проверка аргументов +if [[ $# -lt 1 ]]; then + echo Проверка аргумента + usage +fi + +USERNAME=$1 +STATIC_IP=$2 + +# Проверка, существует ли уже пользователь +if [[ -f "$EASYRSA_DIR/pki/issued/${USERNAME}.crt" ]] || [[ -f "$EASYRSA_DIR/pki/private/${USERNAME}.key" ]]; then + echo "Ошибка: пользователь '$USERNAME' уже существует. Удалите его перед повторным созданием." + exit 1 +fi + +# Проверяем каталоги +for dir in "$EASYRSA_DIR" "$CCD_DIR" "$OUTPUT_DIR"; do + if [[ ! -d "$dir" ]]; then + echo "Каталог $dir не найден. Создаю..." + mkdir -p "$dir" + fi +done + +cd "$EASYRSA_DIR" || { echo "Не удалось перейти в каталог $EASYRSA_DIR"; exit 1; } + +#export EASYRSA_BATCH=1 # неинтерактивный режим easy-rsa + +# Генерация сертификата +./easyrsa build-client-full "$USERNAME" nopass +if [[ $? -ne 0 ]]; then + echo "Ошибка подписи сертификата для $USERNAME" + exit 1 +fi + +echo "Сертификат для пользователя '$USERNAME' успешно создан." + +# Создаем файл для ccd если задан IP +if [[ -n "$STATIC_IP" ]]; then + CCD_FILE="$CCD_DIR/$USERNAME" + echo "ifconfig-push $STATIC_IP 255.255.255.0" > "$CCD_FILE" + echo "Файл $CCD_FILE создан с IP-адресом $STATIC_IP" +fi + +# Пути к файлам сертификата и ключа клиента +CLIENT_KEY="$EASYRSA_DIR/pki/private/$USERNAME.key" +CLIENT_CERT="$EASYRSA_DIR/pki/issued/$USERNAME.crt" +CA_CERT="$EASYRSA_DIR/pki/ca.crt" + +# Проверяем, что все нужные файлы есть +for f in "$CLIENT_KEY" "$CLIENT_CERT" "$CA_CERT"; do + if [[ ! -f "$f" ]]; then + echo "Файл $f не найден. Прервать." + exit 1 + fi +done + +# Генерация .ovpn файла +OVPN_FILE="$OUTPUT_DIR/$USERNAME.ovpn" + +{ +cat << EOF +client +dev tun +proto tcp +remote v.maverik.ru 1194 +resolv-retry infinite +remote-cert-tls server +persist-key +persist-tun +#cipher AES-128-CBC +comp-lzo +verb 3 +sndbuf 0 +rcvbuf 0 +#status /var/log/openvpn/openvpn-status.log 1 +#status-version 3 +#log-append /var/log/openvpn/openvpn-client.log +;mute 20 + +EOF +# cat "$BASE_CONFIG" + echo + echo "" + cat "$CA_CERT" + echo "" + echo "" + # В сертификате убирать строки BEGIN/END, иначе дублируем - лучше так: + awk '/-----BEGIN CERTIFICATE-----/{flag=1} flag; /-----END CERTIFICATE-----/{flag=0}' "$CLIENT_CERT" + echo "" + echo "" + cat "$CLIENT_KEY" + echo "" +} > "$OVPN_FILE" + +python3.9 /root/scripts/rocketchat.py $OVPN_FILE +echo "Файл клиента $(basename $OVPN_FILE) успешно создан и отпавлен в RocketChat." \ No newline at end of file