最后活跃于 1753013645

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

修订 60cec72dcf99048ac5768ce92eb51fa952c48a09

wireguard_setup.sh 原始文件
1#!/bin/bash
2
3# WireGuard автоматична инсталация и настройка за Proxmox Ubuntu контейнер
4# Скрипт за инсталиране на WireGuard, генериране на ключове и настройка на клиенти
5
6set -e
7
8# Цветове за по-добро визуализиране
9RED='\033[0;31m'
10GREEN='\033[0;32m'
11YELLOW='\033[1;33m'
12BLUE='\033[0;34m'
13NC='\033[0m' # No Color
14
15# Функция за печатане на цветни съобщения
16print_status() {
17 echo -e "${GREEN}[INFO]${NC} $1"
18}
19
20print_warning() {
21 echo -e "${YELLOW}[WARNING]${NC} $1"
22}
23
24print_error() {
25 echo -e "${RED}[ERROR]${NC} $1"
26}
27
28print_header() {
29 echo -e "${BLUE}================================${NC}"
30 echo -e "${BLUE}$1${NC}"
31 echo -e "${BLUE}================================${NC}"
32}
33
34# Проверка дали скриптът се изпълнява като root
35check_root() {
36 if [[ $EUID -ne 0 ]]; then
37 print_error "Този скрипт трябва да се изпълнява като root!"
38 exit 1
39 fi
40}
41
42# Инсталиране на WireGuard и необходими пакети
43install_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
62get_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# Генериране на сървърски ключове
99generate_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# Настройка на сървърския конфигурационен файл
116setup_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]
127PrivateKey = $SERVER_PRIVATE_KEY
128Address = 10.8.0.1/24
129ListenPort = 51820
130SaveConfig = true
131PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
132PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o $INTERFACE -j MASQUERADE
133
134EOF
135
136 print_status "Сървърската конфигурация е създадена."
137 else
138 print_status "Сървърската конфигурация вече съществува."
139 fi
140}
141
142# Активиране на IP forwarding
143enable_ip_forwarding() {
144 print_status "Активиране на IP forwarding..."
145 echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
146 sysctl -p
147}
148
149# Стартиране на WireGuard службата
150start_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# Функция за генериране на клиентски конфигурации
166generate_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]
182PrivateKey = $CLIENT_PRIVATE_KEY
183Address = $CLIENT_IP/32
184DNS = 8.8.8.8, 1.1.1.1
185
186[Peer]
187PublicKey = $SERVER_PUBLIC_KEY
188Endpoint = $SERVER_IP:51820
189AllowedIPs = 0.0.0.0/0
190PersistentKeepalive = 25
191EOF
192
193 print_status "Клиентската конфигурация е създадена: $CLIENT_CONFIG"
194
195 # Добавяне на клиента към сървърската конфигурация
196 cat >> /etc/wireguard/wg0.conf << EOF
197
198# Client: $client_name
199[Peer]
200PublicKey = $CLIENT_PUBLIC_KEY
201AllowedIPs = $CLIENT_IP/32
202EOF
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# Функция за добавяне на нов клиент
227add_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# Функция за показване на статуса
255show_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# Главно меню
271show_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 код
284show_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# Функция за показване на конфигурация
300show_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# Главна функция
319main() {
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# Стартиране на скрипта
382main "$@"