Ostatnio aktywny 1753013645

Bash скрипт за автоматична инсталация на WireGuard на Proxmox Ubuntu контейнер с всички необходими функции

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