From 7bbbf4a3410e597299577de76f481b36689a833c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D0=BB=D0=B8=D0=B3=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= Date: Wed, 6 Aug 2025 17:31:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20OVPN=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=82=D0=B0=20=D0=B8=20=D0=BE=D1=82=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=20=D0=B2=20RocketChat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vpn_user_tcp.sh | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 vpn_user_tcp.sh diff --git a/vpn_user_tcp.sh b/vpn_user_tcp.sh new file mode 100644 index 0000000..7cee47e --- /dev/null +++ b/vpn_user_tcp.sh @@ -0,0 +1,108 @@ +#!/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 "" + 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" + +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." \ No newline at end of file