#!/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 ""
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 ""
echo ""
cat /etc/openvpn/udp/server/ta.key
echo ""
} > "$OVPN_FILE"
python3.9 /root/scripts/rocketchat.py $OVPN_FILE
echo "Файл клиента $(basename $OVPN_FILE) успешно создан и отпавлен в RocketChat."