Files
maintenance/vpn_user_tcp.sh

108 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/tcp/easy-rsa"
CCD_DIR="/etc/openvpn/tcp/ccd"
OUTPUT_DIR="/etc/openvpn/tcp/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 1114
resolv-retry infinite
nobind
persist-key
persist-tun
#tls-client
data-ciphers-fallback AES-256-CBC
auth SHA1
#tun-mtu 1500
# mssfix 1620
#key-direction 1
EOF
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>"
} > "$OVPN_FILE"
zip -j $OUTPUT_DIR/$USERNAME.zip \
$CA_CERT $CLIENT_CERT $CLIENT_KEY $OVPN_FILE
python3.9 /root/scripts/rocketchat.py $OUTPUT_DIR/$USERNAME.zip
echo "Архив для клиента $USERNAME.zip успешно создан и отпавлен в RocketChat."