wireguard_setup.sh
· 14 KiB · Bash
原始檔案
#!/bin/bash
# WireGuard автоматична инсталация и настройка за Proxmox Ubuntu контейнер
# Скрипт за инсталиране на WireGuard, генериране на ключове и настройка на клиенти
# Автор: Федя Серафиев
set -e
# Цветове за по-добро визуализиране
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция за печатане на цветни съобщения
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_header() {
echo -e "${BLUE}================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}================================${NC}"
}
# Проверка дали скриптът се изпълнява като root
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "Този скрипт трябва да се изпълнява като root!"
exit 1
fi
}
# Инсталиране на WireGuard и необходими пакети
install_wireguard() {
print_header "ИНСТАЛИРАНЕ НА WIREGUARD"
# Обновяване на пакетите
print_status "Обновяване на системата..."
apt update && apt upgrade -y
# Инсталиране на WireGuard и помощни инструменти
print_status "Инсталиране на WireGuard и помощни инструменти..."
apt install -y wireguard wireguard-tools qrencode iptables-persistent curl net-tools
# Създаване на директории
mkdir -p /etc/wireguard/clients
chmod 700 /etc/wireguard
print_status "WireGuard е инсталиран успешно!"
}
# Функция за получаване на външно IP
get_external_ip() {
local external_ip=""
local default_ip="95.42.103.123"
print_status "Опит за автоматично определяне на външното IP..."
# Опити за получаване на външното IP
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 "")
if [[ -n "$external_ip" ]]; then
print_status "Автоматично определено външно IP: $external_ip"
echo -e "Желаете ли да използвате това IP? ${GREEN}$external_ip${NC} (y/n) или въведете различно IP:"
read -r user_choice
if [[ "$user_choice" =~ ^[Yy]$ ]] || [[ -z "$user_choice" ]]; then
SERVER_IP="$external_ip"
else
echo "Въведете външното IP адрес на сървъра:"
read -r SERVER_IP
if [[ -z "$SERVER_IP" ]]; then
print_warning "Не е въведено IP. Използва се: $default_ip"
SERVER_IP="$default_ip"
fi
fi
else
print_warning "Не може да се определи автоматично външното IP"
echo "Въведете външното IP адрес на сървъра (или натиснете Enter за $default_ip):"
read -r SERVER_IP
if [[ -z "$SERVER_IP" ]]; then
SERVER_IP="$default_ip"
fi
fi
print_status "Ще се използва IP адрес: $SERVER_IP"
}
# Генериране на сървърски ключове
generate_server_keys() {
print_header "ГЕНЕРИРАНЕ НА СЪРВЪРСКИ КЛЮЧОВЕ"
if [[ ! -f /etc/wireguard/server_private.key ]]; then
print_status "Генериране на сървърски частен ключ..."
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key
chmod 644 /etc/wireguard/server_public.key
else
print_status "Сървърските ключове вече съществуват."
fi
SERVER_PRIVATE_KEY=$(cat /etc/wireguard/server_private.key)
SERVER_PUBLIC_KEY=$(cat /etc/wireguard/server_public.key)
}
# Настройка на сървърския конфигурационен файл
setup_server_config() {
print_header "НАСТРОЙКА НА СЪРВЪРСКАТА КОНФИГУРАЦИЯ"
if [[ ! -f /etc/wireguard/wg0.conf ]]; then
print_status "Създаване на wg0.conf..."
# Определяне на мрежовия интерфейс
INTERFACE=$(ip route | grep default | head -n1 | awk '{print $5}')
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $SERVER_PRIVATE_KEY
Address = 10.8.0.1/24
ListenPort = 51820
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o $INTERFACE -j MASQUERADE
EOF
print_status "Сървърската конфигурация е създадена."
else
print_status "Сървърската конфигурация вече съществува."
fi
}
# Активиране на IP forwarding
enable_ip_forwarding() {
print_status "Активиране на IP forwarding..."
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
}
# Стартиране на WireGuard службата
start_wireguard() {
print_header "СТАРТИРАНЕ НА WIREGUARD"
print_status "Стартиране и активиране на WireGuard..."
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
if systemctl is-active --quiet wg-quick@wg0; then
print_status "WireGuard е стартиран успешно!"
else
print_error "Проблем със стартирането на WireGuard!"
exit 1
fi
}
# Функция за генериране на клиентски конфигурации
generate_client_config() {
local client_name="$1"
local client_number="$2"
print_header "ГЕНЕРИРАНЕ НА КЛИЕНТ: $client_name"
# Генериране на клиентски ключове
CLIENT_PRIVATE_KEY=$(wg genkey)
CLIENT_PUBLIC_KEY=$(echo "$CLIENT_PRIVATE_KEY" | wg pubkey)
CLIENT_IP="10.8.0.$((client_number + 1))"
# Създаване на клиентска конфигурация
CLIENT_CONFIG="/etc/wireguard/clients/${client_name}.conf"
cat > "$CLIENT_CONFIG" << EOF
[Interface]
PrivateKey = $CLIENT_PRIVATE_KEY
Address = $CLIENT_IP/32
DNS = 8.8.8.8, 1.1.1.1
[Peer]
PublicKey = $SERVER_PUBLIC_KEY
Endpoint = $SERVER_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
print_status "Клиентската конфигурация е създадена: $CLIENT_CONFIG"
# Добавяне на клиента към сървърската конфигурация
cat >> /etc/wireguard/wg0.conf << EOF
# Client: $client_name
[Peer]
PublicKey = $CLIENT_PUBLIC_KEY
AllowedIPs = $CLIENT_IP/32
EOF
print_status "Клиентът е добавен към сървърската конфигурация."
# Рестартиране на WireGuard
print_status "Рестартиране на WireGuard..."
systemctl restart wg-quick@wg0
# Генериране на QR код
print_status "Генериране на QR код за $client_name..."
qrencode -t ansiutf8 < "$CLIENT_CONFIG"
# Запазване на QR код във файл
qrencode -o "/etc/wireguard/clients/${client_name}-qr.png" < "$CLIENT_CONFIG"
print_status "QR кодът е запазен като: /etc/wireguard/clients/${client_name}-qr.png"
echo ""
print_status "Конфигурационен файл за $client_name:"
echo "================================"
cat "$CLIENT_CONFIG"
echo "================================"
}
# Функция за добавяне на нов клиент
add_client() {
echo "Въведете име на клиента:"
read -r client_name
if [[ -z "$client_name" ]]; then
print_error "Името на клиента не може да бъде празно!"
return 1
fi
# Проверка дали клиентът вече съществува
if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then
print_warning "Клиент с име '$client_name' вече съществува!"
return 1
fi
# Определяне на следващия номер на клиент
client_number=$(find /etc/wireguard/clients -name "*.conf" | wc -l)
# Проверка за максимален брой клиенти
if [[ $client_number -ge 253 ]]; then
print_error "Достигнат е максималният брой клиенти (253)!"
return 1
fi
generate_client_config "$client_name" "$client_number"
}
# Функция за показване на статуса
show_status() {
print_header "WIREGUARD СТАТУС"
echo "Статус на услугата:"
systemctl status wg-quick@wg0 --no-pager -l
echo ""
echo "Активни връзки:"
wg show
echo ""
echo "Налични клиенти:"
ls -la /etc/wireguard/clients/ 2>/dev/null || echo "Няма създадени клиенти."
}
# Главно меню
show_menu() {
echo ""
print_header "WIREGUARD УПРАВЛЕНИЕ"
echo "1. Добави нов клиент"
echo "2. Покажи статус"
echo "3. Покажи QR код за клиент"
echo "4. Покажи конфигурация за клиент"
echo "5. Изход"
echo ""
echo -n "Изберете опция (1-5): "
}
# Функция за показване на QR код
show_qr_code() {
echo "Налични клиенти:"
ls /etc/wireguard/clients/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf||' || { print_error "Няма създадени клиенти."; return 1; }
echo ""
echo "Въведете име на клиента за показване на QR код:"
read -r client_name
if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then
qrencode -t ansiutf8 < "/etc/wireguard/clients/${client_name}.conf"
else
print_error "Клиент '$client_name' не съществува!"
fi
}
# Функция за показване на конфигурация
show_client_config() {
echo "Налични клиенти:"
ls /etc/wireguard/clients/*.conf 2>/dev/null | sed 's|.*/||; s|\.conf||' || { print_error "Няма създадени клиенти."; return 1; }
echo ""
echo "Въведете име на клиента за показване на конфигурацията:"
read -r client_name
if [[ -f "/etc/wireguard/clients/${client_name}.conf" ]]; then
echo "Конфигурация за клиент '$client_name':"
echo "====================================="
cat "/etc/wireguard/clients/${client_name}.conf"
echo "====================================="
else
print_error "Клиент '$client_name' не съществува!"
fi
}
# Главна функция
main() {
print_header "WIREGUARD SETUP SCRIPT"
print_status "Стартиране на автоматичната инсталация..."
check_root
# Проверка дали WireGuard е вече инсталиран
if ! command -v wg &> /dev/null; then
install_wireguard
get_external_ip
generate_server_keys
setup_server_config
enable_ip_forwarding
start_wireguard
print_status "WireGuard е инсталиран и конфигуриран успешно!"
# Автоматично добавяне на първи клиент
echo ""
echo "Желаете ли да добавите първи клиент сега? (y/n)"
read -r add_first_client
if [[ "$add_first_client" =~ ^[Yy]$ ]]; then
add_client
fi
else
print_status "WireGuard е вече инсталиран."
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")
fi
# Главен цикъл на менюто
while true; do
show_menu
read -r choice
case $choice in
1)
add_client
;;
2)
show_status
;;
3)
show_qr_code
;;
4)
show_client_config
;;
5)
print_status "Изход от скрипта."
break
;;
*)
print_warning "Невалидна опция. Моля, изберете 1-5."
;;
esac
echo ""
echo "Натиснете Enter за да продължите..."
read -r
done
}
# Стартиране на скрипта
main "$@"
1 | #!/bin/bash |
2 | |
3 | # WireGuard автоматична инсталация и настройка за Proxmox Ubuntu контейнер |
4 | # Скрипт за инсталиране на WireGuard, генериране на ключове и настройка на клиенти |
5 | # Автор: Федя Серафиев |
6 | |
7 | set -e |
8 | |
9 | # Цветове за по-добро визуализиране |
10 | RED='\033[0;31m' |
11 | GREEN='\033[0;32m' |
12 | YELLOW='\033[1;33m' |
13 | BLUE='\033[0;34m' |
14 | NC='\033[0m' # No Color |
15 | |
16 | # Функция за печатане на цветни съобщения |
17 | print_status() { |
18 | echo -e "${GREEN}[INFO]${NC} $1" |
19 | } |
20 | |
21 | print_warning() { |
22 | echo -e "${YELLOW}[WARNING]${NC} $1" |
23 | } |
24 | |
25 | print_error() { |
26 | echo -e "${RED}[ERROR]${NC} $1" |
27 | } |
28 | |
29 | print_header() { |
30 | echo -e "${BLUE}================================${NC}" |
31 | echo -e "${BLUE}$1${NC}" |
32 | echo -e "${BLUE}================================${NC}" |
33 | } |
34 | |
35 | # Проверка дали скриптът се изпълнява като root |
36 | check_root() { |
37 | if [[ $EUID -ne 0 ]]; then |
38 | print_error "Този скрипт трябва да се изпълнява като root!" |
39 | exit 1 |
40 | fi |
41 | } |
42 | |
43 | # Инсталиране на WireGuard и необходими пакети |
44 | install_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 |
63 | get_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 | # Генериране на сървърски ключове |
100 | generate_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 | # Настройка на сървърския конфигурационен файл |
117 | setup_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] |
128 | PrivateKey = $SERVER_PRIVATE_KEY |
129 | Address = 10.8.0.1/24 |
130 | ListenPort = 51820 |
131 | SaveConfig = true |
132 | PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE |
133 | PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o $INTERFACE -j MASQUERADE |
134 | |
135 | EOF |
136 | |
137 | print_status "Сървърската конфигурация е създадена." |
138 | else |
139 | print_status "Сървърската конфигурация вече съществува." |
140 | fi |
141 | } |
142 | |
143 | # Активиране на IP forwarding |
144 | enable_ip_forwarding() { |
145 | print_status "Активиране на IP forwarding..." |
146 | echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf |
147 | sysctl -p |
148 | } |
149 | |
150 | # Стартиране на WireGuard службата |
151 | start_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 | # Функция за генериране на клиентски конфигурации |
167 | generate_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] |
183 | PrivateKey = $CLIENT_PRIVATE_KEY |
184 | Address = $CLIENT_IP/32 |
185 | DNS = 8.8.8.8, 1.1.1.1 |
186 | |
187 | [Peer] |
188 | PublicKey = $SERVER_PUBLIC_KEY |
189 | Endpoint = $SERVER_IP:51820 |
190 | AllowedIPs = 0.0.0.0/0 |
191 | PersistentKeepalive = 25 |
192 | EOF |
193 | |
194 | print_status "Клиентската конфигурация е създадена: $CLIENT_CONFIG" |
195 | |
196 | # Добавяне на клиента към сървърската конфигурация |
197 | cat >> /etc/wireguard/wg0.conf << EOF |
198 | |
199 | # Client: $client_name |
200 | [Peer] |
201 | PublicKey = $CLIENT_PUBLIC_KEY |
202 | AllowedIPs = $CLIENT_IP/32 |
203 | EOF |
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 | # Функция за добавяне на нов клиент |
228 | add_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 | # Функция за показване на статуса |
256 | show_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 | # Главно меню |
272 | show_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 код |
285 | show_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 | # Функция за показване на конфигурация |
301 | show_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 | # Главна функция |
320 | main() { |
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 | # Стартиране на скрипта |
383 | main "$@" |