Naposledy aktivní 1760854231

Revize fcea29b65bd11f9a6f192b9554cb62aae74221c1

tailscale-setup.sh Raw
1#!/bin/bash
2
3#═══════════════════════════════════════════════════════════════════════════════
4# Professional Tailscale Setup Script
5# Author: Федя Серафиев
6# Description: Complete automated Tailscale setup for Proxmox LXC container
7# Purpose: Secure access to home network and Docker containers from anywhere
8# Version: 2.0
9#═══════════════════════════════════════════════════════════════════════════════
10
11set -e
12
13#═══════════════════════════════════════════════════════════════════════════════
14# Configuration
15#═══════════════════════════════════════════════════════════════════════════════
16
17# Your local network that you want to access remotely
18LOCAL_NETWORK="10.110.110.0/24"
19
20# Parameters (can be set via environment variables)
21HOSTNAME="${HOSTNAME:-proxmox-vpn}"
22EXIT_NODE="${EXIT_NODE:-true}"
23SKIP_STEPS="${SKIP_STEPS:-}"
24
25# Logging
26LOG_FILE="/var/log/tailscale-setup.log"
27exec > >(tee -a "$LOG_FILE") 2>&1
28
29# Colors
30RED='\033[0;31m'
31GREEN='\033[0;32m'
32YELLOW='\033[1;33m'
33BLUE='\033[0;34m'
34CYAN='\033[0;36m'
35MAGENTA='\033[0;35m'
36NC='\033[0m'
37
38#═══════════════════════════════════════════════════════════════════════════════
39# Helper Functions
40#═══════════════════════════════════════════════════════════════════════════════
41
42print_header() {
43 echo -e "\n${CYAN}═══════════════════════════════════════════════════════════════${NC}"
44 echo -e "${CYAN}$1${NC}"
45 echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}\n"
46}
47
48print_success() {
49 echo -e "${GREEN}$1${NC}"
50}
51
52print_error() {
53 echo -e "${RED}$1${NC}"
54}
55
56print_warning() {
57 echo -e "${YELLOW}⚠️ $1${NC}"
58}
59
60print_info() {
61 echo -e "${BLUE}ℹ️ $1${NC}"
62}
63
64print_step() {
65 echo -e "${MAGENTA}$1${NC}"
66}
67
68log_message() {
69 echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
70}
71
72check_root() {
73 if [[ $EUID -ne 0 ]]; then
74 print_error "Този скрипт трябва да се изпълни като root!"
75 echo "Използвайте: sudo bash $0"
76 log_message "ERROR: Script run without root privileges"
77 exit 1
78 fi
79 log_message "Root check passed"
80}
81
82check_os() {
83 print_step "Проверка на операционната система..."
84
85 if [[ ! -f /etc/debian_version ]] && [[ ! -f /etc/ubuntu-release ]]; then
86 print_error "Този скрипт поддържа само Debian/Ubuntu системи"
87 log_message "ERROR: Unsupported OS detected"
88 exit 1
89 fi
90
91 OS_VERSION=$(lsb_release -d | cut -f2)
92 print_success "Поддържана OS: $OS_VERSION"
93 log_message "OS check passed: $OS_VERSION"
94}
95
96check_tun() {
97 print_step "Проверка на TUN устройството..."
98
99 if [ ! -e /dev/net/tun ]; then
100 print_error "TUN устройството не е налично!"
101 print_warning "В Proxmox: Container Options → Features → TUN (трябва да е активирано)"
102 log_message "ERROR: TUN device not available"
103 exit 1
104 fi
105
106 print_success "TUN устройството е налично"
107 log_message "TUN device check passed"
108}
109
110check_existing_routes() {
111 print_step "Проверка за съществуващи routes..."
112
113 if ip route show table 52 2>/dev/null | grep -q "$LOCAL_NETWORK"; then
114 print_warning "Route за $LOCAL_NETWORK вече съществува"
115 log_message "Existing route found for $LOCAL_NETWORK"
116 return 1
117 fi
118
119 print_success "Няма съществуващи routes за $LOCAL_NETWORK"
120 log_message "No existing routes found for $LOCAL_NETWORK"
121 return 0
122}
123
124should_skip_step() {
125 local step=$1
126 if [[ "$SKIP_STEPS" == *"$step"* ]]; then
127 log_message "Skipping step: $step"
128 return 0
129 fi
130 return 1
131}
132
133#═══════════════════════════════════════════════════════════════════════════════
134# Main Installation Functions
135#═══════════════════════════════════════════════════════════════════════════════
136
137install_tailscale() {
138 if should_skip_step "install"; then
139 print_info "Прескачане на инсталацията на Tailscale"
140 return
141 fi
142
143 print_header "Инсталиране на Tailscale"
144
145 if command -v tailscale &>/dev/null; then
146 print_info "Tailscale вече е инсталиран"
147 tailscale version
148 log_message "Tailscale already installed"
149 return
150 fi
151
152 print_step "Добавяне на Tailscale repository..."
153
154 # Install using official repository (more secure than curl | sh)
155 curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.noarmor.gpg | \
156 tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
157
158 curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/jammy.tailscale-keyring.list | \
159 tee /etc/apt/sources.list.d/tailscale.list >/dev/null
160
161 print_step "Актуализиране на пакетите и инсталиране на Tailscale..."
162 apt-get update -qq
163 apt-get install -y tailscale
164
165 if [ $? -eq 0 ]; then
166 print_success "Tailscale е инсталиран успешно!"
167 log_message "Tailscale installed successfully"
168 tailscale version
169 else
170 print_error "Грешка при инсталирането на Tailscale"
171 log_message "ERROR: Tailscale installation failed"
172 exit 1
173 fi
174}
175
176configure_ip_forwarding() {
177 if should_skip_step "ip_forwarding"; then
178 print_info "Прескачане на IP forwarding конфигурацията"
179 return
180 fi
181
182 print_header "Конфигуриране на IP forwarding"
183
184 print_step "Активиране на IP forwarding..."
185
186 # Enable IPv4 forwarding (only if not already enabled)
187 if ! grep -q "net.ipv4.ip_forward = 1" /etc/sysctl.conf; then
188 echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf
189 fi
190
191 if ! grep -q "net.ipv6.conf.all.forwarding = 1" /etc/sysctl.conf; then
192 echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.conf
193 fi
194
195 # Apply changes
196 sysctl -p
197
198 print_success "IP forwarding е активирано"
199 log_message "IP forwarding configured"
200}
201
202setup_tailscale() {
203 if should_skip_step "setup"; then
204 print_info "Прескачане на Tailscale setup"
205 return
206 fi
207
208 print_header "Конфигуриране на Tailscale"
209
210 print_info "Конфигурационни параметри:"
211 echo -e " ${CYAN}Hostname:${NC} ${GREEN}$HOSTNAME${NC}"
212 echo -e " ${CYAN}Subnet:${NC} ${GREEN}$LOCAL_NETWORK${NC}"
213 echo -e " ${CYAN}Exit Node:${NC} ${GREEN}$EXIT_NODE${NC}"
214 echo ""
215
216 print_info "Сега ще се отвори браузър за автентикация в Tailscale"
217 print_info "Ако браузърът не се отвори автоматично, копирай линка от терминала"
218 echo ""
219
220 print_step "Стартиране на Tailscale като subnet router..."
221 print_warning "Важно: Тази машина ще рутира трафик за целия $LOCAL_NETWORK"
222 echo ""
223
224 # Build the command based on parameters
225 TS_CMD="tailscale up --advertise-routes=$LOCAL_NETWORK --accept-routes --hostname=$HOSTNAME"
226
227 if [ "$EXIT_NODE" = "true" ]; then
228 TS_CMD="$TS_CMD --advertise-exit-node"
229 fi
230
231 log_message "Executing Tailscale setup: $TS_CMD"
232
233 # Execute Tailscale setup
234 if eval "$TS_CMD"; then
235 print_success "Tailscale е конфигуриран успешно!"
236 log_message "Tailscale setup completed successfully"
237 else
238 print_error "Грешка при конфигурирането на Tailscale"
239 log_message "ERROR: Tailscale setup failed"
240 exit 1
241 fi
242}
243
244approve_routes() {
245 if should_skip_step "approve"; then
246 print_info "Прескачане на одобрението на routes"
247 return
248 fi
249
250 print_header "Важна стъпка - одобряване на subnet routes"
251
252 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}"
253 echo -e "${YELLOW}ВАЖНО: Трябва да одобриш subnet routes в Tailscale Admin Console!${NC}"
254 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}\n"
255
256 print_info "Следвай тези стъпки:"
257 echo -e "${CYAN}1.${NC} Отвори: ${GREEN}https://login.tailscale.com/admin/machines${NC}"
258 echo -e "${CYAN}2.${NC} Намери устройството ${GREEN}$HOSTNAME${NC}"
259 echo -e "${CYAN}3.${NC} Кликни на трите точки ${GREEN}(...)${NC} до името"
260 echo -e "${CYAN}4.${NC} Избери ${GREEN}Edit route settings...${NC}"
261 echo -e "${CYAN}5.${NC} Активирай ${GREEN}$LOCAL_NETWORK${NC} (subnet routes)"
262
263 if [ "$EXIT_NODE" = "true" ]; then
264 echo -e "${CYAN}6.${NC} Активирай ${GREEN}Use as exit node${NC}"
265 fi
266
267 echo ""
268
269 # Check if routes are already approved
270 if check_existing_routes; then
271 print_info "Routes все още не са одобрени. Чакам одобрение..."
272 else
273 print_success "Routes вече са одобрени!"
274 return
275 fi
276
277 read -p "Натисни Enter след като завършиш одобрението..."
278
279 # Verify routes were approved
280 if check_existing_routes; then
281 print_warning "Routes все още не са одобрени. Провери в Admin Console."
282 read -p "Натисни Enter, когато routes са одобрени, или Ctrl+C за изход..."
283 fi
284
285 print_success "Routes са одобрени"
286 log_message "Routes approved in Tailscale admin"
287}
288
289get_tailscale_info() {
290 print_header "Информация за Tailscale мрежата"
291
292 # Get Tailscale IP
293 TAILSCALE_IP=$(tailscale ip -4)
294 TAILSCALE_IP6=$(tailscale ip -6)
295
296 echo -e "${CYAN}Tailscale IPv4:${NC} ${GREEN}$TAILSCALE_IP${NC}"
297 echo -e "${CYAN}Tailscale IPv6:${NC} ${GREEN}$TAILSCALE_IP6${NC}"
298 echo -e "${CYAN}Hostname:${NC} ${GREEN}$HOSTNAME${NC}"
299 echo -e "${CYAN}Subnet Routes:${NC} ${GREEN}$LOCAL_NETWORK${NC}"
300 echo -e "${CYAN}Exit Node:${NC} ${GREEN}$EXIT_NODE${NC}"
301 echo ""
302
303 print_step "Показване на всички устройства в мрежата..."
304 tailscale status
305
306 log_message "Tailscale info displayed - IP: $TAILSCALE_IP"
307}
308
309create_management_script() {
310 print_header "Създаване на management скрипт"
311
312 cat > /usr/local/bin/tailscale-info <<'SCRIPT'
313#!/bin/bash
314
315GREEN='\033[0;32m'
316CYAN='\033[0;36m'
317YELLOW='\033[1;33m'
318NC='\033[0m'
319
320echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}"
321echo -e "${CYAN}Tailscale Network Information${NC}"
322echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}\n"
323
324echo -e "${GREEN}Your Tailscale IPs:${NC}"
325echo -e " IPv4: $(tailscale ip -4)"
326echo -e " IPv6: $(tailscale ip -6)"
327echo ""
328
329echo -e "${GREEN}Status:${NC}"
330tailscale status
331echo ""
332
333echo -e "${GREEN}Advertised Routes:${NC}"
334ip route show table 52 2>/dev/null || echo " No routes found"
335echo ""
336
337echo -e "${YELLOW}Useful commands:${NC}"
338echo -e " ${CYAN}tailscale status${NC} - Show all devices"
339echo -e " ${CYAN}tailscale ping <device>${NC} - Ping another device"
340echo -e " ${CYAN}tailscale netcheck${NC} - Check connectivity"
341echo -e " ${CYAN}tailscale up${NC} - Reconnect"
342echo -e " ${CYAN}tailscale down${NC} - Disconnect"
343echo -e " ${CYAN}tailscale logout${NC} - Logout"
344SCRIPT
345
346 chmod +x /usr/local/bin/tailscale-info
347
348 print_success "Management скрипт създаден: tailscale-info"
349 log_message "Management script created: /usr/local/bin/tailscale-info"
350}
351
352test_connectivity() {
353 print_header "Тестване на връзката"
354
355 print_step "Проверка на Tailscale connectivity..."
356 tailscale netcheck
357
358 echo ""
359
360 # Test if we can ping ourselves
361 if TAILSCALE_IP=$(tailscale ip -4); then
362 print_step "Тестване на връзка до себе си ($TAILSCALE_IP)..."
363 if ping -c 2 -W 1 "$TAILSCALE_IP" &>/dev/null; then
364 print_success "Успешен ping до собствената Tailscale IP"
365 else
366 print_warning "Неуспешен ping до собствената Tailscale IP"
367 fi
368 fi
369
370 print_info "Tailscale е готов за употреба!"
371 log_message "Connectivity test completed"
372}
373
374print_final_summary() {
375 print_header "Инсталацията е завършена успешно! 🎉"
376
377 TAILSCALE_IP=$(tailscale ip -4)
378
379 echo -e "${GREEN}📊 Конфигурация:${NC}\n"
380 echo -e "${CYAN}Tailscale IP:${NC} ${GREEN}$TAILSCALE_IP${NC}"
381 echo -e "${CYAN}Subnet Router:${NC} ${GREEN}$LOCAL_NETWORK${NC}"
382 echo -e "${CYAN}Hostname:${NC} ${GREEN}$HOSTNAME${NC}"
383 echo -e "${CYAN}Exit Node:${NC} ${GREEN}$EXIT_NODE${NC}"
384 echo -e "${CYAN}Log File:${NC} ${GREEN}$LOG_FILE${NC}\n"
385
386 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}"
387 echo -e "${YELLOW}📱 Следващи стъпки:${NC}\n"
388
389 echo -e "${CYAN}1. На телефона/лаптопа:${NC}"
390 echo -e " • Инсталирай Tailscale app от:"
391 echo -e " - iOS: ${GREEN}App Store${NC}"
392 echo -e " - Android: ${GREEN}Google Play${NC}"
393 echo -e " - Windows/Mac/Linux: ${GREEN}https://tailscale.com/download${NC}"
394 echo -e " • Логни се със ${GREEN}същия акаунт${NC}\n"
395
396 echo -e "${CYAN}2. Достъп до локалната мрежа:${NC}"
397 echo -e " • От телефона/лаптопа можеш директно да достъпваш:"
398 echo -e " ${GREEN}10.110.110.x${NC} - всички устройства в локалната мрежа"
399 echo -e " ${GREEN}$TAILSCALE_IP${NC} - този Proxmox контейнер\n"
400
401 echo -e "${CYAN}3. Достъп до Docker контейнери:${NC}"
402 echo -e " • Ако имаш Docker на ${GREEN}10.110.110.x${NC}"
403 echo -e " • Директно отваряш: ${GREEN}http://10.110.110.x:port${NC}\n"
404
405 if [ "$EXIT_NODE" = "true" ]; then
406 echo -e "${CYAN}4. Exit Node:${NC}"
407 echo -e " • За да използваш като VPN за целия интернет трафик:"
408 echo -e " • В Tailscale app: Settings → ${GREEN}Use exit node → $HOSTNAME${NC}\n"
409 fi
410
411 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}"
412 echo -e "${YELLOW}🔧 Полезни команди:${NC}\n"
413 echo -e " ${GREEN}tailscale-info${NC} - Показва информация за мрежата"
414 echo -e " ${GREEN}tailscale status${NC} - Показва всички устройства"
415 echo -e " ${GREEN}tailscale ping <device>${NC} - Тества връзка до устройство"
416 echo -e " ${GREEN}tailscale netcheck${NC} - Проверява connectivity"
417 echo -e " ${GREEN}tailscale up${NC} - Свързва се отново"
418 echo -e " ${GREEN}tailscale down${NC} - Изключва се от мрежата\n"
419
420 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}"
421 echo -e "${YELLOW}💡 Предимства пред OpenVPN:${NC}\n"
422 echo -e " ${GREEN}${NC} Не трябва статично IP"
423 echo -e " ${GREEN}${NC} Не трябва port forwarding"
424 echo -e " ${GREEN}${NC} Автоматично се reconnect-ва"
425 echo -e " ${GREEN}${NC} Работи от всяка мрежа (мобилни данни, WiFi)"
426 echo -e " ${GREEN}${NC} Peer-to-peer връзки (супер бърз)"
427 echo -e " ${GREEN}${NC} Базиран на WireGuard (модерна криптография)"
428 echo -e " ${GREEN}${NC} Безплатен за лична употреба (до 100 устройства)\n"
429
430 echo -e "${YELLOW}═══════════════════════════════════════════════════════════════${NC}"
431 echo -e "${YELLOW}🌐 Web Console:${NC}"
432 echo -e " ${GREEN}https://login.tailscale.com/admin${NC}\n"
433
434 echo -e "${YELLOW}📝 Лог файл:${NC}"
435 echo -e " ${GREEN}$LOG_FILE${NC}\n"
436
437 print_success "Готово! Enjoi your secure network! 🚀"
438 log_message "Setup completed successfully - Final IP: $TAILSCALE_IP"
439}
440
441print_usage() {
442 echo -e "${CYAN}Usage:${NC}"
443 echo -e " ${GREEN}sudo bash $0${NC}"
444 echo ""
445 echo -e "${CYAN}Environment variables:${NC}"
446 echo -e " ${GREEN}HOSTNAME${NC} - Tailscale hostname (default: proxmox-vpn)"
447 echo -e " ${GREEN}EXIT_NODE${NC} - Enable exit node (default: true)"
448 echo -e " ${GREEN}SKIP_STEPS${NC} - Skip specific steps (comma-separated)"
449 echo -e " Available: install, ip_forwarding, setup, approve"
450 echo ""
451 echo -e "${CYAN}Examples:${NC}"
452 echo -e " ${GREEN}sudo HOSTNAME=my-server EXIT_NODE=false bash $0${NC}"
453 echo -e " ${GREEN}sudo SKIP_STEPS=install,ip_forwarding bash $0${NC}"
454 echo ""
455}
456
457#═══════════════════════════════════════════════════════════════════════════════
458# Main Execution
459#═══════════════════════════════════════════════════════════════════════════════
460
461main() {
462 print_header "🚀 Tailscale Professional Setup v2.0"
463
464 # Log start of script
465 log_message "=== Tailscale Setup Script Started ==="
466 log_message "Parameters - HOSTNAME: $HOSTNAME, EXIT_NODE: $EXIT_NODE, SKIP_STEPS: $SKIP_STEPS"
467
468 # Show usage if help requested
469 if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
470 print_usage
471 exit 0
472 fi
473
474 check_root
475 check_os
476 check_tun
477
478 install_tailscale
479 configure_ip_forwarding
480 setup_tailscale
481 approve_routes
482 get_tailscale_info
483 create_management_script
484 test_connectivity
485
486 print_final_summary
487}
488
489# Run main function with all arguments
490main "$@"