#!/usr/bin/env bash set -euo pipefail WG_INTERFACE="wg0" WG_CONF="/etc/wireguard/${WG_INTERFACE}.conf" WG_DIR="/etc/wireguard" CLIENT_DIR="${WG_DIR}/clients" SERVER_PORT="51820" DEFAULT_ENDPOINT="37.26.136.232" SERVER_VPN_IP="10.9.0.1" VPN_SUBNET_PREFIX="10.9.0" START_HOST="2" END_HOST="254" USE_IPV6="0" IPV6_PREFIX="fd05:13:53::" umask 077 die() { echo "Ошибка: $*" >&2 exit 1 } need_cmd() { command -v "$1" >/dev/null 2>&1 || die "Не найдена команда: $1" } usage() { cat < "$CLIENT_PUBKEY_FILE" wg genpsk > "$CLIENT_PSK_FILE" chmod 600 "$CLIENT_PRIVKEY_FILE" "$CLIENT_PUBKEY_FILE" "$CLIENT_PSK_FILE" CLIENT_PRIVATE_KEY="$(cat "$CLIENT_PRIVKEY_FILE")" CLIENT_PUBLIC_KEY="$(cat "$CLIENT_PUBKEY_FILE")" CLIENT_PRESHARED_KEY="$(cat "$CLIENT_PSK_FILE")" if command -v wg >/dev/null 2>&1 && wg show "$WG_INTERFACE" >/dev/null 2>&1; then SERVER_PUBLIC_KEY="$(wg show "$WG_INTERFACE" public-key)" else SERVER_PUBLIC_KEY="$(wg pubkey < <(grep '^PrivateKey *= *' "$WG_CONF" | head -n1 | awk -F'=' '{gsub(/ /,"",$2); print $2}'))" fi TMP_PEER_FILE="$(mktemp)" trap 'rm -f "$TMP_PEER_FILE"' EXIT { echo echo "### Client ${CLIENT_NAME}" echo "[Peer]" echo "PublicKey = ${CLIENT_PUBLIC_KEY}" echo "PresharedKey = ${CLIENT_PRESHARED_KEY}" if [[ "$USE_IPV6" == "1" ]]; then echo "AllowedIPs = ${CLIENT_IPV4}/32,${CLIENT_IPV6}/128" else echo "AllowedIPs = ${CLIENT_IPV4}/32" fi } > "$TMP_PEER_FILE" cat "$TMP_PEER_FILE" >> "$WG_CONF" if [[ "$USE_IPV6" == "1" ]]; then CLIENT_ADDRESS="${CLIENT_IPV4}/32,${CLIENT_IPV6}/128" CLIENT_ALLOWED_IPS="0.0.0.0/0,::/0" else CLIENT_ADDRESS="${CLIENT_IPV4}/32" CLIENT_ALLOWED_IPS="0.0.0.0/0" fi cat > "$CLIENT_CONF" </dev/null 2>&1; then echo "QR-код для клиента:" qrencode -t ansiutf8 < "$CLIENT_CONF" echo else echo "Пакет qrencode не установлен, QR-код не напечатан." echo "Установить можно так:" echo " sudo apt update && sudo apt install -y qrencode" echo fi echo "Проверка:" echo " sudo wg show ${WG_INTERFACE}" echo echo "Передать клиенту файл:" echo " ${CLIENT_CONF}"