urocibg revised this gist . Go to revision
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 revised this gist . Go to revision
1 file changed, 382 insertions
wireguard_setup.sh(file created)
@@ -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 "$@" |