Files
keenetic_ssh-web/tunnel/server-install.sh
Андрей Бобырев 677fcc604a tunnel: ufw allow on wg0 + клиент по умолчанию маршрутит только VPS (/32)
После handshake траффик упирался в UFW на сервере (открывали только
51820/udp, не сам интерфейс wg0). Добавляем `ufw allow in/out on wg0`
в server-install.sh — теперь ICMP/HTTP/SSH внутри туннеля проходят.

На клиенте AllowedIPs по умолчанию = 10.99.0.1/32 (только сам VPS),
а не /24. Это устраняет возможный конфликт с существующими маршрутами
для 10.99.0.0/24, если у Keenetic другие WG-интерфейсы используют ту
же подсеть. Hub-and-spoke (роутер→VPS) — типичный сценарий, /32
достаточно. Кому нужен peer-to-peer через хаб — WG_SUBNET=10.99.0.0/24.
2026-04-26 12:09:43 +03:00

90 lines
3.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# tunnel/server-install.sh — установка WireGuard-сервера на Ubuntu VPS.
# Поднимает wg0 (UDP 51820, подсеть 10.99.0.0/24) и ставит утилиту kssh-tun
# для добавления/удаления клиентов с генерацией ENV-блока для роутера.
set -e
WG_PORT="${WG_PORT:-51820}"
WG_SUBNET_PREFIX="${WG_SUBNET_PREFIX:-10.99.0}"
WG_SERVER_LAST_OCTET="${WG_SERVER_LAST_OCTET:-1}"
WG_SERVER_IP="${WG_SUBNET_PREFIX}.${WG_SERVER_LAST_OCTET}"
WG_SERVER_CIDR="${WG_SERVER_IP}/24"
WG_DIR="/etc/wireguard"
WG_IF="wg0"
KSSH_REPO="${KSSH_REPO:-andrey271192/keenetic_ssh-web}"
KSSH_BRANCH="${KSSH_BRANCH:-main}"
RAW="https://raw.githubusercontent.com/${KSSH_REPO}/${KSSH_BRANCH}/tunnel"
if [ "$(id -u)" -ne 0 ]; then
echo "Запустите через sudo." >&2
exit 1
fi
echo "==> apt: wireguard wireguard-tools curl"
DEBIAN_FRONTEND=noninteractive apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq wireguard wireguard-tools iproute2 curl
mkdir -p "$WG_DIR" "$WG_DIR/peers"
chmod 700 "$WG_DIR"
# Серверные ключи (один раз)
if [ ! -s "$WG_DIR/server_private.key" ] || [ ! -s "$WG_DIR/server_public.key" ]; then
echo "==> Генерация ключей сервера"
umask 077
wg genkey | tee "$WG_DIR/server_private.key" | wg pubkey > "$WG_DIR/server_public.key"
fi
# Сохраняем параметры запуска (используется kssh-tun для регенерации конфига)
cat > "$WG_DIR/.kssh-tun.env" <<EOF
WG_PORT=$WG_PORT
WG_IF=$WG_IF
WG_SUBNET_PREFIX=$WG_SUBNET_PREFIX
WG_SERVER_IP=$WG_SERVER_IP
WG_SERVER_CIDR=$WG_SERVER_CIDR
WG_DIR=$WG_DIR
KSSH_REPO=$KSSH_REPO
KSSH_BRANCH=$KSSH_BRANCH
EOF
chmod 600 "$WG_DIR/.kssh-tun.env"
# Установка утилиты kssh-tun (peer management)
echo "==> Установка /usr/local/bin/kssh-tun"
if [ -f "$(dirname "$0")/kssh-tun" ]; then
install -m 755 "$(dirname "$0")/kssh-tun" /usr/local/bin/kssh-tun
else
curl -fsSL "$RAW/kssh-tun" -o /usr/local/bin/kssh-tun
chmod 755 /usr/local/bin/kssh-tun
fi
# Сборка wg0.conf из server-ключа + всех peer-файлов
/usr/local/bin/kssh-tun _regen
# Включить и запустить
systemctl enable "wg-quick@${WG_IF}" >/dev/null 2>&1 || true
systemctl restart "wg-quick@${WG_IF}"
# UFW: открываем UDP-порт WG и ВЕСЬ трафик внутри туннеля (на самом wg0).
# Без второго правила handshake пройдёт, а ping/HTTP внутри wg0 будут глохнуть.
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q "Status: active"; then
ufw allow "${WG_PORT}/udp" >/dev/null 2>&1 || true
ufw allow in on "$WG_IF" >/dev/null 2>&1 || true
ufw allow out on "$WG_IF" >/dev/null 2>&1 || true
fi
PUB_IP="$(curl -s4 ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')"
SERVER_PUB="$(cat "$WG_DIR/server_public.key")"
echo
echo "============================================================"
echo "WireGuard сервер готов."
echo " Endpoint: ${PUB_IP}:${WG_PORT}/udp"
echo " PublicKey: ${SERVER_PUB}"
echo " Server IP: ${WG_SERVER_IP}"
echo
echo "Добавление клиента (peer):"
echo " sudo kssh-tun add <name> # выдаст ENV-блок для роутера"
echo " sudo kssh-tun list"
echo " sudo kssh-tun show <name>"
echo " sudo kssh-tun remove <name>"
echo "============================================================"