Files
keenetic_ssh-web/tunnel/server-install.sh
Андрей Бобырев d90f7e9709 tunnel: server-install ставит ACCEPT для wg0 в INPUT поверх существующих DROP
На VPS часто стоит iptables -A INPUT -p icmp --icmp-type 8 -j DROP
(блокировка внешних ping-ов). Это правило применяется ко всем
интерфейсам, включая wg0, и глушит ping через туннель — handshake
идёт, а ICMP пакеты внутри wg0 пропадают.

Решаем точечно: вставляем `iptables -I INPUT 1 -i wg0 -j ACCEPT`
перед всеми DROP-правилами. Внешняя защита остаётся как была,
а трафик внутри туннеля ничем не блокируется. Дополнительно
сохраняем правило (netfilter-persistent / iptables-save), чтобы
переживало ребут.
2026-04-26 12:21:10 +03:00

103 lines
4.1 KiB
Bash
Executable File
Raw Permalink 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
# iptables: разрешаем весь трафик с wg0 ДО любых DROP-правил (часто на VPS
# стоит блокировка ICMP echo-request — она блокирует и пинги через туннель).
if command -v iptables >/dev/null 2>&1; then
iptables -C INPUT -i "$WG_IF" -j ACCEPT 2>/dev/null \
|| iptables -I INPUT 1 -i "$WG_IF" -j ACCEPT
# Сохранить, если установлен iptables-persistent
if command -v netfilter-persistent >/dev/null 2>&1; then
netfilter-persistent save >/dev/null 2>&1 || true
elif [ -d /etc/iptables ]; then
iptables-save > /etc/iptables/rules.v4 2>/dev/null || true
fi
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 "============================================================"