Последняя активность 1753013645

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

urocibg ревизий этого фрагмента 1753013645. К ревизии

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 ревизий этого фрагмента 1753012316. К ревизии

1 file changed, 382 insertions

wireguard_setup.sh(файл создан)

@@ -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 "$@"
Новее Позже