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