#!/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