diff --git a/ovpnCreate.sh b/ovpnCreate.sh new file mode 100644 index 0000000..fb201a5 --- /dev/null +++ b/ovpnCreate.sh @@ -0,0 +1,219 @@ +#!/bin/bash + +# Функция вывода помощи +usage() { + echo "Использовать: $0 protocol username [ip_address]" + echo " protocol - udp, tcp и guest(для стронних пользователей TCP)" + echo " username - Имя для сертификата" + echo " ip_address - Статический IP для клиента в ccd" + echo " udp - 10.15.0.0/24" + echo " tcp - 100.100.100.0/24" + echo " guest - 200.200.200.0/24" + exit 1 +} + +# Проверка аргументов +if [[ $# -lt 3 ]]; then + usage +fi + +PROTOCOL=$1 +USERNAME=$2 +STATIC_IP=$3 + +EASYRSA_DIR="/etc/openvpn/$PROTOCOL/easy-rsa" +CCD_DIR="/etc/openvpn/$PROTOCOL/ccd" +OUTPUT_DIR="/etc/openvpn/$PROTOCOL/client-configs" # куда складывать .ovpn файлы + +# Пути к файлам сертификата и ключа клиента +CLIENT_KEY="$EASYRSA_DIR/pki/private/$USERNAME.key" +CLIENT_CERT="$EASYRSA_DIR/pki/issued/$USERNAME.crt" +CA_CERT="$EASYRSA_DIR/pki/ca.crt" + +# Функция проверки, существует ли уже пользователь +check_user_exists() { + local EASYRSA_DIR="$1" + local USERNAME="$2" + + if [[ -f "$EASYRSA_DIR/pki/issued/${USERNAME}.crt" ]] || [[ -f "$EASYRSA_DIR/pki/private/${USERNAME}.key" ]]; then + echo "Ошибка: пользователь '$USERNAME' уже существует. Удалите его перед повторным созданием." + exit 1 + fi +} + +# Генерация сертификата +build_client_cert() { + local USERNAME="$1" + + ./easyrsa build-client-full "$USERNAME" nopass + if [[ $? -ne 0 ]]; then + echo "Ошибка подписи сертификата для $USERNAME" + exit 1 + fi +} + +# Создаем файл для ccd если задан IP +create_ccd_file() { + local CCD_DIR="$1" + local USERNAME="$2" + local STATIC_IP="$3" + + if [[ -n "$STATIC_IP" ]]; then + local CCD_FILE="$CCD_DIR/$USERNAME" + echo "ifconfig-push $STATIC_IP 255.255.255.0" > "$CCD_FILE" + echo "Файл $CCD_FILE создан с IP-адресом $STATIC_IP" + fi +} + +# Проверяем, что все нужные файлы есть +check_files_exist() { + for f in "$@"; do + if [[ ! -f "$f" ]]; then + echo "Файл $f не найден. Прервать." + exit 1 + fi + done +} + +# Основной код программы +case "$PROTOCOL" in + udp) + check_user_exists "$EASYRSA_DIR" "$USERNAME" + cd "$EASYRSA_DIR" || { echo "Не удалось перейти в каталог $EASYRSA_DIR"; exit 1; } + build_client_cert "$USERNAME" + echo "Сертификат для пользователя '$USERNAME' успешно создан." + create_ccd_file "$CCD_DIR" "$USERNAME" "$STATIC_IP" + check_files_exist "$CLIENT_KEY" "$CLIENT_CERT" "$CA_CERT" + 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." + ;; + tcp) + check_user_exists "$EASYRSA_DIR" "$USERNAME" + cd "$EASYRSA_DIR" || { echo "Не удалось перейти в каталог $EASYRSA_DIR"; exit 1; } + build_client_cert "$USERNAME" + echo "Сертификат для пользователя '$USERNAME' успешно создан." + create_ccd_file "$CCD_DIR" "$USERNAME" "$STATIC_IP" + check_files_exist "$CLIENT_KEY" "$CLIENT_CERT" "$CA_CERT" + 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." + ;; + guest) + check_user_exists "$EASYRSA_DIR" "$USERNAME" + cd "$EASYRSA_DIR" || { echo "Не удалось перейти в каталог $EASYRSA_DIR"; exit 1; } + build_client_cert "$USERNAME" + echo "Сертификат для пользователя '$USERNAME' успешно создан." + create_ccd_file "$CCD_DIR" "$USERNAME" "$STATIC_IP" + check_files_exist "$CLIENT_KEY" "$CLIENT_CERT" "$CA_CERT" + 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." + ;; + *) + usage + ;; +esac \ No newline at end of file