urocibg gist felülvizsgálása . Revízióhoz ugrás
1 file changed, 1 insertion
wireguard_setup.sh
| @@ -2,6 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | 3 | # WireGuard автоматична инсталация и настройка за Proxmox Ubuntu контейнер | |
| 4 | 4 | # Скрипт за инсталиране на WireGuard, генериране на ключове и настройка на клиенти | |
| 5 | + | # Автор: Федя Серафиев | |
| 5 | 6 | ||
| 6 | 7 | set -e | |
| 7 | 8 | ||
urocibg gist felülvizsgálása . Revízióhoz ugrás
1 file changed, 382 insertions
wireguard_setup.sh(fájl létrehozva)
| @@ -0,0 +1,382 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | # WireGuard автоматична инсталация и настройка за Proxmox Ubuntu контейнер | |
| 4 | + | # Скрипт за инсталиране на WireGuard, генериране на ключове и настройка на клиенти | |
| 5 | + | ||
| 6 | + | set -e | |
| 7 | + | ||
| 8 | + | # Цветове за по-добро визуализиране | |
| 9 | + | RED='\033[0;31m' | |
| 10 | + | GREEN='\033[0;32m' | |
| 11 | + | YELLOW='\033[1;33m' | |
| 12 | + | BLUE='\033[0;34m' | |
| 13 | + | NC='\033[0m' # No Color | |
| 14 | + | ||
| 15 | + | # Функция за печатане на цветни съобщения | |
| 16 | + | print_status() { | |
| 17 | + | echo -e "${GREEN}[INFO]${NC} $1" | |
| 18 | + | } | |
| 19 | + | ||
| 20 | + | print_warning() { | |
| 21 | + | echo -e "${YELLOW}[WARNING]${NC} $1" | |
| 22 | + | } | |
| 23 | + | ||
| 24 | + | print_error() { | |
| 25 | + | echo -e "${RED}[ERROR]${NC} $1" | |
| 26 | + | } | |
| 27 | + | ||
| 28 | + | print_header() { | |
| 29 | + | echo -e "${BLUE}================================${NC}" | |
| 30 | + | echo -e "${BLUE}$1${NC}" | |
| 31 | + | echo -e "${BLUE}================================${NC}" | |
| 32 | + | } | |
| 33 | + | ||
| 34 | + | # Проверка дали скриптът се изпълнява като root | |
| 35 | + | check_root() { | |
| 36 | + | if [[ $EUID -ne 0 ]]; then | |
| 37 | + | print_error "Този скрипт трябва да се изпълнява като root!" | |
| 38 | + | exit 1 | |
| 39 | + | fi | |
| 40 | + | } | |
| 41 | + | ||
| 42 | + | # Инсталиране на WireGuard и необходими пакети | |
| 43 | + | install_wireguard() { | |
| 44 | + | print_header "ИНСТАЛИРАНЕ НА WIREGUARD" | |
| 45 | + | ||
| 46 | + | # Обновяване на пакетите | |
| 47 | + | print_status "Обновяване на системата..." | |
| 48 | + | apt update && apt upgrade -y | |
| 49 | + | ||
| 50 | + | # Инсталиране на WireGuard и помощни инструменти | |
| 51 | + | print_status "Инсталиране на WireGuard и помощни инструменти..." | |
| 52 | + | apt install -y wireguard wireguard-tools qrencode iptables-persistent curl net-tools | |
| 53 | + | ||
| 54 | + | # Създаване на директории | |
| 55 | + | mkdir -p /etc/wireguard/clients | |
| 56 | + | chmod 700 /etc/wireguard | |
| 57 | + | ||
| 58 | + | print_status "WireGuard е инсталиран успешно!" | |
| 59 | + | } | |
| 60 | + | ||
| 61 | + | # Функция за получаване на външно IP | |
| 62 | + | get_external_ip() { | |
| 63 | + | local external_ip="" | |
| 64 | + | local default_ip="95.42.103.123" | |
| 65 | + | ||
| 66 | + | print_status "Опит за автоматично определяне на външното IP..." | |
| 67 | + | ||
| 68 | + | # Опити за получаване на външното IP | |
| 69 | + | external_ip=$(curl -s -4 ifconfig.me 2>/dev/null || curl -s -4 icanhazip.com 2>/dev/null || curl -s -4 ipecho.net/plain 2>/dev/null || echo "") | |
| 70 | + | ||
| 71 | + | if [[ -n "$external_ip" ]]; then | |
| 72 | + | print_status "Автоматично определено външно IP: $external_ip" | |
| 73 | + | echo -e "Желаете ли да използвате това IP? ${GREEN}$external_ip${NC} (y/n) или въведете различно IP:" | |
| 74 | + | read -r user_choice | |
| 75 | + | ||
| 76 | + | if [[ "$user_choice" =~ ^[Yy]$ ]] || [[ -z "$user_choice" ]]; then | |
| 77 | + | SERVER_IP="$external_ip" | |
| 78 | + | else | |
| 79 | + | echo "Въведете външното IP адрес на сървъра:" | |
| 80 | + | read -r SERVER_IP | |
| 81 | + | if [[ -z "$SERVER_IP" ]]; then | |
| 82 | + | print_warning "Не е въведено IP. Използва се: $default_ip" | |
| 83 | + | SERVER_IP="$default_ip" | |
| 84 | + | fi | |
| 85 | + | fi | |
| 86 | + | else | |
| 87 | + | print_warning "Не може да се определи автоматично външното IP" | |
| 88 | + | echo "Въведете външното IP адрес на сървъра (или натиснете Enter за $default_ip):" | |
| 89 | + | read -r SERVER_IP | |
| 90 | + | if [[ -z "$SERVER_IP" ]]; then | |
| 91 | + | SERVER_IP="$default_ip" | |
| 92 | + | fi | |
| 93 | + | fi | |
| 94 | + | ||
| 95 | + | print_status "Ще се използва IP адрес: $SERVER_IP" | |
| 96 | + | } | |
| 97 | + | ||
| 98 | + | # Генериране на сървърски ключове | |
| 99 | + | generate_server_keys() { | |
| 100 | + | print_header "ГЕНЕРИРАНЕ НА СЪРВЪРСКИ КЛЮЧОВЕ" | |
| 101 | + | ||
| 102 | + | if [[ ! -f /etc/wireguard/server_private.key ]]; then | |
| 103 | + | print_status "Генериране на сървърски частен ключ..." | |
| 104 | + | wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key | |
| 105 | + | chmod 600 /etc/wireguard/server_private.key | |
| 106 | + | chmod 644 /etc/wireguard/server_public.key | |
| 107 | + | else | |
| 108 | + | print_status "Сървърските ключове вече съществуват." | |
| 109 | + | fi | |
| 110 | + | ||
| 111 | + | SERVER_PRIVATE_KEY=$(cat /etc/wireguard/server_private.key) | |
| 112 | + | SERVER_PUBLIC_KEY=$(cat /etc/wireguard/server_public.key) | |
| 113 | + | } | |
| 114 | + | ||
| 115 | + | # Настройка на сървърския конфигурационен файл | |
| 116 | + | setup_server_config() { | |
| 117 | + | print_header "НАСТРОЙКА НА СЪРВЪРСКАТА КОНФИГУРАЦИЯ" | |
| 118 | + | ||
| 119 | + | if [[ ! -f /etc/wireguard/wg0.conf ]]; then | |
| 120 | + | print_status "Създаване на wg0.conf..." | |
| 121 | + | ||
| 122 | + | # Определяне на мрежовия интерфейс | |
| 123 | + | INTERFACE=$(ip route | grep default | head -n1 | awk '{print $5}') | |
| 124 | + | ||
| 125 | + | cat > /etc/wireguard/wg0.conf << EOF | |
| 126 | + | [Interface] | |
| 127 | + | PrivateKey = $SERVER_PRIVATE_KEY | |
| 128 | + | Address = 10.8.0.1/24 | |
| 129 | + | ListenPort = 51820 | |
| 130 | + | SaveConfig = true | |
| 131 | + | PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE | |
| 132 | + | PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o $INTERFACE -j MASQUERADE | |
| 133 | + | ||
| 134 | + | EOF | |
| 135 | + | ||
| 136 | + | print_status "Сървърската конфигурация е създадена." | |
| 137 | + | else | |
| 138 | + | print_status "Сървърската конфигурация вече съществува." | |
| 139 | + | fi | |
| 140 | + | } | |
| 141 | + | ||
| 142 | + | # Активиране на IP forwarding | |
| 143 | + | enable_ip_forwarding() { | |
| 144 | + | print_status "Активиране на IP forwarding..." | |
| 145 | + | echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf | |
| 146 | + | sysctl -p | |
| 147 | + | } | |
| 148 | + | ||
| 149 | + | # Стартиране на WireGuard службата | |
| 150 | + | start_wireguard() { | |
| 151 | + | print_header "СТАРТИРАНЕ НА WIREGUARD" | |
| 152 | + | ||
| 153 | + | print_status "Стартиране и активиране на WireGuard..." | |
| 154 | + | systemctl enable wg-quick@wg0 | |
| 155 | + | systemctl start wg-quick@wg0 | |
| 156 | + | ||
| 157 | + | if systemctl is-active --quiet wg-quick@wg0; then | |
| 158 | + | print_status "WireGuard е стартиран успешно!" | |
| 159 | + | else | |
| 160 | + | print_error "Проблем със стартирането на WireGuard!" | |
| 161 | + | exit 1 | |
| 162 | + | fi | |
| 163 | + | } | |
| 164 | + | ||
| 165 | + | # Функция за генериране на клиентски конфигурации | |
| 166 | + | generate_client_config() { | |
| 167 | + | local client_name="$1" | |
| 168 | + | local client_number="$2" | |
| 169 | + | ||
| 170 | + | print_header "ГЕНЕРИРАНЕ НА КЛИЕНТ: $client_name" | |
| 171 | + | ||
| 172 | + | # Генериране на клиентски ключове | |
| 173 | + | CLIENT_PRIVATE_KEY=$(wg genkey) | |
| 174 | + | CLIENT_PUBLIC_KEY=$(echo "$CLIENT_PRIVATE_KEY" | wg pubkey) | |
| 175 | + | CLIENT_IP="10.8.0.$((client_number + 1))" | |
| 176 | + | ||
| 177 | + | # Създаване на клиентска конфигурация | |
| 178 | + | CLIENT_CONFIG="/etc/wireguard/clients/${client_name}.conf" | |
| 179 | + | ||
| 180 | + | cat > "$CLIENT_CONFIG" << EOF | |
| 181 | + | [Interface] | |
| 182 | + | PrivateKey = $CLIENT_PRIVATE_KEY | |
| 183 | + | Address = $CLIENT_IP/32 | |
| 184 | + | DNS = 8.8.8.8, 1.1.1.1 | |
| 185 | + | ||
| 186 | + | [Peer] | |
| 187 | + | PublicKey = $SERVER_PUBLIC_KEY | |
| 188 | + | Endpoint = $SERVER_IP:51820 | |
| 189 | + | AllowedIPs = 0.0.0.0/0 | |
| 190 | + | PersistentKeepalive = 25 | |
| 191 | + | EOF | |
| 192 | + | ||
| 193 | + | print_status "Клиентската конфигурация е създадена: $CLIENT_CONFIG" | |
| 194 | + | ||
| 195 | + | # Добавяне на клиента към сървърската конфигурация | |
| 196 | + | cat >> /etc/wireguard/wg0.conf << EOF | |
| 197 | + | ||
| 198 | + | # Client: $client_name | |
| 199 | + | [Peer] | |
| 200 | + | PublicKey = $CLIENT_PUBLIC_KEY | |
| 201 | + | AllowedIPs = $CLIENT_IP/32 | |
| 202 | + | EOF | |
| 203 | + | ||
| 204 | + | print_status "Клиентът е добавен към сървърската конфигурация." | |
| 205 | + | ||
| 206 | + | # Рестартиране на WireGuard | |
| 207 | + | print_status "Рестартиране на WireGuard..." | |
| 208 | + | systemctl restart wg-quick@wg0 | |
| 209 | + | ||
| 210 | + | # Генериране на QR код | |
| 211 | + | print_status "Генериране на QR код за $client_name..." | |
| 212 | + | qrencode -t ansiutf8 < "$CLIENT_CONFIG" | |
| 213 | + | ||
| 214 | + | # Запазване на QR код във файл | |
| 215 | + | qrencode -o "/etc/wireguard/clients/${client_name}-qr.png" < "$CLIENT_CONFIG" | |
| 216 | + | ||
| 217 | + | print_status "QR кодът е запазен като: /etc/wireguard/clients/${client_name}-qr.png" | |
| 218 | + | ||
| 219 | + | echo "" | |
| 220 | + | print_status "Конфигурационен файл за $client_name:" | |
| 221 | + | echo "================================" | |
| 222 | + | cat "$CLIENT_CONFIG" | |
| 223 | + | echo "================================" | |
| 224 | + | } | |
| 225 | + | ||
| 226 | + | # Функция за добавяне на нов клиент | |
| 227 | + | add_client() { | |
| 228 | + | echo "Въведете име на клиента:" | |
| 229 | + | read -r client_name | |
| 230 | + | ||
| 231 | + | if [[ -z "$client_name" ]]; then | |
| 232 | + | print_error "Името на клиента не може да бъде празно!" | |
| 233 | + | return 1 | |
| 234 | + | fi | |
| 235 | + | ||
| 236 | + | # Проверка дали клиентът вече съществува | |
| 237 | + | if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then | |
| 238 | + | print_warning "Клиент с име '$client_name' вече съществува!" | |
| 239 | + | return 1 | |
| 240 | + | fi | |
| 241 | + | ||
| 242 | + | # Определяне на следващия номер на клиент | |
| 243 | + | client_number=$(find /etc/wireguard/clients -name "*.conf" | wc -l) | |
| 244 | + | ||
| 245 | + | # Проверка за максимален брой клиенти | |
| 246 | + | if [[ $client_number -ge 253 ]]; then | |
| 247 | + | print_error "Достигнат е максималният брой клиенти (253)!" | |
| 248 | + | return 1 | |
| 249 | + | fi | |
| 250 | + | ||
| 251 | + | generate_client_config "$client_name" "$client_number" | |
| 252 | + | } | |
| 253 | + | ||
| 254 | + | # Функция за показване на статуса | |
| 255 | + | show_status() { | |
| 256 | + | print_header "WIREGUARD СТАТУС" | |
| 257 | + | ||
| 258 | + | echo "Статус на услугата:" | |
| 259 | + | systemctl status wg-quick@wg0 --no-pager -l | |
| 260 | + | ||
| 261 | + | echo "" | |
| 262 | + | echo "Активни връзки:" | |
| 263 | + | wg show | |
| 264 | + | ||
| 265 | + | echo "" | |
| 266 | + | echo "Налични клиенти:" | |
| 267 | + | ls -la /etc/wireguard/clients/ 2>/dev/null || echo "Няма създадени клиенти." | |
| 268 | + | } | |
| 269 | + | ||
| 270 | + | # Главно меню | |
| 271 | + | show_menu() { | |
| 272 | + | echo "" | |
| 273 | + | print_header "WIREGUARD УПРАВЛЕНИЕ" | |
| 274 | + | echo "1. Добави нов клиент" | |
| 275 | + | echo "2. Покажи статус" | |
| 276 | + | echo "3. Покажи QR код за клиент" | |
| 277 | + | echo "4. Покажи конфигурация за клиент" | |
| 278 | + | echo "5. Изход" | |
| 279 | + | echo "" | |
| 280 | + | echo -n "Изберете опция (1-5): " | |
| 281 | + | } | |
| 282 | + | ||
| 283 | + | # Функция за показване на QR код | |
| 284 | + | show_qr_code() { | |
| 285 | + | echo "Налични клиенти:" | |
| 286 | + | ls /etc/wireguard/clients/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf||' || { print_error "Няма създадени клиенти."; return 1; } | |
| 287 | + | ||
| 288 | + | echo "" | |
| 289 | + | echo "Въведете име на клиента за показване на QR код:" | |
| 290 | + | read -r client_name | |
| 291 | + | ||
| 292 | + | if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then | |
| 293 | + | qrencode -t ansiutf8 < "/etc/wireguard/clients/${client_name}.conf" | |
| 294 | + | else | |
| 295 | + | print_error "Клиент '$client_name' не съществува!" | |
| 296 | + | fi | |
| 297 | + | } | |
| 298 | + | ||
| 299 | + | # Функция за показване на конфигурация | |
| 300 | + | show_client_config() { | |
| 301 | + | echo "Налични клиенти:" | |
| 302 | + | ls /etc/wireguard/clients/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf||' || { print_error "Няма създадени клиенти."; return 1; } | |
| 303 | + | ||
| 304 | + | echo "" | |
| 305 | + | echo "Въведете име на клиента за показване на конфигурацията:" | |
| 306 | + | read -r client_name | |
| 307 | + | ||
| 308 | + | if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then | |
| 309 | + | echo "Конфигурация за клиент '$client_name':" | |
| 310 | + | echo "=====================================" | |
| 311 | + | cat "/etc/wireguard/clients/${client_name}.conf" | |
| 312 | + | echo "=====================================" | |
| 313 | + | else | |
| 314 | + | print_error "Клиент '$client_name' не съществува!" | |
| 315 | + | fi | |
| 316 | + | } | |
| 317 | + | ||
| 318 | + | # Главна функция | |
| 319 | + | main() { | |
| 320 | + | print_header "WIREGUARD SETUP SCRIPT" | |
| 321 | + | print_status "Стартиране на автоматичната инсталация..." | |
| 322 | + | ||
| 323 | + | check_root | |
| 324 | + | ||
| 325 | + | # Проверка дали WireGuard е вече инсталиран | |
| 326 | + | if ! command -v wg &> /dev/null; then | |
| 327 | + | install_wireguard | |
| 328 | + | get_external_ip | |
| 329 | + | generate_server_keys | |
| 330 | + | setup_server_config | |
| 331 | + | enable_ip_forwarding | |
| 332 | + | start_wireguard | |
| 333 | + | ||
| 334 | + | print_status "WireGuard е инсталиран и конфигуриран успешно!" | |
| 335 | + | ||
| 336 | + | # Автоматично добавяне на първи клиент | |
| 337 | + | echo "" | |
| 338 | + | echo "Желаете ли да добавите първи клиент сега? (y/n)" | |
| 339 | + | read -r add_first_client | |
| 340 | + | if [[ "$add_first_client" =~ ^[Yy]$ ]]; then | |
| 341 | + | add_client | |
| 342 | + | fi | |
| 343 | + | else | |
| 344 | + | print_status "WireGuard е вече инсталиран." | |
| 345 | + | SERVER_IP=$(grep -E '^Endpoint' /etc/wireguard/clients/*.conf 2>/dev/null | head -1 | cut -d'=' -f2 | cut -d':' -f1 | xargs || echo "95.42.103.123") | |
| 346 | + | fi | |
| 347 | + | ||
| 348 | + | # Главен цикъл на менюто | |
| 349 | + | while true; do | |
| 350 | + | show_menu | |
| 351 | + | read -r choice | |
| 352 | + | ||
| 353 | + | case $choice in | |
| 354 | + | 1) | |
| 355 | + | add_client | |
| 356 | + | ;; | |
| 357 | + | 2) | |
| 358 | + | show_status | |
| 359 | + | ;; | |
| 360 | + | 3) | |
| 361 | + | show_qr_code | |
| 362 | + | ;; | |
| 363 | + | 4) | |
| 364 | + | show_client_config | |
| 365 | + | ;; | |
| 366 | + | 5) | |
| 367 | + | print_status "Изход от скрипта." | |
| 368 | + | break | |
| 369 | + | ;; | |
| 370 | + | *) | |
| 371 | + | print_warning "Невалидна опция. Моля, изберете 1-5." | |
| 372 | + | ;; | |
| 373 | + | esac | |
| 374 | + | ||
| 375 | + | echo "" | |
| 376 | + | echo "Натиснете Enter за да продължите..." | |
| 377 | + | read -r | |
| 378 | + | done | |
| 379 | + | } | |
| 380 | + | ||
| 381 | + | # Стартиране на скрипта | |
| 382 | + | main "$@" | |