Files
maintenance/ovpnCreate.sh

219 lines
6.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
# Функция вывода помощи
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 "<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>"
echo "<tls-auth>"
cat /etc/openvpn/udp/server/ta.key
echo "</tls-auth>"
} > "$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 "<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."
;;
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 "<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"
python3.9 /root/scripts/rocketchat.py $OVPN_FILE
echo "Файл клиента $(basename $OVPN_FILE) успешно создан и отпавлен в RocketChat."
;;
*)
usage
;;
esac