Files
maintenance/vpn_user_udp.sh

110 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
EASYRSA_DIR="/etc/openvpn/udp/easy-rsa"
CCD_DIR="/etc/openvpn/udp/ccd"
OUTPUT_DIR="/etc/openvpn/udp/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 udp
remote v.maverik.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
# tls-client
data-ciphers-fallback AES-256-CBC
auth SHA512
# tun-mtu 1500
# mssfix
key-direction 1
EOF
# cat "$BASE_CONFIG"
# echo
echo "<ca>"
cat "$CA_CERT"
echo "</ca>"
echo "<cert>"
# В сертификате убирать строки BEGIN/END, иначе дублируем - лучше так:
awk '/-----BEGIN CERTIFICATE-----/{flag=1} flag; /-----END CERTIFICATE-----/{flag=0}' "$CLIENT_CERT"
echo "</cert>"
echo "<key>"
cat "$CLIENT_KEY"
echo "</key>"
echo "<tls-auth>"
cat /etc/openvpn/udp/server/ta.key
echo "</tls-auth>"
} > "$OVPN_FILE"
python3.9 /root/scripts/rocketchat.py $OVPN_FILE
echo "Файл клиента $(basename $OVPN_FILE) успешно создан и отпавлен в RocketChat."