Генерация сертификата, создание OVPN конфигурации разных протоколов и отправка в RocketChat
This commit is contained in:
219
ovpnCreate.sh
Normal file
219
ovpnCreate.sh
Normal file
@ -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 "<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
|
||||||
Reference in New Issue
Block a user