Инструменты пользователя

Инструменты сайта


projects:wireguard_manager

WM

wireguard_manager.sh
#!/bin/bash
# ==AUTOEXEC==
# === WireGuard All-in-One Manager ===
# * Менеджер клиентов WireGuard с QR-кодами, безопасным удалением и Unicode-меню
 
# === Конфигурация каталогов ===
WG_INTERFACE="wg0"
WG_BASE="$HOME/wireguard"
CLIENTS_DIR="$WG_BASE/clients"
QR_DIR="$WG_BASE/qrcodes"
CONFIG_DIR="$WG_BASE/config"
 
PRIVATEKEY_FILE="$CONFIG_DIR/privatekey"
PUBLICKEY_FILE="$CONFIG_DIR/publickey"
EXTERNAL_IP_FILE="$CONFIG_DIR/external_ip"
INTERNAL_IP_FILE="$CONFIG_DIR/internal_ip"
 
# === Подготовка окружения ===
init_environment() {
    mkdir -p "$CLIENTS_DIR" "$QR_DIR" "$CONFIG_DIR"
    chmod 700 "$CLIENTS_DIR" "$QR_DIR" "$CONFIG_DIR"
 
    if [[ ! -f "$PRIVATEKEY_FILE" || ! -f "$PUBLICKEY_FILE" ]]; then
        echo "🔐 Серверные ключи отсутствуют. Сгенерировать новые? (yes/no):"
        read -r confirm
        if [[ "$confirm" != "yes" ]]; then
            echo "🚫 Без серверных ключей продолжение невозможно."
            exit 1
        fi
        SERVER_PRIVATE_KEY=$(wg genkey)
        SERVER_PUBLIC_KEY=$(echo "$SERVER_PRIVATE_KEY" | wg pubkey)
        echo "$SERVER_PRIVATE_KEY" > "$PRIVATEKEY_FILE"
        echo "$SERVER_PUBLIC_KEY" > "$PUBLICKEY_FILE"
        chmod 600 "$PRIVATEKEY_FILE" "$PUBLICKEY_FILE"
        echo "✅ Ключи сервера сгенерированы."
    fi
 
    if [[ ! -f "$EXTERNAL_IP_FILE" ]]; then
        echo "🌐 Введите внешний IP-адрес или домен (например, your.domain.com):"
        read -r EXTERNAL_IP
        echo "$EXTERNAL_IP" > "$EXTERNAL_IP_FILE"
    fi
 
    if [[ ! -f "$INTERNAL_IP_FILE" ]]; then
        echo "💡 Введите внутреннюю подсеть (по умолчанию 10.0.0.1/24):"
        read -r INTERNAL_SUBNET
        INTERNAL_SUBNET=${INTERNAL_SUBNET:-10.0.0.1/24}
        echo "$INTERNAL_SUBNET" > "$INTERNAL_IP_FILE"
    fi
}
 
# === Чтение конфигурации сервера ===
read_server_config() {
    SERVER_PRIVATE_KEY=$(<"$PRIVATEKEY_FILE")
    SERVER_PUBLIC_KEY=$(<"$PUBLICKEY_FILE")
    EXTERNAL_IP=$(<"$EXTERNAL_IP_FILE")
    INTERNAL_SUBNET=$(<"$INTERNAL_IP_FILE")
}
 
# === Двойное подтверждение ===
confirm_twice() {
    read -p "❓ Вы уверены? (yes/no): " first
    [[ "$first" != "yes" ]] && echo "🚫 Отменено." && return 1
    read -p "❗ Подтвердите действие (yes/no): " second
    [[ "$second" != "yes" ]] && echo "🚫 Отменено." && return 1
    return 0
}
 
# === Показать меню выбора клиента ===
select_client() {
    local clients=($(ls "$CLIENTS_DIR" 2>/dev/null | sed 's/\.conf$//'))
    if [[ ${#clients[@]} -eq 0 ]]; then echo "⚠️ Нет доступных клиентов."; return 1; fi
    echo -e "\n📋 Доступные клиенты:"
    for i in "${!clients[@]}"; do echo " $((i+1))) ${clients[$i]}"; done
    echo " 0) Отмена"
    read -p "Выберите клиента: " index
    if [[ "$index" == "0" || -z "$index" ]]; then return 1; fi
    CLIENT_NAME="${clients[$((index-1))]}"
    return 0
}
 
# === Добавление клиента ===
add_client() {
    echo "🔧 Добавление нового клиента..."
    read -p "Введите имя клиента: " CLIENT_NAME
    CLIENT_CONF="$CLIENTS_DIR/$CLIENT_NAME.conf"
    CLIENT_QR="$QR_DIR/$CLIENT_NAME.png"
 
    if [[ -f "$CLIENT_CONF" ]]; then
        echo "⚠️ Клиент с таким именем уже существует: $CLIENT_CONF"
        return
    fi
 
    read -p "Введите IP-адрес клиента (оставьте пустым для автогенерации): " CLIENT_IP
    if [[ -z "$CLIENT_IP" ]]; then
        BASE_NET=$(echo "$INTERNAL_SUBNET" | cut -d'.' -f1-3)
        LAST_OCTET=$((100 + RANDOM % 100))
        CLIENT_IP="$BASE_NET.$LAST_OCTET/32"
    fi
 
    echo "📎 IP клиента: $CLIENT_IP"
    confirm_twice || return 1
 
    CLIENT_PRIVATE_KEY=$(wg genkey)
    CLIENT_PUBLIC_KEY=$(echo "$CLIENT_PRIVATE_KEY" | wg pubkey)
 
    sudo wg set "$WG_INTERFACE" peer "$CLIENT_PUBLIC_KEY" allowed-ips "$CLIENT_IP"
 
    cat > "$CLIENT_CONF" <<EOF
[Interface]
ListenPort = 51820
PrivateKey = $CLIENT_PRIVATE_KEY
Address = $CLIENT_IP
DNS = 1.1.1.1
 
[Peer]
PublicKey = $SERVER_PUBLIC_KEY
Endpoint = $EXTERNAL_IP:51820
AllowedIPs = $INTERNAL_SUBNET
PersistentKeepalive = 25
EOF
 
    qrencode -t png -o "$CLIENT_QR" < "$CLIENT_CONF"
    echo "✅ Клиент $CLIENT_NAME добавлен. Конфиг: $CLIENT_CONF"
    echo "📷 QR-код сохранён: $CLIENT_QR"
}
 
list_clients() {
    echo "\n📋 Список клиентов:"
    local files=("$CLIENTS_DIR"/*.conf)
    if [[ ! -e "${files[0]}" ]]; then
        echo "(пусто)"
        return
    fi
    for file in "${files[@]}"; do
        echo "🧾 $(basename "$file" .conf)"
    done
}
 
get_client_config() {
    select_client || return 1
    CLIENT_CONF="$CLIENTS_DIR/$CLIENT_NAME.conf"
    echo "\n📄 Конфигурация клиента $CLIENT_NAME:\n"
    cat "$CLIENT_CONF"
}
 
show_qr_code() {
    select_client || return 1
    CLIENT_CONF="$CLIENTS_DIR/$CLIENT_NAME.conf"
    if [[ ! -f "$CLIENT_CONF" ]]; then echo "❌ Конфигурация не найдена."; return 1; fi
    qrencode -t ANSIUTF8 < "$CLIENT_CONF"
}
 
regen_qr_code() {
    select_client || return 1
    confirm_twice || return 1
    CLIENT_CONF="$CLIENTS_DIR/$CLIENT_NAME.conf"
    CLIENT_QR="$QR_DIR/$CLIENT_NAME.png"
    if [[ ! -f "$CLIENT_CONF" ]]; then echo "❌ Конфигурация не найдена."; return 1; fi
    qrencode -t png -o "$CLIENT_QR" < "$CLIENT_CONF"
    echo "♻️ QR-код для $CLIENT_NAME пересоздан: $CLIENT_QR"
}
 
remove_client() {
    select_client || return 1
    confirm_twice || return 1
    CLIENT_CONF="$CLIENTS_DIR/$CLIENT_NAME.conf"
    CLIENT_QR="$QR_DIR/$CLIENT_NAME.png"
    CLIENT_PUBLIC_KEY=$(grep "^PrivateKey" "$CLIENT_CONF" | awk '{print $3}' | wg pubkey)
    sudo wg set "$WG_INTERFACE" peer "$CLIENT_PUBLIC_KEY" remove
    rm -f "$CLIENT_CONF" "$CLIENT_QR"
    echo "🗑️ Клиент $CLIENT_NAME удалён."
}
 
remove_all_clients() {
    echo "⚠️ Это действие удалит ВСЕХ клиентов."
    confirm_twice || return 1
    for file in "$CLIENTS_DIR"/*.conf; do
        CLIENT_PUBLIC_KEY=$(grep "^PrivateKey" "$file" | awk '{print $3}' | wg pubkey)
        sudo wg set "$WG_INTERFACE" peer "$CLIENT_PUBLIC_KEY" remove
        rm -f "$file"
    done
    rm -f "$QR_DIR"/*.png
    echo "💥 Все клиенты и QR-коды удалены."
}
 
restart_wireguard() {
    sudo systemctl restart "wg-quick@$WG_INTERFACE"
    echo "🔄 WireGuard перезапущен."
}
 
show_client_ips() {
    echo "\n🌐 IP клиентов:"
    sudo wg show "$WG_INTERFACE" allowed-ips
}
 
show_status() {
    echo "\n📊 Статус WireGuard:"
    sudo wg show "$WG_INTERFACE"
}
 
# === Главное меню ===
init_environment
read_server_config
 
while true; do
  echo -e "\n🧠 WireGuard Меню:"
  echo " 1 Добавить клиента"
  echo " 2 Список клиентов"
  echo " 3 Показать конфигурацию клиента"
  echo " 4 Показать QR-код клиента в терминале"
  echo " 5 ♻️ Пересоздать QR-код клиента"
  echo " 6 ❌ Удалить клиента"
  echo " 7 💥 Удалить всех клиентов"
  echo " 8 🔄 Перезапустить WireGuard"
  echo " 9 🌐 Показать IP клиентов"
  echo " 10 📊 Статус WireGuard"
  echo " 0 Выход"
 
  read -p "Выбор >> " option
  case $option in
    1) add_client;;
    2) list_clients;;
    3) get_client_config;;
    4) show_qr_code;;
    5) regen_qr_code;;
    6) remove_client;;
    7) remove_all_clients;;
    8) restart_wireguard;;
    9) show_client_ips;;
    10) show_status;;
    0) echo "👋 Выход."; exit 0;;
    *) echo "❌ Неверный выбор.";;
  esac
done
projects/wireguard_manager.txt · Последнее изменение: 2025/03/25 22:06 —

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki