Files
openvpn_infrastructure/gen_client.sh

127 lines
5.0 KiB
Bash
Raw Permalink 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
# Пути к файлам и каталогам
CDIR="/root/openvpn-ca"
CONF_DIR="/etc/openvpn/server"
SERVER_CONF="$CONF_DIR/server.conf"
OUTPUT_DIR="/root/vpn-configs"
# Цветовая палитра для вывода в консоль (Светло-голубой цвет)
GREEN='\033[0;32m'
CYAN='\033[1;36m' # <-- Яркий голубой цвет вместо темно-синего
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Проверка наличия аргументов
if [ $# -eq 0 ]; then
echo -e "${RED}Ошибка:${NC} Не указано ни одного имени клиента."
echo -e "Использование: $0 имя_клиента1 [имя_клиента2 имя_клиента3 ...]"
exit 1
fi
# Проверяем, существует ли конфиг сервера для чтения параметров
if [ ! -f "$SERVER_CONF" ]; then
echo -e "${RED}Ошибка:${NC} Файл конфигурации сервера не найден по адресу $SERVER_CONF"
exit 1
fi
# --- Динамический парсинг настроек из server.conf ---
S_PORT=$(grep -E '^port\s' "$SERVER_CONF" | awk '{print $2}')
S_PROTO=$(grep -E '^proto\s' "$SERVER_CONF" | awk '{print $2}')
S_CIPHERS=$(grep -E '^data-ciphers\s' "$SERVER_CONF" | awk '{print $2}')
# Задаем дефолты, если в конфиге сервера этих строк вдруг не оказалось
S_PORT=${S_PORT:-1194}
S_PROTO=${S_PROTO:-udp}
S_CIPHERS=${S_CIPHERS:-AES-128-GCM}
# Автоматически определяем внешний IP-адрес сервера через интерфейс ens3
SERVER_IP=$(ip -4 addr show dev ens3 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n 1)
# Если через интерфейс определить не удалось, берем публичный IP через Web
if [ -z "$SERVER_IP" ]; then
SERVER_IP=$(curl -s ifconfig.me)
fi
mkdir -p "$OUTPUT_DIR"
# Переходим в папку CA
if ! cd "$CDIR" 2>/dev/null; then
echo -e "${RED}Ошибка:${NC} Не удалось перейти в директорию CA: $CDIR"
exit 1
fi
echo -e "${CYAN}=== Запуск генерации конфигураций (Всего: $#) ===${NC}"
echo -e "${YELLOW}Считанные параметры сервера:${NC} IP=$SERVER_IP, Port=$S_PORT, Proto=$S_PROTO, Ciphers=$S_CIPHERS\n"
# Цикл по всем переданным аргументам
for CLIENT_NAME in "$@"; do
echo -e "${CYAN}[$CLIENT_NAME]${NC} Начинаю обработку..."
# Проверка на дубликаты
if [ -f "$OUTPUT_DIR/$CLIENT_NAME.ovpn" ]; then
echo -e " ${YELLOW}⚠ Предупреждение:${NC} Файл $CLIENT_NAME.ovpn уже существует. Пропускаю."
echo -e "--------------------------------------------------"
continue
fi
# 1. Генерация запроса на сертификат (--batch убирает запрос ввода Common Name)
echo -e " -> Создание запроса на сертификат (gen-req)..."
./easyrsa --batch gen-req "$CLIENT_NAME" nopass > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e " ${RED}❌ Ошибка${NC} при создании запроса для $CLIENT_NAME"
echo -e "--------------------------------------------------"
continue
fi
# 2. Подписание сертификата (--batch убирает запрос ввода 'yes')
echo -e " -> Подписание сертификата в CA (sign-req)..."
./easyrsa --batch sign-req client "$CLIENT_NAME" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e " ${RED}❌ Ошибка${NC} при подписании сертификата для $CLIENT_NAME"
echo -e "--------------------------------------------------"
continue
fi
# 3. Сборка финального .ovpn файла
echo -e " -> Сборка .ovpn файла конфигурации..."
BASE_CONFIG="client
dev tun
proto $S_PROTO
remote $SERVER_IP $S_PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
data-ciphers $S_CIPHERS
verb 1"
{
echo "$BASE_CONFIG"
echo "<ca>"
cat "$CONF_DIR/ca.crt"
echo "</ca>"
echo "<cert>"
cat "pki/issued/$CLIENT_NAME.crt"
echo "</cert>"
echo "<key>"
cat "pki/private/$CLIENT_NAME.key"
echo "</key>"
echo "<tls-crypt>"
cat "$CONF_DIR/tls-crypt.key"
echo "</tls-crypt>"
} > "$OUTPUT_DIR/$CLIENT_NAME.ovpn"
if [ $? -eq 0 ]; then
echo -e " ${GREEN}✓ Успешно:${NC} Сгенерирован $OUTPUT_DIR/$CLIENT_NAME.ovpn"
else
echo -e " ${RED}❌ Ошибка${NC} при сборке файла для $CLIENT_NAME"
fi
echo -e "--------------------------------------------------"
done
echo -e "\n${GREEN}=== Генерация завершена. Все файлы сохранены в $OUTPUT_DIR ===${NC}"