Add gen_client.sh
This commit is contained in:
126
gen_client.sh
Normal file
126
gen_client.sh
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
#!/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}"
|
||||||
Reference in New Issue
Block a user